2012-04-13 15 views
12

Uso de ggplot2 Estoy creando un histograma con un factor en el eje horizontal y otro factor para el color de relleno, utilizando una posición esquivada. Mi problema es que el factor de relleno a veces toma solo un valor por un valor del factor horizontal, y con nada que esquivar, la barra ocupa todo el ancho. ¿Hay alguna manera de evitar que esquive nada para que todos los anchos de barras sean iguales? ¿O lo que equivale a trazar los 0?¿Una forma de esquivar siempre un histograma?

Por ejemplo

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) + 
geom_histogram(position = "dodge") 

enter image description here

This answer tiene un par de ideas. También se preguntó antes de que se lanzara la nueva versión, entonces tal vez algo cambió? Usar facetas (también se muestra here) No me gusta para mi situación, aunque supongo que editar los datos y usar geom_bar podría funcionar, pero se siente poco elegante. Por otra parte, cuando traté facetear de todos modos

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) + 
    geom_bar() + facet_grid(~factor(carb)) 

consigo el error "Error en layout_base (datos, cols, gota = gota): Al menos una capa debe contener todas las variables utilizadas para facetear"

I supongo que podría generar una trama de datos de recuentos y luego usar geom_bar,

mtcounts <- ddply(subset(mtcars, select = c("carb", "gear")), 
    .fun = count, .variables = c("carb", "gear")) 

completando los niveles que no están presentes con 0 de. ¿Alguien sabe si eso funcionaría o si hay una manera mejor?

+2

Sé que usted no se considera que sea ideal, pero creo que antes de calcular el recuento y el uso de geom_bar sería mi forma preferida de hacer esto. – joran

Respuesta

11

Actualizadogeom_bar necesidades stat = "identity"

No estoy seguro de si esto es demasiado tarde para ti, pero veo la respuesta a un reciente post here Es decir, que tomaría el consejo de Joran calcular previamente los recuentos fuera de la llamada ggplot y para usar geom_bar. Al igual que con la respuesta a otra publicación, los recuentos se obtienen en dos pasos: primero, se obtiene una tabla de contingencia cruzada usando dcast; luego segundo, melt la tabla de contingencia.

library(ggplot2) 
library(reshape2) 

dat = dcast(mtcars, factor(carb) ~ factor(gear), fun.aggregate = length) 
dat.melt = melt(dat, id.vars = "factor(carb)", measure.vars = c("3", "4", "5")) 
dat.melt 

(p <- ggplot(dat.melt, aes(x = `factor(carb)`, y = value, fill = variable)) + 
    geom_bar(stat = "identity", position = "dodge")) 

El gráfico:

enter image description here

+0

¿También se debe adjuntar la imagen del resultado final? –

+0

He agregado el cuadro e hice un par de cambios editoriales para aclarar la respuesta. –

+0

¡Nunca es demasiado tarde! Gracias por expandir ese comentario en una respuesta completa. – Gregor

Cuestiones relacionadas