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
相关产品推荐
相关产品推荐

