我希望能够创建一个条形图,该条形图还显示每个组中条形的平均值。AND显示图例中的平均值条。
我已经能够使用下面的代码来获得带有条形图的图表,这很好,但是我希望能够看到图例中的均线。
##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))
我还试图通过分面图来解决这个问题,尽管这要求我假装我的分类变量是数字的才能起作用。
###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))
小平面图
这使我可以使用geom_line显示平均线,因此确实会出现图例(尽管看起来不正确,显示的是颜色渐变而不是彩色的线条!)。但是,线条仍未达到条形图的整个宽度。另外,我的x轴现在需要重新标记以显示S1,S2等,而不是数字1,2,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")