具有不同响应变量但x变量相同的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)
}

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

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

相关内容

  • 没有找到相关文章

最新更新