在R语言中如何将自定义函数生成的多个绘图保存到列表中
R 基础绘图存储为变量的实现方案
R 基础绘图(base plot)系统默认直接将图像输出到图形设备,不会返回可存储的绘图对象,因此你直接调用自定义函数只会得到NULL返回值。可以通过以下两种方案实现绘图存储:
方案1:使用recordPlot()记录现有绘图(无需修改绘图逻辑)
直接在你现有代码基础上调整函数结构,每次生成完一张组合图后,用R自带grDevices包的recordPlot()函数记录当前设备的绘图结果,存入列表后返回即可,完全不需要修改原有绘图逻辑。
list_genes <- c("GEN1", "GEN2", "GEN3") myfunction <- function(x,y){ # 初始化存储绘图的空列表 plot_list <- list() for(i in seq_along(list_genes)){ gene <- list_genes[i] par(mfrow=c(2,1)) plot(x,y, main=paste0("Plot of ", gene)) hist(x, main=paste0("Plot of ", gene)) # 记录当前绘图存入列表 plot_list[[i]] <- recordPlot() # 清空当前设备避免绘图叠加,不需要展示绘图时可保留 dev.off() } # 返回存储所有绘图的列表 return(plot_list) } # 调用函数获取存储了所有绘图的列表 plot_res <- myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5)) # 调用方式:打印对应索引的绘图即可显示 print(plot_res[[1]]) # 查看第一张GEN1的组合图 print(plot_res[[2]]) # 查看第二张GEN2的组合图
方案2:改用ggplot2绘图体系(更适合后续生成演示文稿)
ggplot2生成的绘图本身就是可存储的对象,配合patchwork包可以快速实现多图组合,后续插入PPT、markdown文档的兼容性更好。
library(ggplot2) library(patchwork) list_genes <- c("GEN1", "GEN2", "GEN3") myfunction <- function(x,y){ plot_list <- list() df <- data.frame(x = x, y = y) for(i in seq_along(list_genes)){ gene <- list_genes[i] # 绘制散点图 p1 <- ggplot(df, aes(x = x, y = y)) + geom_point() + ggtitle(paste0("Plot of ", gene)) # 绘制直方图 p2 <- ggplot(df, aes(x = x)) + geom_histogram(bins = 3) + ggtitle(paste0("Plot of ", gene)) # 上下拼合两张图,存入列表 plot_list[[i]] <- p1 / p2 } return(plot_list) } plot_res <- myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5)) # 直接调用索引即可显示绘图 plot_res[[1]]
后续生成演示文稿时,不管是用rmarkdown渲染PPT,还是用officer包批量插入绘图到PPT模板,上述两种方案得到的绘图列表都可以直接调用插入。
内容的提问来源于stack exchange,提问作者emr2
相关产品推荐
相关产品推荐

