如何在R中的箱线图中绘制均值和标准误差

6
我有两个分类因素(“栖息地”和“所在地”)和一个连续变量(T)。 “栖息地”有两个水平,“所在地”有八个水平。我想将默认的箱线图须改为代表SE,并将每个箱线图的中位数改为均值。在绘制时,是否有一种同时考虑两个分类因素的方法?谢谢。
这是使用ggplot箱线图的默认设置所做的工作,显示第一个和第三个四分位数与中位数间隔。
ggplot(data,aes(x=Locality,y=T)) + 
  geom_boxplot(aes(fill=interaction(Habitat,Locality), 
                   group=interaction(factor(Habitat),Locality)),
               outlier.shape=1,outlier.size=3) + 
  theme_bw() + 
  theme(
    panel.grid.major=element_blank(),
    panel.grid.minor=element_blank(),
    axis.line=element_line(colour='black'),
    legend.position='none',
    axis.text.x=element_text(angle=90,hjust=1,size=12)) + 
  scale_y_continuous('T') + 
  xlab('Locality')
2个回答

11

首先编写一个函数来计算最小值、均值-1SEM、均值、均值+1SEM和最大值。然后使用stat_summary将这5个值映射到一个箱线图上。

library(gridExtra)
library(ggplot2)

MinMeanSEMMax <- function(x) {
  v <- c(min(x), mean(x) - sd(x)/sqrt(length(x)), mean(x), mean(x) + sd(x)/sqrt(length(x)), max(x))
  names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
  v
}

g1 <- ggplot(mtcars, aes(factor(am), mpg)) + geom_boxplot() +
  ggtitle("Regular Boxplot")

g2 <- ggplot(mtcars, aes(factor(am), mpg)) +
  stat_summary(fun.data=MinMeanSEMMax, geom="boxplot", colour="red") + 
  ggtitle("Boxplot: Min, Mean-1SEM, Mean, Mean+1SEM, Max")


grid.arrange(g1, g2, ncol=2)

输入图像描述


非常好的答案,谢谢。 如果你的x轴上有0A、0B、1A和1B这样的子组,你会怎么做呢? - Mehdi.K

4
我认为这是可能的,但是将放置一个红色八边形交通标志并写上“前方限速”会更加混乱。箱线图有一个标准定义,可以清晰地表示各部分的含义。当用户看到箱线图时,不需要做额外的思维活动来重新思考不同部分的含义。如果你不想使用这些标准总结的话,为什么不使用其他的图表表示呢? geom_crossbar或geom_errorbar函数/图表可能更适合您的显示(并且可能比尝试修改箱线图更容易使用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接