如何在函数内绘图?列表Data Frame批量绘图问题求助
问题解决方案
逐个问题分析与修复
1. 仅能绘制最后一个Data Frame
ggplot在批量绘图的非交互式场景中,必须显式调用print()函数才能输出图形。原代码注释掉了print(P),导致前面的图形未被渲染,仅保留了最后一次设备关闭前的操作。
2. 无法提取Data Frame的名称
用lapply遍历列表时,deparse(substitute(df))只能获取循环迭代的临时变量名(如X[[1]]),无法拿到列表元素的自定义名称。解决思路是同时遍历列表元素和对应名称,比如使用purrr::imap(),或者通过列表名称索引元素。
3. jpeg输出报错
原代码jpeg(paste(name) , ".jpg")参数传递错误:jpeg()第一个参数是完整文件名,第二个参数是宽度(数值类型),你把文件名拆成两个参数传入,导致第二个参数为字符串触发类型错误。需用paste0(name, ".jpg")拼接成完整文件名作为第一个参数。
修正后的完整代码(依赖purrr包)
library(ggplot2) library(purrr) L1 = data.frame(A = c(1:4) , B = c(1:4) , C = c(1:4)) L2 = data.frame(A = c(5:8) , B = c(8:11), G = c(1:4) ) L=list(L1,L2) names(L) = c('L1' , 'L2') MyPlot <- function(df, name){ jpeg(filename = paste0(name, ".jpg"), width = 800, height = 600) # 可自定义宽高 P = ggplot(df, aes(A , B)) + geom_point() print(P) # 必须显式打印图形 dev.off() } # imap自动传递列表元素和对应名称 Plot_jpeg = L %>% imap(MyPlot)
替代方案(不依赖purrr包)
library(ggplot2) L1 = data.frame(A = c(1:4) , B = c(1:4) , C = c(1:4)) L2 = data.frame(A = c(5:8) , B = c(8:11), G = c(1:4) ) L=list(L1,L2) names(L) = c('L1' , 'L2') MyPlot <- function(name){ df <- L[[name]] jpeg(filename = paste0(name, ".jpg"), width = 800, height = 600) P = ggplot(df, aes(A , B)) + geom_point() print(P) dev.off() } # 遍历列表名称,通过名称索引元素 Plot_jpeg = lapply(names(L), MyPlot)
内容的提问来源于stack exchange,提问作者Natalia
相关产品推荐
相关产品推荐

