voglio produrre una grafica che sembra qualcosa di simile:R trama percentuale accatastati bar con percentuale di fattore di binario e le etichette (con ggplot)
Il mio set di dati originale sembra qualcosa di simile:
> 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
Quindi l'idea è che le barre di visualizzazione in cui FIX = 1
per fattore QUANT
e per fattore IMG
.
ho aggregati i miei set di dati in percentuali utilizzando plyr
library(plyr)
bb.perc <- ddply(bb,.(QUANT,IMG),summarise,FIX.PROP = sum(FIX)/length(FIX))
Non quasi la cosa giusta:
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
Ma ora se faccio un grafico, non è così account per i casi FIX==0
, ovvero tutte le barre hanno la stessa altezza, vale a dire il 100%, che non è quello che voglio. Si noti come i singoli telai ausiliari QUANT non si sommano al 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
Il meglio che potessi fare con R è quello di visualizzare i conteggi:
# 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)
e si traduce in: Questo è anche non quello che voglio:
- La scala percentuale è lontana. Ho bisogno di un modo per passare il punto 100% alla funzione
percent
, ma non ho idea di come. - Manca le etichette.
ci sono una grande quantità di simili domande sul SO già, ma mi sembra di mancare la quantità sufficiente di intelligenza (o la comprensione di R) estrapolare da loro per una soluzione al mio problema particolare.
Grazie per qualsiasi suggerimento!
EDIT: Sven Hohenstein ha fornito una risposta già, ma ecco come ho finito per fare io stesso così:
> 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)
Utilizzando la bb.perc
che ho definito più in alto usando plyr
. Questo ha il vantaggio che le percentuali sono calcolate localmente per colonna, e non a livello globale.
Grazie a tutti per l'aiuto.I seguenti due domande e le loro rispettive risposte mi ha aiutato molto nel prendere le decisioni giuste:
Stacked Bar Graph Labels with ggplot2
Adding labels to ggplot bar chart
Quello che ho fatto di sbagliato inizialmente, era passare il parametro position = "fill"
a geom_bar()
, che per qualche motivo fatto tutte le barre hanno la stessa altezza!
Incredibile, grazie! In realta 'ero appena arrivato al punto in cui avevo anche la trama corretta, ma stavo usando il modo 'plyr' per farlo. Non sapevo che fosse possibile da dentro ggplot stesso! –