Je vais utiliser le jeu de données diamant de ggplot pour illustrer mon propos. Je veux dessiner un histogramme indiquant le prix, mais je veux afficher le nombre de chaque case pour chaque coupe .
ggplot(aes(x = price ) , data = diamonds_df) +
geom_histogram(aes(fill = cut , binwidth = 1500)) +
stat_bin(binwidth= 1500, geom="text", aes(label=..count..) ,
vjust = -1) +
scale_x_continuous(breaks = seq(0 , max(stores_1_5$Weekly_Sales) , 1500 )
, labels = comma)
voici mon intrigue actuelle
mais comme vous voyez le nombre indique le compte de toutes les coupes à chaque case, je veux afficher le compte de chaque coupure sur chaque case.
aussi un point de bonus si si je pouvais configurer l'axe Y au lieu d'afficher des nombres à l'étape de 5000 à autre chose, je peux le configurer manuellement
ggplot2
2.xVous pouvez maintenant centrer les étiquettes dans des barres empilées sans pré-récapituler les données à l'aide de position=position_stack(vjust=0.5)
. Par exemple:
ggplot(aes(x = price ) , data = diamonds) +
geom_histogram(aes(fill=cut), binwidth=1500, colour="grey20", lwd=0.2) +
stat_bin(binwidth=1500, geom="text", colour="white", size=3.5,
aes(label=..count.., group=cut), position=position_stack(vjust=0.5)) +
scale_x_continuous(breaks=seq(0,max(diamonds$price), 1500))
Vous pouvez obtenir les nombres pour chaque valeur de cut
en ajoutant cut
en tant qu'esthétique group
à stat_bin
. J'ai également déplacé binwidth
en dehors de aes
, ce qui faisait que binwidth
était ignoré dans votre code d'origine:
ggplot(aes(x = price ), data = diamonds) +
geom_histogram(aes(fill = cut ), binwidth=1500, colour="grey20", lwd=0.2) +
stat_bin(binwidth=1500, geom="text", colour="white", size=3.5,
aes(label=..count.., group=cut, y=0.8*(..count..))) +
scale_x_continuous(breaks=seq(0,max(diamonds$price), 1500))
Un problème avec le code ci-dessus est que je voudrais que les étiquettes soient centrées verticalement dans chaque section de barre, mais je ne sais pas comment faire cela dans stat_bin
, ou même si c'est possible. La multiplication par 0,8 (ou autre) déplace chaque étiquette d'une quantité relative différente. Donc, pour que les étiquettes soient centrées, j'ai créé un bloc de données séparé pour les étiquettes dans le code ci-dessous:
# Create text labels
dat = diamonds %>%
group_by(cut,
price=cut(price, seq(0,max(diamonds$price)+1500,1500),
labels=seq(0,max(diamonds$price),1500), right=FALSE)) %>%
summarise(count=n()) %>%
group_by(price) %>%
mutate(ypos = cumsum(count) - 0.5*count) %>%
ungroup() %>%
mutate(price = as.numeric(as.character(price)) + 750)
ggplot(aes(x = price ) , data = diamonds) +
geom_histogram(aes(fill = cut ), binwidth=1500, colour="grey20", lwd=0.2) +
geom_text(data=dat, aes(label=count, y=ypos), colour="white", size=3.5)
Pour configurer les pauses sur l’axe des y, ajoutez simplement scale_y_continuous(breaks=seq(0,20000,2000))
ou les pauses de votre choix.
Maintenant, avec les options de position_stack de GGPLOT 2.2.0, il est plus facile
library(ggplot2)
s <- ggplot(mpg, aes(manufacturer, fill = class))
s + geom_bar(position = "stack") +
theme(axis.text.x = element_text(angle=90, vjust=1)) +
geom_text(stat='count', aes(label=..count..), position = position_stack(vjust = 0.5),size=4)