2012-09-12 94 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本身! –