在堆积条形图(ggplot2)内标记所选百分比值

时间:2013-11-15 21:53:50

标签: r ggplot2

我想在堆积条形图上放置百分比标签。但是,我只想为每个条形标记最大的3个百分比。我在SO上发了很多有用的帖子(例如:123),这是我迄今为止所取得的成就:

library(ggplot2)
groups<-factor(rep(c("1","2","3","4","5","6","Missing"),4))
site<-c(rep("Site1",7),rep("Site2",7),rep("Site3",7),rep("Site4",7))
counts<-c(7554,6982, 6296,16152,6416,2301,0,
          20704,10385,22041,27596,4648, 1325,0,
          17200, 11950,11836,12303, 2817,911,1,
          2580,2620,2828,2839,507,152,2)
tapply(counts,site,sum)
tot<-c(rep(45701,7),rep(86699,7), rep(57018,7), rep(11528,7))
prop<-sprintf("%.1f%%", counts/tot*100)

data<-data.frame(groups,site,counts,prop)

ggplot(data, aes(x=site, y=counts,fill=groups)) + geom_bar()+
  stat_bin(geom = "text",aes(y=counts,label = prop),vjust = 1) +
  scale_y_continuous(labels = percent)

我想在此输入我的输出图像,但似乎没有足够的声誉......但上面的代码应该能够生成情节。

那么我怎样才能在每个栏上标出最大的3个百分比?另外,对于图例,我可以更改类别的顺序吗?比如说&#34; Missing&#34;一开始。这不是一个大问题,但对于我的真实数据集,图例中类别的顺序真的困扰我。

我是这个网站的新手,所以如果有任何不清楚我的问题,请告诉我,我会解决它。我感谢任何回答/评论!谢谢!

1 个答案:

答案 0 :(得分:1)

我是以一种黑客的方式做到这一点的。它并不那么优雅。

无论如何,我使用了plyr包,因为split-apply-combine策略似乎是这里的方法。

我使用变量perc重新创建了数据框,表示每个网站的百分比。然后,对于每个网站,我只保留prop的3个最大值,并将其余值替换为""

# I added some variables, and added stringsAsFactors=FALSE
data <- data.frame(groups, site, counts, tot, perc=counts/tot,
                   prop, stringsAsFactors=FALSE)

# Load plyr
library(plyr)
# Split on the site variable, and keep all the other variables (is there an
# option to keep all variables in the final result?)
data2 <- ddply(data, ~site, summarize, 
               groups=groups,
               counts=counts, 
               perc=perc,
               prop=ifelse(perc %in% sort(perc, decreasing=TRUE)[1:3], prop, ""))

# I changed some of the plotting parameters
ggplot(data2, aes(x=site, y=perc, fill=groups)) + geom_bar()+
  stat_bin(geom = "text", aes(y=perc, label = prop),vjust = 1) +
  scale_y_continuous(labels = percent)

enter image description here

编辑:看起来你的原始绘图代码中的刻度是错误的。它给我的结果在y轴上有7500000%,这对我来说似乎有点不对......

编辑:我修复了代码。