varias una tabla seleccionar poligono grafico graficas frecuencia filas extraer eliminar data contar columna barras r ggplot2

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



seleccionar filas en r (7)

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 aún 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 result .


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.


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 trama:


Con ggplot2 versión 2.1.0 es

+ scale_y_continuous(labels = scales::percent)


Dado que esto fue respondido, ha habido algunos cambios significativos en la sintaxis 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.9 # scale_y_continuous(labels = percent_format()) ## version 3.1.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_format()) #version 3.0.9 scale_y_continuous(labels = percent) #version 3.1.0

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:


Si desea etiquetas 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)


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

Al agregar las etiquetas 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() )


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 trama, pasa na.omit (mydataf) como argumento a ggplot.

espero que esto ayude.