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

R语言中par()与png()无法正常保存绘图问题求助

问题原因

你代码的核心问题是绘图和保存的设备不匹配:你先把所有图画在了RStudio的默认绘图窗口里,等到要保存的时候才临时打开一个新的PNG设备,但立刻就关闭了——这个新设备里根本没绘制任何内容,所以保存出来的文件是空白的。

修复代码

保留你原有的分析和绘图逻辑,只调整设备切换的时机:每次要生成一组5张图时,先打开PNG设备,把这5张图都画到这个设备里,画完再关闭设备完成保存。

# 提前定义保存路径的基础部分,避免重复编写
base_path <- file.path("C:", "Users", "...", "R_Plots", "cold_plots")

for (i in 1:ncol(data_cold)){
  # 原有的统计分析逻辑完全保留
  model <- aov(data_cold[[i]] ~ data_cold$test)
  df <- df.residual(model)
  MSerror <- deviance(model)/df
  out <- LSD.test(data_cold[[i]], data_cold$test, df, MSerror)
  mytitle <- paste("Seed lot", i)
  
  # 判断是否为每组5张图的第一张:打开PNG设备并设置布局
  if ((i - 1) %% 5 == 0) {
    # 用每组最后一个编号作为文件名,和你原逻辑一致
    group_end <- min(i + 4, ncol(data_cold))
    mypath <- file.path(base_path, paste("cold_plot_", group_end, ".png", sep = ""))
    png(file = mypath)
    par(mfrow = c(1,5))
  }
  
  # 绘图:统一处理纵轴显示规则
  if ((i - 1) %% 5 == 0) {
    # 每组第一张显示完整纵轴标签和范围
    plot(out, main = mytitle, ylim = c(0, 110), ylab = "Germination / Emergence %")
  } else {
    # 其他图隐藏纵轴刻度
    plot(out, main = mytitle, yaxt = "n")
  }
  
  # 判断是否为每组最后一张或最后一列:关闭PNG设备完成保存
  if (i %% 5 == 0 || i == ncol(data_cold)) {
    dev.off()
    # 如果需要在RStudio窗口也看到图,保留下面两行;不需要可删除
    par(mfrow = c(1,1))
    plot(out, main = mytitle)
  }
}
关键改动说明
  • 把png()和dev.off()移到一组图的开头和结尾:先打开设备,再在这个设备上绘图,最后关闭设备,确保图被绘制到PNG文件中。
  • 用(i-1) %%5 ==0替代逐个列号的判断,自动识别每组第一张图,代码更简洁易维护。
  • 处理了最后一组不足5张的情况(比如你数据有39列,最后一组是4张图),确保所有图都能正常保存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:36:30