web-dev-qa-db-fra.com

Comment ajouter des étiquettes de pourcentage ou de compte au-dessus du graphique à barres de pourcentage?

En utilisant ggplot2 1.0.0, J'ai suivi les instructions ci-dessous pour comprendre comment tracer des tracés de barre de pourcentage sur plusieurs facteurs:

Somme des pourcentages pour chaque facette - respectez "remplir"

test <- data.frame(
     test1 = sample(letters[1:2], 100, replace = TRUE), 
     test2 = sample(letters[3:8], 100, replace = TRUE)
     )
library(ggplot2)
library(scales)
ggplot(test, aes(x= test2, group = test1)) + 
geom_bar(aes(y = ..density.., fill = factor(..x..))) + 
facet_grid(~test1) +
scale_y_continuous(labels=percent)

enter image description here

Cependant, je n'arrive pas à obtenir une étiquette pour le nombre total ou le pourcentage au-dessus de chaque graphique à barres lors de l'utilisation de geom_text.

Quel est le bon ajout au code ci-dessus qui préserve également le pourcentage d'axe y?

30
alxlvt

En restant dans ggplot, vous pourriez essayer

ggplot(test, aes(x= test2,  group=test1)) + 
  geom_bar(aes(y = ..density.., fill = factor(..x..))) +
  geom_text(aes( label = format(100*..density.., digits=2, drop0trailing=TRUE),
                 y= ..density.. ), stat= "bin", vjust = -.5) +
  facet_grid(~test1) +
  scale_y_continuous(labels=percent)

Pour les nombres, remplacez ..densité .. par ..count .. dans geom_bar et geom_text

MISE À JOUR pour ggplot 2.x

ggplot2 2.0 a apporté de nombreuses modifications à ggplot dont une qui a cassé la version originale de ce code en modifiant la fonction par défaut stat utilisée par geom_barggplot 2.0. . Au lieu d'appeler stat_bin, comme précédemment, pour regrouper les données, il appelle maintenant stat_count pour compter les observations à chaque emplacement. stat_count renvoie prop comme la proportion des comptes à cet emplacement plutôt que density.

Le code ci-dessous a été modifié pour fonctionner avec cette nouvelle version de ggplot2. J'ai inclus deux versions, qui affichent toutes deux la hauteur des barres en pourcentage du nombre. Le premier affiche la proportion du nombre au-dessus de la barre en pourcentage tandis que le second affiche le nombre au-dessus de la barre. J'ai également ajouté des étiquettes pour l'axe y et la légende.

  library(ggplot2)
  library(scales)
#
# Displays bar heights as percents with percentages above bars
#
    ggplot(test, aes(x= test2,  group=test1)) + 
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
    geom_text(aes( label = scales::percent(..prop..),
                   y= ..prop.. ), stat= "count", vjust = -.5) +
    labs(y = "Percent", fill="test2") +
    facet_grid(~test1) +
    scale_y_continuous(labels=percent)
#
# Displays bar heights as percents with counts above bars
#
    ggplot(test, aes(x= test2,  group=test1)) + 
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
    geom_text(aes(label = ..count.., y= ..prop..), stat= "count", vjust = -.5) +
    labs(y = "Percent", fill="test2") +
    facet_grid(~test1) +
    scale_y_continuous(labels=percent)

L'intrigue de la première version est présentée ci-dessous.

enter image description here

45
WaltS

C'est plus facile à faire si vous pré-résumez vos données. Par exemple:

library(ggplot2)
library(scales)
library(dplyr)

set.seed(25)
test <- data.frame(
  test1 = sample(letters[1:2], 100, replace = TRUE), 
  test2 = sample(letters[3:8], 100, replace = TRUE)
)

# Summarize to get counts and percentages
test.pct = test %>% group_by(test1, test2) %>%
  summarise(count=n()) %>%
  mutate(pct=count/sum(count)) 

ggplot(test.pct, aes(x=test2, y=pct, colour=test2, fill=test2)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ test1) +
  scale_y_continuous(labels=percent, limits=c(0,0.27)) + 
  geom_text(data=test.pct, aes(label=paste0(round(pct*100,1),"%"),
                               y=pct+0.012), size=4)

(Pour info, vous pouvez également placer les étiquettes à l'intérieur de la barre, par exemple, en remplaçant la dernière ligne de code par: y=pct*0.5), size=4, colour="white"))

enter image description here

15
eipi10

J'ai utilisé tout votre code et je l'ai trouvé. Attribuez d'abord votre ggplot à une variable, c'est-à-dire p <- ggplot (...) + geom_bar (...) etc. Ensuite, vous pouvez le faire. Vous n'avez pas besoin de résumer beaucoup car ggplot a une fonction de construction qui vous donne déjà tout cela. Je vous laisse le soin de la mise en forme et autres. Bonne chance.


    dat <- ggplot_build(p)$data %>% ldply() %>% select(group,density) %>% 
       do(data.frame(xval = rep(1:6, times = 2),test1 = mapvalues(.$group, from = c(1,2), to = c("a","b")), density = .$density))

    p + geom_text(data=dat, aes(x = xval, y = (density + .02), label = percent(density)), colour="black", size = 3)

enter image description here

5
miles2know