ggplot2 - 堆叠具有不同响应变量但相同x变量的图形

时间:2016-09-14 07:51:17

标签: r ggplot2 facet-wrap

我有一个由3个连续响应变量和2个分类预测变量组成的数据框。我一直在为每个响应变量建模,但使用相同的预测变量。我想用相同的x轴制作3个条形图,但每个响应变量。获得类似facet_wrap之类的格式会很不错,因为每个图形都不需要自己的x轴。我附上了一些示例数据,还有一些代码显示了我生成的图表之一。

y1<-sample(1:150, 100, replace=T)
y2<-sample(1:150, 100, replace=T)
y3<-sample(1:150, 100, replace=T)
x1<-sample(x=c("Site1", "Site2"), size=100, replace=T, prob=rep(1/2,2))
x2<-sample(x=c("A", "B", "C", "D"), size=100, replace=T, prob=rep(1/4,4))

df<-data.frame(y1,y2,y3,x1,x2)

ggplot(df, aes(x=x2, y=y1, fill=x1))

y1sum<-summarySE(df, measurevar="y1", groupvars=c("x1", "x2"))


ggplot(y1sum, aes(x=x2, y=y1, fill=x1)) + geom_bar(position=position_dodge(),     
stat="identity") + geom_errorbar(aes(ymin=y1-ci, ymax=y1+ci), width=.2, 
position=position_dodge(.9))

所以我想获得上面的图表,但是对于每个响应变量并且堆叠在彼此之上。

顺便说一句,我也非常欣赏如何在每组条形图上方添加一些字母以显示哪些字母明显不同的指导。

summarySE函数基于此处的代码 http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
    library(plyr)

    # New version of length which can handle NA's: if na.rm==T, don't count them
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }

    # This does the summary. For each group's data frame, return a vector with
    # N, mean, and sd
    datac <- ddply(data, groupvars, .drop=.drop,
      .fun = function(xx, col) {
        c(N    = length2(xx[[col]], na.rm=na.rm),
          mean = mean   (xx[[col]], na.rm=na.rm),
          sd   = sd     (xx[[col]], na.rm=na.rm)
        )
      },
      measurevar
    )

    # Rename the "mean" column    
    datac <- rename(datac, c("mean" = measurevar))

    datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean

    # Confidence interval multiplier for standard error
    # Calculate t-statistic for confidence interval: 
    # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
    ciMult <- qt(conf.interval/2 + .5, datac$N-1)
    datac$ci <- datac$se * ciMult

    return(datac)
}

提前感谢能够提供建议的任何人。

1 个答案:

答案 0 :(得分:1)

我使用了dplyr而不是你使用的summarySE函数

library(dplyr)
test <- df %>% gather(., key="var", value="value", -x1, -x2) %>%
  group_by(x1,x2,var) %>% summarise(N=n(), 
                                    Mean = mean(value), 
                                    sd= sd(value),
                                    se = sd/sqrt(N),
                                    ci = qnorm(0.975)*se) %>% ungroup

以下代码创建了一列由地点着色的条形图,并由变量分割。

test %>%  ggplot(., aes(x=x2, y=Mean, fill=x1)) +
  geom_bar(position=position_dodge(), stat="identity") + 
  geom_errorbar(aes(ymin=Mean-ci, ymax=Mean+ci), width=.2,position=position_dodge(.9)) +
  facet_wrap(~var, ncol = 1)

使用箱形图可能值得考虑,因为它们经常传达有关数据集的更多信息而不是条形图。

df %>% gather(., key="var", value="value", -x1, -x2) %>% 
  ggplot(., aes(x=x2, y=value, fill=x1)) +geom_boxplot() +
  facet_wrap(~var, ncol = 1)