2010-09-01 265 views
20

Soy un novato con ggplot2 y tengo una pregunta sobre la generación de un diagrama de barras apiladas. Revisé el libro y la página web dedicada, pero no puedo resolver el problema. Tengo dos factores, uno de los cuales tiene 2 niveles (presencia-ausencia), los otros 10 niveles. Vamos a llamar a estos dos "variable" y "fruta".Gráfico de barras apiladas en R (ggplot2) con eje y barras como porcentaje de recuentos

Me gustaría crear un diagrama de barras apiladas donde cada barra refleja un tipo de fruta y el número de observaciones de presencia-ausencia en "variable" se superpone una encima de la otra. Esto es relativamente fácil (vea el código para el diagrama 1 a continuación), pero también me gustaría que las barras y el eje y expresen el número de conteos de presencia-ausencia en "variable" como un porcentaje. En otras palabras, todas las barras deben tener la misma altura (lo que refleja un total de 100%) y los recuentos de observaciones de presencia-ausencia deben convertirse en porcentajes.

Puedo cambiar la escala del eje y a un porcentaje usando ..count .. * 100/sum (.. count ..) pero no puedo entender cómo convertir las barras reales. Creé otra trama con facetas (código para la gráfica 2 a continuación) que logra lo que quiero en términos de porcentajes, pero preferiría las dos barras una encima de la otra. ¿Alguien tiene una idea de cómo lograr esto? He proporcionado datos ficticios y ejemplos reproducibles. Gracias por cualquier ayuda.

Steve

dat <- data.frame(fruit=c("Apple", "Apple", "Orange", "Orange", "Orange", "Orange", 
        "Orange", "Pear", "Pear", "Pear"), variable=c("Present", "Absent", 
        "Present", "Present", "Present", "Present", "Absent", "Absent", 
        "Absent", "Present")) 

# stacked bar plot 
ggplot(dat, aes(x = fruit, fill = variable)) + 
    geom_bar(aes(y = ..count..*100/sum(..count..))) + 
    xlab("Fruit") + 
    ylab("Would like this to be percentage") + 
    scale_fill_manual("Condition", values = alpha(c("firebrick", "dodgerblue4"), 1)) 

enter image description here

# with faceting 
ggplot(dat, aes(x = variable, fill = variable)) + 
    geom_bar(aes(y = ..count..*100/sum(..count..))) + 
    facet_grid(. ~ fruit) + 
    xlab("Fruit") + 
    ylab("Would like this to be percentage") + 
    scale_fill_manual("Condition", values = alpha(c("firebrick", "dodgerblue4"), 1)) 

enter image description here

Respuesta

24

Para el primer gráfico, sólo tiene que añadir la posición = 'llenar' a su línea geom_bar!. En realidad no necesita escalar los conteos ya que ggplot tiene una forma de hacerlo automáticamente.

ggplot(dat, aes(x = fruit)) + geom_bar(aes(fill = variable), position = 'fill') 
+0

Gracias Ramnath, eso es exactamente lo que necesito para las barras. Cuando hago eso, sin embargo, las etiquetas del eje y vuelven a una escala de 0 a 1. Me gustaría que tuvieran de 0 a 100. Incluir y = .. cuenta .. * 100 o y = ... densidad ... * 100 en "aes" no parece funcionar. ¿Algunas ideas? – Steve

+4

'+ scale_y_continuous (" ", formatter =" percent ")'. El '' '' inicial se deshace de la etiqueta de "conteo", pero puede incluir cualquier etiqueta que desee. – James

+0

Muchas gracias James, eso funciona a la perfección. – Steve

Cuestiones relacionadas