2014-03-06 184 views
7

下面是使用GGPLOT2我想修改,以適應我的問題產生箱線圖一碼生成在GGPLOT2箱線圖:使用匯總統計

library(ggplot2) 
set.seed(1) 
# create fictitious data 
a <- rnorm(10) 
b <- rnorm(12) 
c <- rnorm(7) 
d <- rnorm(15) 

# data groups 
group <- factor(rep(1:4, c(10, 12, 7, 15))) 

# dataframe 
mydata <- data.frame(c(a,b,c,d), group) 
names(mydata) <- c("value", "group") 

# function for computing mean, DS, max and min values 
min.mean.sd.max <- function(x) { 
    r <- c(min(x), mean(x) - sd(x), mean(x), mean(x) + sd(x), max(x)) 
    names(r) <- c("ymin", "lower", "middle", "upper", "ymax") 
    r 
} 

# ggplot code 
p1 <- ggplot(aes(y = value, x = factor(group)), data = mydata) 
p1 <- p1 + stat_summary(fun.data = min.mean.sd.max, geom = "boxplot") + ggtitle("Boxplot con media, 95%CI, valore min. e max.") + xlab("Gruppi") + ylab("Valori") 

在我來說,我沒有實際數據點,而只是它們的平均值和標準偏差(數據通常是分佈式的)。所以對於這個例子,它將是:

mydata.mine = data.frame(mean = c(mean(a),mean(b),mean(c),mean(d)),sd = c(sd(a),sd(b),sd(c),sd(d)),group = c(1,2,3,4)) 

但是我仍然想製作一個boxplot。我想定義的: YMIN =平均 - 3 * SD 低=平均值 - SD 平均=平均 上=平均值+ SD
YMAX =平均+ 3 * SD

,但我不知道該怎麼定義一個函數,可以從stat_summary的fun.data中訪問mydata.mine的mean和sd。或者,我可以使用rnorm從我用平均值和sd參數化的正常值中抽取點,但第一個選項在我看來似乎更加優雅和簡單。

回答

17
ggplot(mydata.mine, aes(x = as.factor(group))) + 
    geom_boxplot(aes(
     lower = mean - sd, 
     upper = mean + sd, 
     middle = mean, 
     ymin = mean - 3*sd, 
     ymax = mean + 3*sd), 
    stat = "identity") 

enter image description here