Comment une ellipse de données peut-elle être superposée à un scatterplot ggplot2?
j'ai une fonction R qui produit des ellipses de confiance à 95% pour les nuages de diffusion. La sortie ressemble à ceci, ayant un défaut de 50 points pour chaque ellipse (50 lignes):
[,1] [,2]
[1,] 0.097733810 0.044957994
[2,] 0.084433494 0.050337990
[3,] 0.069746783 0.054891438
je voudrais superposer un certain nombre de telles ellipses pour chaque niveau d'un facteur appelé 'site' sur un ggplot2
scatterplot, produit à partir de cette commande:
> plat1 <- ggplot(mapping=aes(shape=site, size=geom), shape=factor(site)); plat1 + geom_point(aes(x=PC1.1,y=PC2.1))
ceci est exécuté sur un ensemble de données appelé dflat
qui ressemble à ceci:
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
le résultat est bon, mais quand j'essaie d'ajouter l'ellipse (disons pour ce site, appelé "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]))
je reçois un message d'erreur: "Error in data.frame(x = c(0.0977338099339815, 0.0844334944904515, 0.0697467834016782, :
arguments imply differing number of rows: 50, 211
j'ai réussi à corriger cela dans le passé, mais je ne me souviens pas comment. Il semble que geom_path compte sur les mêmes points plutôt que d'en tracer de nouveaux. Toute aide serait appréciée.
2 réponses
peut-être que cela pourrait vous aider:
#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)
ressemble à ceci:
ici est un exemple plus complexe.
Keelan Evanini, Ingrid Rosenfelder et Josef Fruehwald (JoFrhwld@gmail.com) ont créé une implémentation ggplot2 stat d'ellipses d'intervalle de confiance à 95% (et un moyen plus facile de tracer des ellipses dans ggplot2):
Vous pouvez l'utiliser comme:
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()
pour créer les données
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)