Come disegnare poligoni puliti attorno alle regioni scatterplot in ggplot2 [chiuso]


32

Come faccio ad aggiungere un poligono pulito attorno a un gruppo di punti su un diagramma a dispersione? Sto usando ggplot2 ma sono deluso dai risultati di geom_polygon.

Il set di dati è , come file di testo delimitato da tabulazioni. Il grafico seguente mostra due misure di atteggiamenti nei confronti della salute e della disoccupazione in diversi paesi:

grafico a dispersione con densità2d

Vorrei passare da geom_density2dquello meno elegante ma empiricamente più corretto geom_polygon. Il risultato sui dati non ordinati è inutile:

inserisci qui la descrizione dell'immagine

Come posso disegnare poligoni 'puliti' che si comportano come percorsi di contorno attorno ai valori min-max yx? Ho provato a ordinare i dati senza risultati.

Codice:

print(fig2 <- ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
geom_point() + geom_density2d(alpha=.5) + labs(x = "Efficiency", y = "Mandate"))

L' doggetto si ottiene con questo file CSV .

Soluzione:

Grazie a Wayne , Andy W e altri per i loro suggerimenti! I dati, il codice e i grafici sono stati pubblicati su GitHub . Il risultato è simile al seguente:

risultato


6
Il termine che potresti cercare è lo scafo convesso dei punti (o potenzialmente lo scafo alfa). Dovresti essere in grado di trovare una funzione R per calcolarli e quindi di poterli aggiungere come livelli al grafico.
Andy W,

Grazie per aver indicato la terminologia corretta! Ho fallito per l'uso ?chullcon ggplot2finora. Non sono sicuro di codificarlo correttamente e spero che qualcuno l'abbia già fatto.
P.

Potresti aggiungere il tuo codice R alla domanda?
Yuriy Petrovskiy,

Una cosa da notare: ciò che stai visualizzando sono i massimi, che possono essere "valori anomali". Credo che il pacchetto R funzioni in modo alphahullsimile alla ricerca dello scafo convesso, ma ti consente di regolarlo verso l'interno / verso l'esterno per provare a fare qualcosa come gli intervalli di confidenza.
Wayne,

@Wayne, uno scafo alfa non è un intervallo di confidenza (in alcun modo immaginabile). Vedi questa domanda gis.se per una breve descrizione e alcuni riferimenti su cosa sia uno scafo alfa. Forse il tuo pensiero di ellissi bivariate di fiducia, o forse persino di baguette (grafici a scatole bi-variabili per identificare i valori anomali).
Andy W,

Risposte:


33

Con alcuni google ho trovato il sito web di Gota Morota che ha un esempio di farlo già sul suo sito web . Di seguito è riportato l'esempio esteso ai tuoi dati.

inserisci qui la descrizione dell'immagine

library(ggplot2)
work <- "E:\\Forum_Post_Stuff\\convex_hull_ggplot2"
setwd(work)

#note you have some missing data
mydata <- read.table(file = "emD71JT5.txt",header = TRUE, fill = TRUE)
nomissing <- na.omit(mydata) #chull function does not work with missing data

#getting the convex hull of each unique point set
df <- nomissing
find_hull <- function(df) df[chull(df$eff, df$man), ]
hulls <- ddply(df, "issue", find_hull)

plot <- ggplot(data = nomissing, aes(x = eff, y = man, colour=issue, fill = issue)) +
geom_point() + 
geom_polygon(data = hulls, alpha = 0.5) +
labs(x = "Efficiency", y = "Mandate")
plot

Grazie, revisionerò il codice di conseguenza. Sfortunatamente, il tuo file di immagine non sembra caricarsi qui, ma il codice è lì.
P.

@Fr. , Qual è esattamente il problema?
Andy W,

@AndyW Sfortunatamente, il codice non supporta i valori mancanti e non ho trovato il modo di modificarlo per farlo.
P.

@Fr., Come si desidera gestire esattamente i valori dei dati mancanti oltre a eliminare tali osservazioni? Qualsiasi ragionevole tecnica di imputazione comporterebbe che i punti si trovassero all'interno degli scafi convessi delle osservazioni non mancanti.
Andy W,

@AndyW Voglio dire che l' NAuccisione della chullfunzione. Mi aspetterei che lo ignori, ma non riesce a farlo e non ho trovato il modo di usarlo na.omit()per farlo funzionare. Sono sicuro che è possibile, semplicemente non ho le capacità di hacking per andare oltre la soluzione precedente.
P.

8

Se capisco il tuo problema, stai cercando lo scafo convesso di healthe di unemployment. Probabilmente ci sono diversi pacchetti per farlo in R, uno dei quali è pacchetto geometry. Immagino che i punti siano ordinati in ordine attorno al perimetro, ma dovresti verificarlo.

EDIT: ecco un esempio, che non usa ggplot, ma spero sia utile. L'esempio nella chulldocumentazione sembra essere sbagliato, il che potrebbe farti perdere:

X <- matrix(rnorm(2000), ncol = 2)
X.chull <- chull (X)
X.chull <- c(X.chull, X.chull[1])
plot (X)
lines (X[X.chull,])

EDIT 2: OK, ecco qualcosa che usa ggplot2. Trasformiamo Xin a data.framecon variabili xe y. Poi:

library(ggplot2)
X <- as.data.frame(X)
hull <- chull(X)
hull <- c(hull, hull[1])
ggplot(X, aes(x=x, y=y)) + geom_polygon(data=X[hull,], fill="red") + geom_point()

Nota che geom_pointsta usando data ( X) e aes dal ggplot, mentre lo sto sovrascrivendo in geom_polygon.

Per ottenerlo completamente, dovresti inserire xey per lo scafo per entrambi i problemi bar, usando una terza colonna issueper differenziarli.


Corretto sullo scafo convesso. Ho provato a utilizzare chullper generare lo scafo convesso ma non sono riuscito a utilizzare i risultati con ggplot2.
P.

@Fr .: ho fatto una rapida modifica della mia risposta. Vedi se questo ti mette sulla strada giusta.
Wayne,

Riesco a vedere come funziona da solo, ma mi chiedo come ottenere quest'ultima riga ggplot2.
P.

@Fr .: OK, che ne dici di adesso?
Wayne,

Ha funzionato! Grazie. Ho dovuto aggiungere na.omitper sbarazzarsi di NA che smette chulldi funzionare. Grazie ancora.
P.

5

A partire da questo pomeriggio, ho avvolto la chullfunzione all'interno di un pacchetto R come geom_convexhullfunzione.

Una volta caricato, il pacchetto può essere utilizzato come qualsiasi altro geom, nel tuo caso dovrebbe essere simile a:

ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
  geom_convexhull(alpha=.5) + 
  geom_point() + 
  labs(x = "Efficiency", y = "Mandate"))

Il pacchetto è disponibile su github: https://github.com/cmartin/ggConvexHull


Grazie mille per questo! Ero frustrato dall'output indesiderato quando provavo ad applicare chullun fattore di raggruppamento fino a quando non l'ho trovato.
jogall,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.