R语言:如何用lapply给多数据框批量绘制指定列的ggplot图?
解决ggplot自定义函数在lapply批量调用中的参数缺失问题
你有一批结构完全一致的数据框(相同列名、数据类型),希望用自定义ggplot函数批量绘图,固定以Time为x轴、Zscore为y轴,但使用lapply调用时出现参数缺失报错,以下是两种解决办法:
方法1:给自定义函数参数设置默认值
既然你固定使用Time和Zscore作为x、y变量,直接给函数的xvar和yvar参数设置默认值,这样调用时无需额外传递这两个参数:
修改后的函数代码:
library(ggplot2) library(gridExtra) Tzero = 0 Tminus120 = -120 TEnd = 120 testIDplot <- function(data1, xvar = Time, # 设置默认x变量为Time yvar = Zscore){ # 设置默认y变量为Zscore ggplot(data = data1)+ geom_line(aes(x={{xvar}},y={{yvar}}),colour="#fd8d3c", size=0.5) + geom_vline(xintercept=Tzero, colour="black", size=0.8)+ labs(x = "Time (s)", y = "Z-Score")+ scale_x_continuous(breaks = seq(Tminus120,TEnd,60), limits = c(Tminus120,NA))+ scale_y_continuous(expand = c(0, 0), limits = c(-3, 6)) }
批量调用代码:
listofDF <- list(newdata1,newdata2,newdata3,newdata4,newdata5) plotlist <- lapply(listofDF, testIDplot) # 查看第一个绘图对象(注意用[[1]]而非[1],后者返回子列表) plotlist[[1]]
方法2:在lapply中用匿名函数显式传递参数
如果不想修改原函数,可在lapply中通过匿名函数,给testIDplot完整传递三个参数:
listofDF <- list(newdata1,newdata2,newdata3,newdata4,newdata5) plotlist <- lapply(listofDF, function(df) testIDplot(df, Time, Zscore)) # 查看第一个图 plotlist[[1]]
报错原因说明
原代码lapply(listofDF, testIDplot)仅将列表中的每个数据框传给testIDplot的第一个参数data1,但函数还需要xvar和yvar两个必填参数,因此触发参数缺失错误。同时,查看绘图时需用plotlist[[1]]直接提取绘图对象,plotlist[1]返回的是包含单个绘图对象的子列表,无法直接显示。
内容的提问来源于stack exchange,提问作者Liptongal
相关产品推荐
相关产品推荐

