ggplot2:点代表个体观察结果,条代表平均值和标准差

sam*_*m81 3 plot r ggplot2 errorbar

我想建立一个如下所示的情节:

在此输入图像描述

其中各个观察值表示为点,每组的平均值表示为线段,另外两个线段表示平均值+/-标准差。我能够使用下面的代码生成上面的图,该代码用于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")
Run Code Online (Sandbox Code Playgroud)

eip*_*i10 5

如果您不需要垂直误差线,则可以使用来计算摘要统计数据,但使用带有 Unicode 破折号字符的stat_summary点作为绘图标记。geom

例如,在下面的代码中,我们使用一次调用来stat_summary计算平均值并将其绘制为蓝色线段(通过使用大破折号作为点标记),并使用第二次调用来stat_summary计算 + 的位置/- 1sd 标记并将它们绘制为红色线段(再次使用大破折号)。"\U2014"是长破折号的 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") 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

实际上,您可以通过一次调用来摆脱困境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)) 
Run Code Online (Sandbox Code Playgroud)