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

ggplot2 - stacking graphs with different response variables but same x variable

我有一个由 3 个连续响应变量和 2 个分类预测变量组成的数据框。我一直在分别对每个响应变量建模,但使用相同的预测变量。我想为每个响应变量制作 3 个具有相同 x 轴的条形图。获得类似 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)
}

提前感谢任何可以提供建议的人。

我使用了 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)