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)
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?
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_bar
ggplot 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.
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")
)
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)