90 votes

Comment superposer des tracés de densité dans R?

Je voudrais superposer 2 tracés de densité sur le même appareil avec R. Comment puis-je faire cela ? J'ai cherché sur le net mais je n'ai pas trouvé de solution évidente.

Mon idée serait de lire les données d'un fichier texte (colonnes) puis d'utiliser

 plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)

Ou quelque chose dans cet esprit.

107voto

cbeleites Points 5667

utilisez lines pour le second :

 plot(density(MyData$Column1))
lines(density(MyData$Column2))

assurez-vous cependant que les limites de la première parcelle conviennent.

52voto

Chase Points 27342

ggplot2 est un autre package graphique qui gère des choses comme le problème de portée mentionné par Gavin d'une manière assez astucieuse. Il gère également la génération automatique de légendes appropriées et a généralement une sensation plus raffinée à mon avis avec moins de manipulation manuelle.

 library(ggplot2)

#Sample data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5))
                   , lines = rep(c("a", "b"), each = 100))
#Plot.
ggplot(dat, aes(x = dens, fill = lines)) + geom_density(alpha = 0.5)

entrez la description de l'image ici

24voto

Ajout d'une version graphique de base qui prend en charge les limites de l'axe y, ajoute des couleurs et fonctionne pour n'importe quel nombre de colonnes :

Si nous avons un ensemble de données :

 myData <- data.frame(std.nromal=rnorm(1000, m=0, sd=1),
                     wide.normal=rnorm(1000, m=0, sd=2),
                     exponent=rexp(1000, rate=1),
                     uniform=runif(1000, min=-3, max=3)
                     )

Puis pour tracer les densités :

 dens <- apply(myData, 2, density)

plot(NA, xlim=range(sapply(dens, "[", "x")), ylim=range(sapply(dens, "[", "y")))
mapply(lines, dens, col=1:length(dens))

legend("topright", legend=names(dens), fill=1:length(dens))

Qui donne:

entrez la description de l'image ici

13voto

joran Points 68079

Juste pour fournir un ensemble complet, voici une version de la réponse de Chase utilisant lattice :

 dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5))
                   , lines = rep(c("a", "b"), each = 100))

densityplot(~dens,data=dat,groups = lines,
            plot.points = FALSE, ref = TRUE, 
            auto.key = list(space = "right"))

ce qui produit une intrigue comme celle-ci : entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X