2010-03-07 22 views
20

Ho una funzione R che produce ellissi di confidenza del 95% per i grafici a dispersione. L'output è simile al seguente, avendo un valore predefinito di 50 punti per ogni ellisse (50 righe):Come si può sovrapporre un'ellisse di dati su un diagramma a dispersione ggplot2?

  [,1]   [,2] 
[1,] 0.097733810 0.044957994 
[2,] 0.084433494 0.050337990 
[3,] 0.069746783 0.054891438 

Vorrei sovrapporre un certo numero di tali ellissi per ogni livello di un fattore chiamato 'sito' su un ggplot2 grafico a dispersione, prodotta da questo comando:

> plat1 <- ggplot(mapping=aes(shape=site, size=geom), shape=factor(site)); plat1 + geom_point(aes(x=PC1.1,y=PC2.1)) 

questo viene eseguito su un set di dati, chiamato dflat che assomiglia a questo:

site  geom   PC1.1  PC2.1  PC3.1  PC1.2  PC2.2 
1 Buhlen 1259.5649 -0.0387975838 -0.022889782 0.01355317 0.008705276 0.02441577 
2 Buhlen 653.6607 -0.0009398704 -0.013076251 0.02898955 -0.001345149 0.03133990 

Il risultato è bene, ma quando provo ad aggiungere l'ellisse (diciamo per questo un sito, chiamato "Bühlen"):

> plat1 + geom_point(aes(x=PC1.1,y=PC2.1)) + geom_path(data=subset(dflat, site="Buhlen"),mapping=aes(x=ELLI(PC1.1,PC2.1)[,1],y=ELLI(PC1.1,PC2.1)[,2])) 

ricevo un messaggio di errore: "Error in data.frame(x = c(0.0977338099339815, 0.0844334944904515, 0.0697467834016782, : arguments imply differing number of rows: 50, 211

sono riuscito a risolvere questo problema in il passato, ma non riesco a ricordare come. Sembra che geom_path si basi sugli stessi punti invece di tracciarne di nuovi. Qualsiasi aiuto sarebbe apprezzato.

+0

Hai provato a modificare l'impostazione predefinita di 50 punti a 211? Funziona? Potrebbe essere necessario aggiungere un altro argomento alla funzione (il numero di punti) –

+0

Ciao, grazie per la rapida risposta. La funzione può cambiare il numero di punti, e l'ho provato con 211 punti. Produce uno strano cerchio molto spesso. Penso che non sia la sottomissione dei dati, prima di tutto, e dovrebbe essere in grado di tracciarli con 50 punti - almeno dalla documentazione, è possibile utilizzare diversi set di dati sullo stesso grafico, quindi naturalmente, diversi numeri di punti dovrebbero essere ok anche io – radu

+0

sarà molto più facile per noi se fornisci un esempio riproducibile minimo. – xiechao

risposta

23

Forse questo potrebbe aiutare:

#bootstrap 
set.seed(101) 
n <- 1000 
x <- rnorm(n, mean=2) 
y <- 1.5 + 0.4*x + rnorm(n) 
df <- data.frame(x=x, y=y, group="A") 
x <- rnorm(n, mean=2) 
y <- 1.5*x + 0.4 + rnorm(n) 
df <- rbind(df, data.frame(x=x, y=y, group="B")) 

#calculating ellipses 
library(ellipse) 
df_ell <- data.frame() 
for(g in levels(df$group)){ 
df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y), 
             scale=c(sd(x),sd(y)), 
             centre=c(mean(x),mean(y))))),group=g)) 
} 
#drawing 
library(ggplot2) 
p <- ggplot(data=df, aes(x=x, y=y,colour=group)) + geom_point(size=1.5, alpha=.6) + 
    geom_path(data=df_ell, aes(x=x, y=y,colour=group), size=1, linetype=2) 

uscita si presenta così:

enter image description here

Here è esempio più complesso.

+0

È possibile che si verifichi un comportamento anomalo se il colore è disattivato.Specificamente senza 'color = ...' nella chiamata plot, c'è una linea tracciata tra i bordi delle ellissi. Questo può essere evitato con 'group = group' (usando il nome della variabile infelice). – sautedman

20

Keelan Evanini, Ingrid e Josef Rosenfelder Fruehwald ([email protected]) hanno creato un'implementazione ggplot2 stat di una confidenza al 95% ellissi intervallo (e un modo più semplice per tracciare ellissi in ggplot2):

GitHub stat-ellipse.R

their site

si può usare come:

library(ggplot2) 
library(devtools) 
library(digest) 
source_url("https://raw.github.com/low-decarie/FAAV/master/r/stat-ellipse.R")  
qplot(data=df, x=x, y=y, colour=colour)+stat_ellipse() 

enter image description here

per creare i dati

set.seed(101) 
n <- 1000 
x <- rnorm(n, mean=2) 
y <- 1.5 + 0.4*x + rnorm(n) 
colour <- sample(c("first", "second"), size=n, replace=T) 
df <- data.frame(x=x, y=y, colour=colour) 
+0

Sembra che la nuova versione di ggplot2 abbia rotto stat_ellipse mentre gradualmente depreca alcuni altri approcci in favore di S3. –

+3

Ho creato una correzione che ora si trova nella risposta. –

+0

http://docs.ggplot2.org/dev/stat_ellipse.html – gkcn

Problemi correlati