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)
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: 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!
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! –