Créer un histogramme de densité dans ggplot2 ?
-
26-12-2019 - |
Question
Je veux créer le prochain tracé de densité d'histogramme avec ggplot2
.De la manière "normale" (packages de base), c'est vraiment simple :
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)
Avec ggplot, j'ai atteint ceci 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 » n’a pas la bonne dimension.J'ai remarqué que la prochaine exécution donne 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 ma balance se modifie-t-elle lorsque j'essaie de la remplir ?
J'ai besoin des couleurs.Je veux juste un histogramme où les sauts et les couleurs de chaque bloc sont définis de manière directionnelle en fonction des couleurs de remplissage ggplot par défaut.
La solution
Manuellement, j'ai ajouté des couleurs à vos barres de centiles.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())
Autres conseils
fill=seg
aboutit à un 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..))
Si vous avez besoin des couleurs, il peut être plus simple de calculer les valeurs de densité en dehors de ggplot2.
La confusion quant à l'interprétation du y-axis
cela pourrait être dû au fait que la densité est tracée plutôt que le nombre.Ainsi, les valeurs sur le y-axis
sont des proportions de l’échantillon total, où le la somme des barres est égale à 1
.