¿Cómo agregar tags de porcentaje o de conteo por encima de la gráfica de porcentaje de barras?

Usando ggplot2 1.0.0 , seguí las instrucciones en la siguiente publicación para descubrir cómo trazar plots de barras de porcentaje entre los factores:

Porcentajes de sum para cada faceta: respete el “relleno”

 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

Sin embargo, parece que no puedo obtener una etiqueta para el conteo total o el porcentaje sobre cada geom_text barras cuando uso geom_text .

¿Cuál es la adición correcta al código anterior que también conserva el porcentaje del eje y?

Al permanecer dentro de ggplot, puedes intentar

 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) 

Para los recuentos, cambie ..densidad … a … cuente .. en geom_bar y geom_text

ACTUALIZACIÓN para ggplot 2.x

ggplot2 2.0 realizó muchos cambios en ggplot incluido uno que rompió la versión original de este código cuando cambió la función de stat predeterminada utilizada por geom_bar ggplot 2.0.0 . En lugar de llamar a stat_bin , como antes, para stat_bin los datos, ahora llama a stat_count para contar las observaciones en cada ubicación. stat_count devuelve prop como la proporción de los recuentos en esa ubicación en lugar de la density .

El siguiente código se ha modificado para que funcione con esta nueva versión de ggplot2 . He incluido dos versiones, que muestran la altura de las barras como porcentaje de conteos. El primero muestra la proporción del conteo por encima de la barra como un porcentaje, mientras que el segundo muestra el conteo por encima de la barra. También agregué tags para el eje y la leyenda.

  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) 

La ttwig de la primera versión se muestra a continuación.

enter image description here

Esto es más fácil de hacer si resume previamente sus datos. Por ejemplo:

 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) 

(Para su información, también puede poner las tags dentro de la barra, por ejemplo, cambiando la última línea de código a esto: y=pct*0.5), size=4, colour="white") )

enter image description here

He usado todo tu código y se me ocurrió esto. Primero asigne su ggplot a una variable, es decir, p <- ggplot (...) + geom_bar (...) etc. Entonces podría hacer esto. No necesita resumir mucho ya que ggplot tiene una función de compilación que ya le proporciona todo esto. Te lo dejo para el formateo y tal. Buena suerte.

 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