web-dev-qa-db-fra.com

Histogramme ggplot: Affiche l'étiquette de décompte pour chaque bin pour chaque catégorie

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

enter image description here

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 

10
Nader Hisham

Mise à jour pour ggplot2 2.x

Vous 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))

Réponse originale

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))

enter image description here

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)

enter image description here

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.

15
eipi10

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)
0
Sant