2013-11-15 120 views
2

我想在堆积条形图上放置百分比标签。不过,我只想标出每个酒吧的最大3个百分比。我经历了很多有用的帖子继续SO(例如:123),这里是我到目前为止已经完成:在堆积条形图内标记选定百分比值(ggplot2)

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) 

我想在这里插入我的输出图像,但不要” t似乎有足够的声誉......但上面的代码应该能够产生情节。

那么我怎样才能标出每个酒吧最大的3个百分点呢?另外,对于这个传说,我可以改变这些类别的顺序吗?例如,首先放置“丢失”。这不是一个大问题,但对于我的真实数据集来说,图例中类别的顺序真的让我困扰。

我是这个网站的新手,所以如果有什么不清楚我的问题,请让我知道,我会解决它。我很欣赏任何答案/评论!谢谢!

回答

1

我以某种怪异的方式做到了这一点。这不是那么优雅。

无论如何,我使用了plyr包,因为拆分应用组合策略似乎是要走到这里的路。

我用一个代表每个站点百分比的变量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%的结果,这对我来说似乎有点...

编辑:我修正了代码。