2014-09-23 157 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幾何更容易使用)。

相關問題