我想构建一个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)
答案 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"]]
对于这种情况,您可能更喜欢分面,这需要将数据从宽格式转换为长格式。通过设置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)
答案 1 :(得分:0)