web-dev-qa-db-fra.com

Créer un histogramme de densité dans ggplot2?

Je veux créer le prochain tracé de densité d'histogramme avec ggplot2. De manière "normale" (packages de base) est vraiment facile:

set.seed(46)
vector <- rnorm(500)  
breaks <- quantile(vector,seq(0,1,by=0.1))
labels = 1:(length(breaks)-1)
den = density(vector)
hist(df$vector,
     breaks=breaks,
     col=Rainbow(length(breaks)),
     probability=TRUE)
lines(den)

enter image description here

Avec ggplot, j'y suis parvenu jusqu'à présent:

seg <- cut(vector,breaks,
           labels=labels,
           include.lowest = TRUE, right = TRUE)
df = data.frame(vector=vector,seg=seg)

ggplot(df) + 
     geom_histogram(breaks=breaks,
                    aes(x=vector,
                        y=..density..,
                        fill=seg)) + 
     geom_density(aes(x=vector,
                      y=..density..))

Mais l'échelle "y" a la mauvaise dimension. J'ai noté que la prochaine exécution obtient la bonne échelle "y".

 ggplot(df) + 
     geom_histogram(breaks=breaks,
                    aes(x=vector,
                    y=..density..,
                    fill=seg)) + 
     geom_density(aes(x=vector,
                      y=..density..))

Je ne comprends tout simplement pas. y=..density.. est là, ça devrait être la hauteur. Alors pourquoi diable mon échelle se modifie quand j'essaye de la remplir?

J'ai besoin des couleurs. Je veux juste un histogramme où les coupures et les couleurs de chaque bloc sont définies directionnellement selon les couleurs de remplissage ggplot par défaut.

22
Usobi

Manuellement, j'ai ajouté des couleurs à vos barres de centile. Voyez si cela fonctionne pour vous.

library(ggplot2)

ggplot(df, aes(x=vector)) +   
   geom_histogram(breaks=breaks,aes(y=..density..),colour="black",fill=c("red","orange","yellow","lightgreen","green","darkgreen","blue","darkblue","purple","pink")) + 
   geom_density(aes(y=..density..)) +
   scale_x_continuous(breaks=c(-3,-2,-1,0,1,2,3)) +
   ylab("Density") + xlab("df$vector") + ggtitle("Histogram of df$vector") +
   theme_bw() + theme(plot.title=element_text(size=20),
                      axis.title.y=element_text(size = 16, vjust=+0.2),
                      axis.title.x=element_text(size = 16, vjust=-0.2),
                      axis.text.y=element_text(size = 14),
                      axis.text.x=element_text(size = 14),
                      panel.grid.major = element_blank(),
                      panel.grid.minor = element_blank())

enter image description here

22
Andre Silva

fill=seg entraîne le regroupement. Vous obtenez en fait un histogramme différent pour chaque valeur de seg. Si vous n'avez pas besoin des couleurs, vous pouvez utiliser ceci:

ggplot(df) + 
  geom_histogram(breaks=breaks,aes(x=vector,y=..density..), position="identity") + 
  geom_density(aes(x=vector,y=..density..))

enter image description here

Si vous avez besoin des couleurs, il peut être plus facile de calculer les valeurs de densité en dehors de ggplot2.

3
Roland

La confusion concernant l'interprétation du y-axis peut être dû à la densité plutôt qu'au nombre. Ainsi, les valeurs sur le y-axis sont les proportions de l'échantillon total, où la la somme des barres est égale à 1.

0
Iroise Dumontheil