将组平均线添加到 geom_bar 图中并包含在图例中
Adding group mean lines to geom_bar plot and including in legend
我希望能够创建一个条形图,它还显示每组中条形的平均值。 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))
我希望情节看起来像这样,但也希望图例中的线条标记为 'mean of group' 或类似内容。
#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
的图例,您需要在 aes
中传递 colour
参数。
因为你只想要一个类别(这里是红色),所以我先创建了一个虚拟变量
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")
我希望能够创建一个条形图,它还显示每组中条形的平均值。 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))
我希望情节看起来像这样,但也希望图例中的线条标记为 'mean of group' 或类似内容。
#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
的图例,您需要在 aes
中传递 colour
参数。
因为你只想要一个类别(这里是红色),所以我先创建了一个虚拟变量
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")