Estoy trazando una variable categórica y en lugar de mostrar los recuentos para cada valor de categoría.
Estoy buscando una manera de ggplot
mostrar 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 como
qplot(mydataf) +
stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
scale_y_continuous(formatter = "percent")
pero debo usarlo incorrectamente, ya que obtuve 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 usaré enggplot
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()
entonces es claramente algo acerca de cómo ggplot
interactúa con un solo vector. Me estoy rascando la cabeza, buscar en Google ese error da un solo resultado .
Respuestas:
Desde que se respondió esto, ha habido algunos cambios significativos en la
ggplot
sintaxis. Resumiendo la discusión en los comentarios anteriores:Aquí hay un ejemplo reproducible usando
mtcars
:Esta pregunta es actualmente el éxito número 1 en Google para 'conteo de ggplot vs histograma de porcentaje', por lo que esperamos que esto ayude a destilar toda la información actualmente alojada en los comentarios sobre la respuesta aceptada.
Observación: si
hp
no se establece como factor, ggplot devuelve:fuente
percent
con el paquete de donde proviene para que funcione lo anterior (lo hice).ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = scales::percent)
geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]))
en su lugar. Cada faceta debe sumar 100%.este código modificado debería funcionar
si sus datos tienen NA y no desea que se incluyan en el diagrama, pase na.omit (mydataf) como argumento para ggplot.
espero que esto ayude.
fuente
formatter
argumento ya no funcionará. En cambio, querrás algo asílabels = percent_format())
.scales
biblioteca antes de usarlapercent_format()
, de lo contrario no funcionará. 0.9.0 ya no carga automáticamente los paquetes de soporte.? stat_bin
. Muestra qué columnas adicionales se agregan al marco de datos medianteggplot2
. Todas las columnas adicionales son de la forma..variable..
.aes(y = (..count..)/sum(..count..))
simplemente?aes(y = ..density..)
? Visualmente da una imagen muy similar (pero aún diferente)scales
biblioteca, luego usarscale_y_continuous(labels=percent)
como se menciona en los documentosCon ggplot2 versión 2.1.0 es
fuente
A partir de marzo de 2017, con
ggplot2
2.2.1 creo que la mejor solución se explica en el libro R de Hadley Wickham para ciencia de datos:stat_count
calcula dos variables:count
se usa de manera predeterminada, pero puede elegir usarprop
que muestre proporciones.fuente
fill
mapeo (no se produce ningún error, pero no se agrega color de relleno).group = 1
para obtener el mapeo de relleno. tal vez ayudagroup
parámetro, no muestra los porcentajes adecuados, ya que todo pertenece a su propio grupo para cada valor x único.Si desea porcentajes en el eje y etiquetados en las barras:
Al agregar las etiquetas de barra, es posible que desee omitir el eje y para un gráfico más limpio, agregando al final:
fuente
Si desea etiquetas de porcentaje pero Ns reales en el eje y, intente esto:
fuente
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 el gráfico.
Esta es la trama:
fuente
Tenga en cuenta que si su variable es continua, deberá usar geom_histogram (), ya que la función agrupará la variable por "bins".
fuente