将组平均线添加到geom_bar图并包含在图例中

时间:2017-01-10 13:16:50

标签: r ggplot2 geom-bar

我希望能够创建一个条形图,其中还显示了每个组中条形图的平均值。 AND显示图例中的平均值。

我已经能够使用下面的代码获得此图表条形图,这很好,但我希望能够看到图例中的平均线。

enter image description here

##The data to be graphed is the proportion of persons receiving a treatment
## (num=numerator) in each population (denom=demoninator). The population is 
##grouped by two age groups and (Age) and further divided by a categorical 
##variable V1

###SET UP DATAFRAME###
require(ggplot2)    
df <- data.frame(V1 = c(rep(c("S1","S2","S3","S4","S5"),2)), 
               Age= c(rep(70,5),rep(80,5)), 
               num=c(5280,6570,5307,4894,4119,3377,4244,2999,2971,2322),
               denom=c(9984,12600,9425,8206,7227,7290,8808,6386,6206,5227))

df$prop<-df$num/df$denom*100

PopMean<-sum(df$num)/sum(df$denom)*100

df70<-df[df$Age==70,]
group70mean<-sum(df70$num)/sum(df70$denom)*100

df80<-df[df$Age==80,]
group80mean<-sum(df80$num)/sum(df80$denom)*100

df$PopMean<-c(rep(PopMean,10))
df$groupmeans<-c(rep(group70mean,5),rep(group80mean,5))

我希望情节看起来像这样,但也希望图例中的线条被标记为“群体的意思”或类似情况。

 #basic plot
 P<-ggplot(df, aes(x=factor(Age), y=prop, fill=factor(V1))) +
   geom_bar(position=position_dodge(), colour='black',stat="identity")    

 P
####add mean lines    
P+geom_errorbar(aes(y=df$groupmeans, ymax=df$groupmeans, 
ymin=df$groupmeans), col="red", lwd=2)

添加show.legend = TRUE会将误差线叠加到因子图例上,而不是单独显示。如果有一种方法可以在图例中单独显示geom_errorbar,这可能是最简单的解决方案。

我也用geom_line尝试了各种各样的东西 下面的语法为总体平均值生成一条线,但是从每个点的中心开始,而不是覆盖条的宽度 这会为总体平均值生成一条线,它确实会产生一个图例,但会显示一条颜色而不是一条线。

P+geom_line(aes(y=df$PopMean, group=df$PopMean, color=df$PopMean),lwd=1)

如果我尝试为组进行线条意味着线条不可见(因为它们只是单点)。

P+geom_line(aes(y=df$groupmeans, group=df$groupmeans, color=df$groupmeans))

我也尝试用facet情节来解决这个问题,虽然这需要我假装我的分类变量是数字才能让它工作。

###set up new df
df2<-df
df2$V1<-c(rep(c(1,2,3,4,5),2))

P<-ggplot(df2, aes(x=factor(V1), y=prop, fill=factor(V1))) +
  geom_bar(position=position_dodge(),     
  colour='black',stat="identity",width=1)

P+facet_grid(.~factor(df2$Age))

P+facet_grid(.~factor(df2$Age))+geom_line(aes(y=df$groupmeans, 
group=df$groupmeans, color=df$groupmeans))

Facetplot

enter image description here

这允许我使用geom_line显示平均线,因此会出现一个图例(虽然它看起来不正确,显示颜色渐变而不是彩色线!)。但是,线条仍然没有达到条纹的整个宽度。此外,我的x轴现在需要重新标记以显示S1,S2等而不是数字1,2,3

总结一下 - 有没有办法在图例中单独显示错误条线?

如果没有,那么,如果我使用分面,如何使用分类变量校正图例外观和重新标记轴,并且可以使线条达到图的整个宽度?

或者是否有我缺少的替代解决方案??

由于

1 个答案:

答案 0 :(得分:3)

要获取geom_error的图例,您需要在colour中传递aes参数。 由于你只想要一个类别(这里是红色),我先创建一个虚拟变量

df$mean <- "Mean"
ggplot(df, aes(x=factor(Age), y=prop, fill=factor(V1))) +
  geom_bar(position=position_dodge(), colour='black',stat="identity") +
  geom_errorbar(aes (ymax=groupmeans, 
                ymin=groupmeans, colour=mean), lwd=2) +
  scale_colour_manual(name="",values = "#ff0000")

enter image description here