2010-03-07 7 views
20

Ich habe eine R-Funktion, die 95% Vertrauensellipsen für Streudiagramme erzeugt. Die Ausgabe sieht wie folgt aus, für jede Ellipse einen Standardwert von 50 Punkten (50 Zeilen):Wie kann eine Datenellipse einem ggplot2-Streudiagramm überlagert werden?

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

Ich mag würde eine Reihe solcher Ellipsen für jede Ebene eines Faktors ‚Standort‘ auf einem ggplot2 aufgerufen superimpose Scatterplot, von diesem Befehl erzeugt:

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

dieses auf einem Datensatz ausgeführt wird, genannt dflat, die wie folgt aussieht:

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 

Das Ergebnis ist in Ordnung, aber wenn ich versuche, die Ellipse hinzufügen (lassen Sie uns für diese eine Seite sagen, genannt „Buhlen“):

> 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])) 

ich eine Fehlermeldung erhalten: "Error in data.frame(x = c(0.0977338099339815, 0.0844334944904515, 0.0697467834016782, : arguments imply differing number of rows: 50, 211

Ich habe es geschafft, dieses Problem zu beheben in die Vergangenheit, aber ich kann mich nicht erinnern, wie. Es scheint, dass sich geom_path auf die gleichen Punkte verlässt, anstatt neue zu zeichnen. Jede Hilfe wäre willkommen.

+0

Did erstellen Sie versuchen, den Standardwert von 50 Punkten auf 211 zu ändern? Funktioniert es? Möglicherweise müssen Sie Ihrer Funktion ein weiteres Argument hinzufügen (die Anzahl der Punkte) –

+0

Hallo, danke für die schnelle Antwort. Die Funktion kann die Anzahl der Punkte ändern, und ich habe es mit 211 Punkten versucht. Es erzeugt einen seltsamen, sehr dicken Kreis. Ich denke, es ist nicht Teil der Daten zuallererst, und es sollte in der Lage sein, es mit 50 Punkten zu plotten - zumindest aus der Dokumentation, können Sie verschiedene Datensätze auf der gleichen Handlung verwenden, so natürlich, unterschiedliche Anzahlen von Punkten sein sollte ok auch. – radu

+0

wird es für uns viel einfacher, wenn Sie ein minimal reproduzierbares Beispiel liefern. – xiechao

Antwort

23

Vielleicht könnte dies Ihnen helfen:

#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) 

Ausgabe sieht wie folgt aus:

enter image description here

Here ist komplexeres Beispiel.

+0

Wenn die Farbe ausgeschaltet ist, kann ein ungerades Verhalten auftreten.Insbesondere ohne "color = ..." im Plotaufruf ist eine Linie zwischen den Kanten der Ellipsen gezeichnet. Dies kann vermieden werden mit 'group = group' (unter Verwendung des ungültigen Variablennamens). – sautedman

20

Keelan Evanini, Ingrid Rosenfelder und Josef Frühwald ([email protected]) eine ggplot2 Stat Implementierung eines 95% Konfidenzintervall Ellipsen erstellt haben (und einen einfacheren Weg, Ellipsen in ggplot2 plotten):

GitHub stat-ellipse.R

their site

Sie können es als verwenden:

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

Um die Daten

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

Es scheint, dass die neue Version von ggplot2 stat_ellipse kaputt gemacht hat, da sie bestimmte andere Ansätze zugunsten von S3 allmählich veraltet. –

+3

Ich habe ein Update erstellt, das jetzt in der Antwort gefunden wird. –

+0

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