ggplot2:用于表示单个观察值的点和用于表示均值和sd的条形图

时间:2017-03-12 23:57:17

标签: r plot ggplot2 errorbar

我想建立一个如下图:

enter image description here

其中各个观察结果表示为点,每个组的平均值表示为线段,另外两个段表示平均值+/- 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")

2 个答案:

答案 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") 

enter image description here

您实际上可以通过拨打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")