我有一个由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)