KANG1943 楼上两位的答案已经完美解决了问题。如果一定要沿用原先的思路,那么针对你的三个提问回答如下:
- 为什么循环中生成的所有对象p1,p2,p3,p4,除了图标题外,均被赋予了最后一个图的值?
如 tctcab 所言,使用 aes_string(x = j, y = i)
,而不是aes(x=mydata[,j],y=mydata[,i])
。
- 在最后一句拼图的命令中,“p1,p2,p3,p4”除了一个个打上去,是否有更快的方法?
将四个图保存到一个 list 里,然后用 Rmisc::multiplot
函数作图。
- 这种情况下如何编辑坐标轴标题和项目标签?
labs()
函数就可以啊。
综上,代码修改如下:
library(ggplot2)
p <- list()
for (i in c("Y1", "Y2")) {
for (j in c("X1", "X2")) {
p <- c(p,
list(ggplot(mydata) +
geom_boxplot(aes_string(x = j, y = i)) +
labs(title = paste(i, "-", j, sep = ""))))
}
}
Rmisc::multiplot(plotlist = p, layout = matrix(1:4, nrow = 2))
也可以用 mapply()
来代替循环函数:
# 构建作图函数
myplot <- function(j, i) {
ggplot(mydata) +
geom_boxplot(aes_string(x = j, y = i)) +
labs(title = paste(i,"-", j, sep = ""), x = j, y = i)
}
# 批量生成 list
p <- mapply(myplot, i = c("Y1","Y2","Y2","Y1"), j = c("X1","X2"), SIMPLIFY = FALSE)
# 作图
Rmisc::multiplot(plotlist = p, layout = matrix(1:4, nrow = 2))
另外,Liechi 的方案可以一气呵成啊:
library(ggplot2)
library(tidyr)
data.frame("Y1"=rnorm(20),
"Y2"=runif(20, min=10, max=20),
"X1"=rep(LETTERS[1:4],each=5),
"X2"=rep(c("t1","t2","t3","t4","t5"),4)) %>%
gather("Ys", "Y", 1:2) %>%
gather("Xs", "X", 1:2) %>%
ggplot(aes(X, Y)) + geom_boxplot() + facet_grid(Ys ~ Xs, scales = "free")