2012-09-12 614 views
17

quiero producir un gráfico que se ve algo como esto:R diagrama de barras porcentaje apilado con el porcentaje del factor binario y etiquetas (con ggplot)

enter image description here

Mi conjunto de datos original se ve algo como esto:

> bb[sample(nrow(bb), 20), ] 
     IMG QUANT FIX 
25663 1  1 0 
7936 2  2 0 
23586 3  2 0 
23017 2  2 1 
31363 1  3 1 
7886 2  2 0 
23819 3  3 1 
29838 2  2 1 
8169 2  3 1 
9870 2  3 0 
31440 2  1 0 
35564 3  1 0 
24066 1  2 0 
12020 3  2 0 
6742 3  2 0 
6189 2  3 0 
26692 2  3 0 
1387 3  2 0 
31839 2  3 1 
28637 3  2 0 

Así que la idea es que muestran los bares donde FIX = 1 por factor de QUANT y por factor de IMG.

he agregados mis conjunto de datos en porcentajes utilizando plyr

library(plyr) 
bb.perc <- ddply(bb,.(QUANT,IMG),summarise,FIX.PROP = sum(FIX)/length(FIX)) 

No casi lo correcto:

QUANT IMG FIX.PROP 
1  1 1 0.52439024 
2  1 2 0.19085366 
3  1 3 0.13658537 
4  2 1 0.20414201 
5  2 2 0.53964497 
6  2 3 0.09585799 
7  3 1 0.29000000 
8  3 2 0.13000000 
9  3 3 0.40705882 

Pero ahora si hago un gráfico, no lo hace cuenta para los casos FIX==0, es decir, todas las barras tienen la misma altura, a saber, 100%, que no es lo que quiero. Nótese cómo las subtramas QUANT individuales no suman el 100%:

> sum(bb.perc[1:3,]$FIX.PROP) 
[1] 0.8518293 
> sum(bb.perc[4:6,]$FIX.PROP) 
[1] 0.839645 
> sum(bb.perc[7:9,]$FIX.PROP) 
[1] 0.8270588 

Lo mejor que podía hacer con R es para mostrar el recuento:

# Take only the positive samples 
bb.pos <- bb[bb$FIX == 1,] 
# Plot the counts 
ggplot(bb,aes(factor(QUANT),fill=factor(IMG))) + geom_bar() + 
    scale_y_continous(labels=percent) 

y da como resultado: enter image description here Este es tampoco lo que quiero:

  • escala El porcentaje está muy lejos. Necesito una forma de pasar el 100% de punto a la función percent, pero no tengo idea de cómo.
  • Carece de las etiquetas.

Hay una gran cantidad de similares preguntas sobre SO ya, pero me parecen carecer la cantidad suficiente de inteligencia (o la comprensión de R) para extrapolar de ellos a una solución a mi problema en particular.

¡Gracias por cualquier puntero!

EDIT: Sven Hohenstein proporcionó una respuesta ya, pero aquí es como terminé haciendo yo mismo, así:

> ggplot(bb.perc,aes(x=factor(QUANT),y=FIX.PROP,label=paste(round(FIX.PROP*100), 
    "%"),fill=factor(IMG)))+ geom_bar(stat="identity") + geom_text(position="stack", 
    aes(ymax=1),vjust=5) + scale_y_continuous(labels = percent) 

Utilizando el bb.perc que he definido más arriba usando plyr. Este tiene la ventaja de que los porcentajes se calculan localmente por columna, y no en todo el mundo.

Gracias a todos por la ayuda.La siguiente dos preguntas y sus respectivas respuestas me ayudó mucho en hacer las cosas bien:

Stacked Bar Graph Labels with ggplot2

Adding labels to ggplot bar chart

lo que hice mal Inicialmente, se pasa el parámetro position = "fill" a geom_bar(), que por alguna razón hizo que todas las barras tengan la misma altura!

Respuesta

21

Esta es una manera de generar la trama:

ggplot(bb[bb$FIX == 1, ],aes(x = factor(QUANT), fill = factor(IMG), 
          y = (..count..)/sum(..count..))) + 
geom_bar() + 
stat_bin(geom = "text", 
      aes(label = paste(round((..count..)/sum(..count..)*100), "%")), 
      vjust = 5) + 
scale_y_continuous(labels = percent) 

Cambiar el valor del parámetro vjust para ajustar la posición vertical de las etiquetas.

enter image description here

+0

Increíble, gracias! De hecho, ahora mismo había llegado al punto en el que también tenía la trama correcta, pero estaba usando la forma 'plyr' para hacerlo. ¡No sabía que fuera posible desde dentro de ggplot! –

Cuestiones relacionadas