You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环批量绘图每页6幅需求:par(mfrow)设置失效求助

问题排查与解决方案

核心原因

ggplot2基于grid绘图系统,完全独立于base R的绘图系统,因此base R中控制排版的par(mfrow = c(3,2))对ggplot生成的图表没有任何作用,这就是你每页只显示1幅图的根本原因。

可行解决方案

推荐使用patchwork包(语法直观,专为ggplot排版设计)或gridExtra包实现每页6图的排版,同时批量导出为jpeg格式,以下是完整代码:

步骤1:安装并加载依赖包

# 首次运行时安装所需包
install.packages(c("ggplot2", "patchwork", "dplyr"))
library(ggplot2)
library(patchwork)
library(dplyr)

步骤2:批量生成排版后的页面并导出

# 获取所有受试者ID
Subjects <- unique(data2$Subject)
# 将受试者按每6个一组拆分,匹配3行2列的排版
subject_groups <- split(Subjects, ceiling(seq_along(Subjects)/6))

# 循环处理每组,生成一页6图并导出
for (group_idx in seq_along(subject_groups)) {
  current_subjects <- subject_groups[[group_idx]]
  
  # 生成当前组的所有受试者曲线图
  plot_list <- lapply(current_subjects, function(subj) {
    ggplot(data = subset(data2, Subject == subj), 
           aes(x = Actual.Time, y = Concentration, colour = Formulation)) + 
      geom_line(lwd = 0.7) +
      geom_point(lwd = 2) +
      ggtitle(sprintf("Subject %s", subj)) +
      labs(x = "Actual time (h)", y = "Concentration (ng/mL)") +
      scale_color_manual(values = c("black", "blue")) +
      theme_bw() # 可选:添加简洁主题,提升附录可读性
  })
  
  # 用patchwork实现3行2列排版
  combined_plot <- wrap_plots(plot_list, nrow = 3, ncol = 2)
  
  # 导出为jpeg文件,文件名带页码区分
  ggsave(
    filename = sprintf("subject_plots_page_%d.jpeg", group_idx),
    plot = combined_plot,
    width = 12,  # 宽度(英寸),可按需调整
    height = 18, # 高度(英寸),适配3行图的纵向空间
    dpi = 300    # 分辨率,300dpi适合印刷附录
  )
}

替代方案(使用gridExtra)

如果不想用patchwork,可替换排版代码为gridExtra包的实现:

install.packages("gridExtra")
library(gridExtra)

# 替换上述代码中的combined_plot行:
combined_plot <- do.call(grid.arrange, c(plot_list, nrow=3, ncol=2))

额外说明

  • 若最后一组受试者不足6个,排版会自动适配剩余图表,不会产生空白占位。
  • 可根据附录的页面尺寸调整width和height参数,确保图表在打印时清晰可读。

内容的提问来源于stack exchange,提问作者Tajda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:45:50