dev.off()函数致已保存热力图内容消失,如何正确保存PNG热力图?
解决热力图保存后内容消失的问题
问题原因
你的代码存在两个关键问题:
- 在
png()设备上下文里,你重复赋值并调用plot(),但如果wtr.heat.map()返回的是ggplot类对象,plot()无法正确触发渲染,导致设备里没有生成图像内容,调用dev.off()后文件为空。 - 若不调用
dev.off(),绘图设备会保持打开状态,后续绘图操作会直接覆盖已保存的文件。
正确的保存方法
方法1:利用设备上下文正确渲染
如果wtr.heat.map()生成的是基础绘图(base plot):
# 提前设置工作目录,避免重复操作 setwd("/Users/heathershaw/Desktop/DepthProfiles2023/TalusSouthHeatMaps") # 打开png绘图设备 png(file = "TalusSouthHeatMap.png", width = 500, height = 500) # 直接生成并绘制热力图,无需重复赋值变量 wtr.heat.map(TalusSouthdf) # 关闭设备,完成图像写入 dev.off()
如果wtr.heat.map()返回的是ggplot对象(更常见),需要显式打印对象触发渲染:
setwd("/Users/heathershaw/Desktop/DepthProfiles2023/TalusSouthHeatMaps") # 先生成热力图对象 TalusSouthHeatMap <- wtr.heat.map(TalusSouthdf) # 打开png设备 png(file = "TalusSouthHeatMap.png", width = 500, height = 500) # 显式打印ggplot对象到设备 print(TalusSouthHeatMap) # 关闭设备 dev.off()
方法2:使用ggsave()(仅适用于ggplot类图像)
如果是ggplot对象,直接用ggsave()更简洁,无需手动管理绘图设备:
setwd("/Users/heathershaw/Desktop/DepthProfiles2023/TalusSouthHeatMaps") TalusSouthHeatMap <- wtr.heat.map(TalusSouthdf) # 指定文件名、图像对象和尺寸,units参数可选px/in/mm等 ggsave("TalusSouthHeatMap.png", plot = TalusSouthHeatMap, width = 500, height = 500, units = "px")
注意事项
- 确保绘图动作完全在
png()和dev.off()之间完成,不要在设备上下文里做无关的变量赋值操作。 - 调用
dev.off()后检查返回值,若显示null device 1,说明设备已成功关闭。 - 绘图使用完毕必须调用
dev.off()关闭设备,否则后续脚本的绘图会覆盖已保存的文件。
内容的提问来源于stack exchange,提问作者Heather Shaw
相关产品推荐
相关产品推荐

