如何保存par(mfrow)与lapply生成的多组组合直方图?
解决用lapply保存par(mfrow)组合直方图的问题
你的核心问题是每次循环都遍历了所有列,导致每个PNG都只保留最后一组的布局。要实现每组2个直方图的组合保存,且不用for循环和if语句,可以按以下步骤处理:
步骤1:将列索引分组
先把mtcars的列索引分成每组2个的列表,用split函数即可实现:
# 把列索引按每组2个拆分 col_groups <- split(1:ncol(mtcars), ceiling(1:ncol(mtcars)/2))
这会生成一个包含6个元素的列表(因为mtcars有11列),前5组各2个索引,最后1组1个索引。
步骤2:用lapply遍历分组并保存图片
遍历每个分组,为每个分组单独打开PNG设备,绘制对应列的直方图后关闭设备:
lapply(seq_along(col_groups), function(i) { # 生成带编号的PNG文件名 png(paste0("../Desktop/histogram_", i, ".png"), width = 800, height = 400) # 设置1行2列的布局 par(mfrow = c(1, 2), mar = c(4,4,2,1)) # mar参数可调整边距,优化显示效果 # 绘制当前分组内的所有直方图 lapply(col_groups[[i]], function(x) { hist(mtcars[, x], main = colnames(mtcars)[x], xlab = colnames(mtcars)[x]) }) # 关闭绘图设备,完成保存 dev.off() })
代码说明
seq_along(col_groups)用来获取分组的序号,作为PNG文件的编号,避免覆盖。- 每个分组只绘制对应列的直方图,不会重复遍历所有列,因此每个PNG只会保存当前组的1-2个直方图组合。
- 可以通过调整
png函数的width和height参数,以及par的mar参数优化图片的显示效果。
内容的提问来源于stack exchange,提问作者emr2
相关产品推荐
相关产品推荐

