2012-09-12 16 views
17

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)

enter image description here

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: enter image description here 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!

risposta

21

questo è un modo per generare 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) 

Modificare il valore del parametro vjust per regolare la posizione verticale delle etichette.

enter image description here

+0

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

Problemi correlati