Mostrar% en lugar de contar en tablas de variables categóricas

Estoy trazando una variable categórica y en lugar de mostrar los recuentos para cada valor de categoría.

Estoy buscando una forma de hacer que ggplot muestre el porcentaje de valores en esa categoría. Por supuesto, es posible crear otra variable con el porcentaje calculado y trazar esa, pero tengo que hacerlo varias docenas de veces y espero lograr eso en un solo comando.

Estaba experimentando con algo así como

 qplot(mydataf) + stat_bin(aes(n = nrow(mydataf), y = ..count../n)) + scale_y_continuous(formatter = "percent") 

pero debo usarlo incorrectamente, ya que tengo errores.

Para reproducir fácilmente la configuración, aquí hay un ejemplo simplificado:

 mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc"); mydataf <- factor(mydata); qplot (mydataf); #this shows the count, I'm looking to see % displayed. 

En el caso real, probablemente ggplot lugar de qplot , pero la forma correcta de usar stat_bin todavía me elude.

También probé estos cuatro enfoques:

 ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent'); ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') + geom_bar(); ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent'); ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') + geom_bar(); 

pero los 4 dan:

 Error: ggplot2 doesn't know how to deal with data of class factor 

El mismo error aparece para el caso simple de

 ggplot (data=mydataf, aes(levels(mydataf))) + geom_bar() 

por lo que es claramente algo sobre cómo ggplot interactúa con un solo vector. Me estoy rascando la cabeza, buscar en Google por ese error da un solo resultado .

Dado que esto fue respondido, ha habido algunos cambios significativos en la syntax de ggplot . Resumiendo la discusión en los comentarios anteriores:

  require(ggplot2) require(scales) p <- ggplot(mydataf, aes(x = foo)) + geom_bar(aes(y = (..count..)/sum(..count..))) + ## version 3.0.0 scale_y_continuous(labels=percent) 

Aquí hay un ejemplo reproducible usando mtcars :

  ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = percent) ## version 3.0.0 

enter image description here

Esta pregunta es actualmente el hit # 1 en google para 'ggplot count vs percentage histogram', así que con suerte esto ayuda a destilar toda la información actualmente alojada en los comentarios sobre la respuesta aceptada.

Observación: Si hp no está configurado como un factor, ggplot devuelve:

enter image description here

este código modificado debería funcionar

 p = ggplot(mydataf, aes(x = foo)) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') 

si tus datos tienen NA y no quieres que se incluyan en la ttwig, pasa na.omit (mydataf) como argumento a ggplot.

espero que esto ayude.

Con ggplot2 versión 2.1.0 es

 + scale_y_continuous(labels = scales::percent) 

A partir de marzo de 2017, con ggplot2 2.2.1 creo que la mejor solución se explica en la R de Hadley Wickham para el libro de ciencia de datos:

 ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1)) 

stat_count calcula dos variables: count se usa por defecto, pero puede optar por usar prop que muestra proporciones.

Si desea porcentajes en el eje y y etiquetados en las barras:

 library(ggplot2) library(scales) ggplot(mtcars, aes(x = as.factor(am))) + geom_bar(aes(y = (..count..)/sum(..count..))) + geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) + scale_y_continuous(labels = percent) + labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission") 

enter image description here

Al agregar las tags de la barra, es posible que desee omitir el eje y para obtener una tabla más clara, agregando al final:

  theme( axis.text.y=element_blank(), axis.ticks=element_blank(), axis.title.y=element_blank() ) 

enter image description here

Si desea tags de porcentaje pero N reales en el eje y, intente esto:

  library(scales) perbar=function(xx){ q=ggplot(data=data.frame(xx),aes(x=xx))+ geom_bar(aes(y = (..count..)),fill="orange") q=q+ geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen") q } perbar(mtcars$disp) 

Aquí hay una solución para los datos facetados. (La respuesta aceptada por @Andrew no funciona en este caso). La idea es calcular el valor porcentual usando dplyr y luego usar geom_col para crear la gráfica.

 library(ggplot2) library(scales) library(magrittr) library(dplyr) binwidth <- 30 mtcars.stats <- mtcars %>% group_by(cyl) %>% mutate(bin = cut(hp, breaks=seq(0,400, binwidth), labels= seq(0+binwidth,400, binwidth)-(binwidth/2)), n = n()) %>% group_by(cyl, bin) %>% summarise(p = n()/n[1]) %>% ungroup() %>% mutate(bin = as.numeric(as.character(bin))) ggplot(mtcars.stats, aes(x = bin, y= p)) + geom_col() + scale_y_continuous(labels = percent) + facet_grid(cyl~.) 

Esta es la ttwig:

enter image description here

Para quienes vengan a esto después de 2018, reemplacen “labels = percent_format ()” por “scales :: percent”