在R中使用循环生成ggplot图形,无法查看及保存的问题
问题:循环生成ggplot图形后无法在环境中找到并后续操作
你在R中用循环生成多张ggplot图形后,发现这些图形没出现在工作环境里,没法后续展示或修改。你的示例代码如下:
db = data.frame(exposure = sample(1:100, 100), exposure2 = sample(-90:100,100), outcome = sample(200:1000,100)) exposure_vector = c("exposure","exposure2") exposure_title = c("Pesticide","Apple") for (i in 1:length(exposure_vector)) { current_exposure = db[[exposure_vector[i]]] title = exposure_title[i] graph_name = paste0(title,"_","Graph") graph_name=ggplot(db,aes(x=current_exposure,y=outcome))+geom_smooth()+ theme_bw()+ylab("outcome")+xlab("exposure")+ggtitle(title) print(graph_name) }
原因分析
- 循环里每次把ggplot对象赋值给
graph_name变量,每次循环都会覆盖这个变量,循环结束后环境里只会剩下最后一张图的对象。 - 一开始把
graph_name设为字符串(比如"Pesticide_Graph"),紧接着又把它赋值为ggplot对象,这步操作完全没用——字符串变量直接被覆盖,并没有把ggplot对象以这个字符串为名字保存到环境中。
解决方法
方法1:将图形保存到列表中(推荐)
把所有ggplot对象存入一个列表,后续可以通过列表索引调用任意图形,这是R中批量处理对象的标准做法:
library(ggplot2) db = data.frame(exposure = sample(1:100, 100), exposure2 = sample(-90:100,100), outcome = sample(200:1000,100)) exposure_vector = c("exposure","exposure2") exposure_title = c("Pesticide","Apple") # 创建空列表用于存储图形 graph_list = list() for (i in 1:length(exposure_vector)) { current_exposure = db[[exposure_vector[i]]] title = exposure_title[i] # 生成图形并存入列表 graph_list[[i]] = ggplot(db,aes(x=current_exposure,y=outcome))+ geom_smooth()+ theme_bw()+ ylab("outcome")+ xlab("exposure")+ ggtitle(title) # 打印图形 print(graph_list[[i]]) } # 后续调用示例:展示第一张图 graph_list[[1]] # 修改第二张图 graph_list[[2]] + theme(axis.text = element_text(size=12))
方法2:动态创建环境中的独立变量(不推荐)
如果你一定要让每个图形以独立变量名出现在环境中,可以用assign()函数把ggplot对象绑定到指定变量名上:
library(ggplot2) db = data.frame(exposure = sample(1:100, 100), exposure2 = sample(-90:100,100), outcome = sample(200:1000,100)) exposure_vector = c("exposure","exposure2") exposure_title = c("Pesticide","Apple") for (i in 1:length(exposure_vector)) { current_exposure = db[[exposure_vector[i]]] title = exposure_title[i] graph_name = paste0(title,"_","Graph") # 生成图形并赋值到指定变量名 assign(graph_name, ggplot(db,aes(x=current_exposure,y=outcome))+ geom_smooth()+ theme_bw()+ ylab("outcome")+ xlab("exposure")+ ggtitle(title)) # 打印图形 print(get(graph_name)) } # 后续直接调用变量名即可 Pesticide_Graph Apple_Graph
注意:这种动态创建变量的方式会让工作环境变得混乱,不利于代码维护,优先推荐用列表存储。
内容的提问来源于stack exchange,提问作者Sari Katish
相关产品推荐
相关产品推荐

