试图在for循环中列出ggplot对象;列表中的所有项都写为循环的最后一次迭代

时间:2018-03-08 21:50:08

标签: r ggplot2

我想构建一个ggplot对象列表。我想在x轴上绘制一个变量,但绘制y中数据框中的每个其他变量。当我运行循环时,我的所有值最终都与最后一个变量相同。

我希望使用grid.arrange函数在一个页面上绘制所有图形。

我的代表:

library(ggplot2)

 l <- list()
for(i in 2:11){
    p <- ggplot(mtcars, aes(x = mpg, y = mtcars[,i])) + geom_smooth() + geom_point()
    name <- paste("p",i,sep="_")
    tmp <- list(p)
    l[[name]] <- tmp
}
print(l$p_2)
print(l$p_3)

2 个答案:

答案 0 :(得分:2)

您可以使用sapply直接创建地块列表。例如:

plist = sapply(names(mtcars)[-grep("mpg", names(mtcars))], function(col) {
  ggplot(mtcars, aes_string(x = "mpg", y = col)) + geom_smooth() + geom_point()
}, simplify=FALSE)

列表元素(每个都是ggplot对象)将以图中的y变量命名:

names(plist)
[1] "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

您可以通过在控制台中键入plist来打印所有图表。或者,对于单个绘图,只需选择所需的绘图:

plist[["hp"]]

enter image description here

对于这种情况,您可能更喜欢分面,这需要将数据从宽格式转换为长格式。通过设置scales="free_y",您可以拥有具有不同y比例的构面。

library(tidyverse)

ggplot(gather(mtcars, key, value, -mpg), aes(mpg, value)) + 
  geom_smooth() + geom_point() +
  facet_wrap(~ key, scales="free_y", ncol=5)

enter image description here

答案 1 :(得分:0)

在调用ggplot之前对数据框进行子集,然后使用aes_string将列名称作为字符串调用。

library(ggplot2)

l <- list()
for(i in 2:11){
  temp <- mtcars[, c(1, i)]
  p <- ggplot(temp, aes_string(x = "mpg", y = names(temp)[2])) + geom_smooth() + geom_point()
  name <- paste("p",i,sep="_")
  tmp <- list(p)
  l[[name]] <- tmp
}
print(l$p_2)

enter image description here

print(l$p_3)

enter image description here