尝试在for循环中创建ggplot对象列表;列表中的所有项都作为循环的最后一次迭代写入
我想建立一个ggplot对象列表。我想在x轴上绘制一个变量,但在y轴的数据框中绘制其他每个变量。当我运行循环时,我的所有值最终都与最后一个变量相同 我希望使用grid.arrange函数在一页上绘制所有图形 我的雷普雷克斯:尝试在for循环中创建ggplot对象列表;列表中的所有项都作为循环的最后一次迭代写入,r,ggplot2,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()
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)
库(ggplot2)
l在调用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)
您可以直接使用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)
您可以通过在控制台中键入plist
打印所有打印。或者,对于单个绘图,只需选择所需的绘图:
plist[["hp"]]
对于这种情况,您可能更喜欢刻面,这需要将数据从宽格式转换为长格式。通过设置scales=“free\u y”
,可以使镶嵌面具有不同的y比例
使用循环可能不是解决问题的最佳方法。最好描述你最初的问题,而不是你假设的问题解决方案。需要帮忙吗?我确实在前两句话中描述了我原来的问题。您发送的链接不相同。我不能在同一张图上绘图,因为我的变量具有独特的比例,就像在reprex中一样。我查看了facet_网格,但它使用了aes的静态值(y=)。这是我的tidyverse解决方案,我认为它比下面的解决方案干净得多,现在问题结束了
[1] "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
plist[["hp"]]
library(tidyverse)
ggplot(gather(mtcars, key, value, -mpg), aes(mpg, value)) +
geom_smooth() + geom_point() +
facet_wrap(~ key, scales="free_y", ncol=5)