我想建立一个如下图:
其中各个观察结果表示为点,每个组的平均值表示为线段,另外两个段表示平均值+/- sd。我能够使用下面的代码生成上面的图,它使用geom_crossbar
绘制段。然而,这感觉更像是一个黑客。我是ggplot2
的新手,我想知道是否有更好的方法来实现我想要的目标。
library(ggplot2); library(dplyr)
theme_set(theme_bw(base_size=12, base_family="Helvetica"))
dat = data.frame(y=rnorm(10), treat=rep(c("A", "B"), each=5))
summData = dat %>% group_by(treat) %>% summarize(mean_y=mean(y), sd_y=sd(y))
summData$lower = summData$mean_y-summData$sd_y
summData$upper = summData$mean_y+summData$sd_y
mBarWidth = 0.5; sdBarWidth = 0.3
mBarSize = 2; sdBarSize = 0.8
barColor = adjustcolor("grey10", alpha.f=0.4)
p = ggplot()
p = p + geom_point(data=dat, aes(x=treat, y=y), color="skyblue")
p = p + geom_crossbar(data=summData, aes(x=treat, y=lower, ymin=lower, ymax=lower), width=sdBarWidth, color=barColor, fatten=1, size=sdBarSize)
p = p + geom_crossbar(data=summData, aes(x=treat, y=mean_y, ymin=mean_y, ymax=mean_y), width=mBarWidth, color=barColor, fatten=1, size=mBarSize)
p = p + geom_crossbar(data=summData, aes(x=treat, y=upper, ymin=upper, ymax=upper), width=sdBarWidth, color=barColor, fatten=1, size=sdBarSize)
p = p + xlab("Treatment") + ylab("Response")
答案 0 :(得分:3)
如果您不想要垂直错误栏行,可以使用stat_summary
计算摘要统计信息,但使用带有Unicode em短划线字符的点geom
作为绘图标记。
例如,在下面的代码中,我们使用一次调用stat_summary
来计算平均值并将其绘制为蓝线段(通过使用大型短划线作为点标记)和第二次调用到stat_summary
计算+/- 1sd标记的位置并将它们绘制成红线段(再次使用大的短划线)。 "\U2014"
是em破折号的Unicode代码。
set.seed(1)
dat = data.frame(y=rnorm(10), treat=rep(c("A", "B"), each=5))
ggplot(dat, aes(treat, y)) +
geom_point(color="skyblue") +
stat_summary(fun.y=mean, geom="point", shape="\U2014", size=9, colour="blue") +
stat_summary(fun.y=function(d) {mean(d) + sd(d)*c(-1,1)}, geom="point", shape="\U2014",
size=7, colour="red")
您实际上可以通过拨打stat_summary
来解决这个问题,但需要更多工作来指定点标记大小和颜色:
ggplot(dat, aes(treat, y)) +
geom_point(color="skyblue") +
stat_summary(fun.y=function(d) {mean(d) + sd(d)*c(-1,0,1)}, geom="point", shape="\U2014",
size=rep(c(7,9,7),2), colour=rep(c("red","blue","red"), 2))
答案 1 :(得分:1)
ggplot2中有一个内置的geom_errorbar
p = p + geom_errorbar(data=summData, aes(x=treat, ymin=lower, ymax=upper), width=sdBarWidth, color=barColor)
我将平均值绘制为下面的空心圆圈作为示例
p = p + geom_point(data=summData, aes(x=treat, y=mean_y), colour=barColor, size=3, shape=21, stroke=1, fill="white")