J'aurais besoin de créer (dans le cadre d'une appli shiny) des graphiques ggplot, avec la particularité que je ne connais pas d'avance le nombre de couches qui devront être ajoutées : cela dépendra du choix de l'utilisateur à travers l'interface, des données qui seront uploadées, etc.
J'essaie naïvement d'ajouter des couches avec une boucle for, mais je constate qu'en procédant ainsi, seule la dernière couche de la boucle est réellement tracée : les autres semblent se perdre dans la nature.
Un exemple bête reproductible avec les données des iris de Fisher : on essaie ici de tracer les barycentres de chaque espèce d'iris pour les variables x=Sepal.Length, y=Sepal.Width, puis d'y ajouter des ellipses de confiance, ainsi que des "moustaches" de longueur 1 écart-type autour des barycentres. Chaque "tour" de boucle for correspond à une espèce d'iris.
Code : Tout sélectionner
data(iris)
# On calcule les barycentres pour chaque espèce :
iris.summary <- aggregate(iris[,1:2], list(iris$Species), mean)
names(iris.summary)[1] <- "Species"
p <- ggplot(data=iris, mapping=aes_string(x="Sepal.Length", y="Sepal.Width", color="Species"))
# On ajoute les barycentres et les ellipses :
p <- p + geom_point(data=iris.summary, mapping=aes_string(x="Sepal.Length", y="Sepal.Width", color="Species"), shape=15, size=5)
p <- p + stat_ellipse()
# On essaie d'ajouter les "moustaches" pour chaque espèce :
for (k in 1:nlevels(iris$Species)) {
espece <- subset(iris, iris$Species==levels(iris$Species)[k]) # on ne considère que l'espèce numéro "k"
p <- p + geom_segment(aes(y=mean(espece[,2]), yend=mean(espece[,2]), x=mean(espece[,1])-sd(espece[,1]), xend=mean(espece[,1])+sd(espece[,1])))
p <- p + geom_segment(aes(x=mean(espece[,1]), xend=mean(espece[,1]), y=mean(espece[,2])-sd(espece[,2]), yend=mean(espece[,2])+sd(espece[,2])))
}
p
On voit bien ci-dessus que seule l'espèce virginica (la dernière) a eu droit à ses moustaches. Pourquoi ce comportement de ggplot ? Et comment procéder pour ajouter un nombre indéterminé de couches si une boucle for n'est pas la bonne solution ?
Merci !