如何将R包phytools的phenogram生成的系统发育图保存为外部图片
问题根源
phytools::phenogram()基于Base R绘图体系开发,调用时直接在当前激活的绘图设备上渲染图形,返回值仅为节点/末端的坐标矩阵,并非完整绘图对象。ggsave()、last_plot()是ggplot2体系的专属功能,仅能识别ggplot类对象,无法捕获Base R绘制的图形,因此你之前用ggsave(last_plot())只能取到上一次生成的ggtree绘图。- 你之前用
png()保存失败的原因是逻辑顺序错误:先在默认的RStudio绘图设备生成了图形,再打开png设备去画返回的坐标矩阵,自然只能得到散点图。
标准解决方法(Base R原生逻辑)
Base R保存绘图的逻辑是先开启目标存储设备,再运行绘图代码,最后关闭设备,图形会直接写入你开启的设备对应的文件中,代码示例:
# 1. 先开启png设备,提前设置好尺寸、分辨率参数 png(filename = "../output/APCT_phenogram_5Nov2021.png", width = 25, height = 16, units = "cm", res = 300) # 2. 直接运行phenogram绘图代码,图形会直接渲染到刚开启的png设备中 phenogram(tree_sub, bio01, colors = cols, fsize = 0.8, ftype = "i", xlab = "Relative Time", ylab = "Mean Annual Temperature (°C)", spread.labels = TRUE, spread.cost = c(1, 0)) # 3. 关闭设备完成保存,必须执行这一步否则文件会损坏 dev.off()
如果需要保存矢量图,把png()替换为pdf()即可,无需设置res参数。
可选方法(转ggplot对象后用ggsave保存)
如果需要统一用ggsave管理所有绘图输出,可以借助ggplotify包把Base R绘图过程转为ggplot对象:
# 安装依赖包(首次使用执行) # install.packages("ggplotify") library(ggplotify) # 将phenogram的绘图过程转为ggplot对象 p <- as.ggplot(~phenogram(tree_sub, bio01, colors = cols, fsize = 0.8, ftype = "i", xlab = "Relative Time", ylab = "Mean Annual Temperature (°C)", spread.labels = TRUE, spread.cost = c(1, 0))) # 调用ggsave正常保存 ggsave("../output/APCT_phenogram_5Nov2021.png", plot = p, width = 25, height = 16, units = "cm", dpi = 300)
内容的提问来源于stack exchange,提问作者nmarieh
相关产品推荐
相关产品推荐

