2014-09-23 236 views
4

我有两个分类因子('Habitat'和'Locality')和一个连续变量(T)。 '人居'有两个层次,'地点'有八个层次。我想改变默认的胡须来表示SE,并且将中值转换为每个盒图的平均值。有没有办法做到这一点,并在绘图时考虑到两个分类因素?提前谢谢了。如何绘制R中的平均值和标准误差

这是我用boxplot 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') 

回答

10

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

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) 

enter image description here

+0

优秀的答案,谢谢。 你会如何去做同样的事情,但与子组?例如,如果您的x轴上有0A,0B,1A和1B? – 2018-02-13 10:28:44

3

我希望这是可能的,但它也可以把一个交通标志是一个红色的八角形,并说“限速提高进取”的,我希望这两个会更混乱的是有帮助的。 boxplot有部件代表的标准定义。当用户看到一个boxplot时,他们不应该通过额外的心理体操去重新思考不同部分的含义。如果您不想表示这些标准摘要,为什么不使用不同的表示形式? geom_crossbargeom_errorbar函数/ geoms可能更适合您的显示器(并且可能比尝试修改boxplot几何更容易使用)。

相关问题