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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:06:03