2012-09-12 139 views
17

我想產生一個圖形,看起來像這樣的標籤(與ggplot)的百分比:[R堆積百分比條形圖用二進制係數和

enter image description here

我的原始數據集看起來是這樣的:

> 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 

這樣的想法是,條顯示,其中每個因素QUANTFIX = 1每 因素IMG

我使用匯總plyr

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

幾乎正確的事情我的數據設置成百分比:

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 

但現在,如果我做一個曲線圖,它不佔FIX==0個案,即所有酒吧有相同的高度,即100%,這不是我想要的。注意看個人QUANT子加起來還不到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 

我能有R做的最好的是顯示計數:

# 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) 

和結果: enter image description here 這是也不是我想要的:

  • 百分比範圍是離開的。我需要一種方法將100%的點傳遞給 percent函數,但我不知道如何。
  • 它缺乏標籤。

有對類似的諸多問題SO了,但我似乎缺乏 智力足夠量(或R的理解),從他們推斷 來解決我的具體問題。

感謝您的指點!

編輯:斯文海恩斯坦已經給出了一個答案,但在這裏就是我終於實現了我自己,以及:

> 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) 

使用我進一步明確了使用plyrbb.perc。這一個具有 的優勢,即百分比是按本地每列計算的,而不是全局的 。

謝謝大家的幫助。將在得到它的權利大大以下兩個問題,它們各自 答案幫我:

Stacked Bar Graph Labels with ggplot2

Adding labels to ggplot bar chart

我沒有什麼錯最初,是position = "fill"參數傳遞給 geom_bar(),由於某種原因使所有酒吧都有相同的高度!

回答

21

這是爲了生成的情節的方式:

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) 

更改vjust參數的值來調整標籤的垂直位置。

enter image description here

+0

非常感謝!我其實剛剛就已經到了我有正確情節的地步,但我正在使用'plyr'的方式來做到這一點。我不知道它可能來自ggplot本身! –