2011-07-14 57 views
8

Tengo algunos problemas para hacer un gráfico de barras apiladas en ggplot2. Sé cómo hacer uno con barplot(), pero quería usar ggplot2 porque es muy fácil hacer que las barras tengan la misma altura (con 'position =' fill '', si no me equivoco).Hacer un gráfico de barras apiladas para múltiples variables - ggplot2 en R

Mi problema es que tengo múltiples variables que quiero graficar una encima de la otra; mis datos es el siguiente:

dfr <- data.frame(
    V1 = c(0.1, 0.2, 0.3), 
    V2 = c(0.2, 0.3, 0.2), 
    V3 = c(0.3, 0.6, 0.5), 
    V4 = c(0.5, 0.1, 0.7), 
    row.names = LETTERS[1:3] 
) 

Lo que quiero es una parcela con las categorías A, B y C en el eje X, y para cada una de ellas, los valores de V1, V2, V3 y V4 apiladas uno encima del otro en el eje Y. La mayoría de los gráficos que he visto trazan una sola variable en el eje Y, pero estoy seguro de que uno podría hacer esto de alguna manera.

¿Cómo podría hacer esto con ggplot2? ¡Gracias!

+0

+1 para agregar datos de muestra. Bienvenido a SO. – Andrie

+0

Si encontraste útil alguna de las respuestas, selecciona una como respuesta aceptada. –

Respuesta

15

Primero, algo de manipulación de datos. Agregue la categoría como una variable y fusione los datos a formato largo.

dfr$category <- row.names(dfr) 
mdfr <- melt(dfr, id.vars = "category") 

Ahora trama, utilizando la variable llamada variable para determinar el color de relleno de cada barra.

library(scales) 
(p <- ggplot(mdfr, aes(category, value, fill = variable)) + 
    geom_bar(position = "fill", stat = "identity") + 
    scale_y_continuous(labels = percent) 
) 

(EDIT:. Código actualiza para utilizar scales paquetes, según se requiera desde v0.9 ggplot2)

enter image description here

+0

+1 ¡Has vencido cuando estaba a punto de publicar lo mismo! –

+0

@lselzer, ¡las mentes geniales piensan igual! OMI, la próxima vez, no dude en publicar su respuesta, aunque sea muy similar. –

+0

¡Muchas gracias, Richie! Esto funciona para mí Sin embargo, tengo una pregunta: si la trazo con 'p <- ggplot (mdfr, aes (categoría, valor, fill = variable, posición =' fill ')) + + geom_bar()'; las barras no se extienden hacia arriba para tener la misma altura. ¿Debo hacer algo más para que la trama lo haga? ¡Gracias! – Annemarie

3

Con permiso para iniciar una nueva respuesta, mientras que en realidad sólo quiero añadir una comenta sobre la hermosa solución provista por @Richie. No tengo los puntos mínimos para publicar comentarios, así que aquí está mi caso:

El ... + geom_bar(position="fill") arrojó un error en mi trazado, estoy usando ggplot2 versión 0.9.3.1. y remodelar2 en lugar de remodelar para la fusión.

error_message: 
*Mapping a variable to y and also using stat="bin". 
    With stat="bin", it will attempt to set the y value to the count of cases in each group. 
    This can result in unexpected behavior and will not be allowed in a future version of ggplot2. 
    If you want y to represent counts of cases, use stat="bin" and don't map a variable to y. 
    If you want y to represent values in the data, use stat="identity". 
    See ?geom_bar for examples. (Deprecated; last used in version 0.9.2) 
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this. 
Error in pmin(y, 0) : object 'y' not found* 

Así que lo cambié a geom_bar(stat='identity') y funciona.

+0

¡Gracias por publicar esto, no pude encontrar la manera de solucionar este error! –

Cuestiones relacionadas