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

如何基于节点数据使用ggtree为进化树分支着色?

问题:使用ggtree批量为进化树分支按指定节点颜色着色

我有一个记录指定进化树节点颜色的dataframe(为清晰展示仅列3个节点,实际需扩展至1000个节点):

note_df

nodescolor
node1#0d3b66
node2#faf0ca
node3#f4d35e

同时,我通过以下代码生成了一棵进化树:

library(ape)
library(ggplot2)
library(ggtree)
treex="((bat:10, cow:10):10,(elk:10, fox:10):10);"
treep=ape::read.tree(text=treex)
plot(treep)

请问能否使用ggtree根据上述节点数据框为进化树的分支线条着色?已知手动处理可行,但1000个节点手动操作耗时极长,寻求高效解决方案。


解决方案

1. 确保节点标识匹配

首先要保证note_df里的nodes列和进化树的节点编号/名称对应。如果是自定义节点名称,先给进化树的内部节点添加标签(示例中对应你的note_df节点名):

# 为示例树的内部节点添加标签
treep$node.label <- c("node1", "node2", "node3")

2. 批量关联颜色并绘制

利用ggtree的内置数据框特性,将颜色数据合并后直接映射到分支颜色,实现批量处理:

library(ape)
library(ggplot2)
library(ggtree)
library(dplyr)

# 生成进化树
treex="((bat:10, cow:10):10,(elk:10, fox:10):10);"
treep=ape::read.tree(text=treex)
# 匹配note_df的节点名称
treep$node.label <- c("node1", "node2", "node3")

# 节点颜色数据框
note_df <- data.frame(
  nodes = c("node1", "node2", "node3"),
  color = c("#0d3b66", "#faf0ca", "#f4d35e")
)

# 绘制树并合并颜色数据
tree_plot <- ggtree(treep) %>%
  # 按节点名称合并(如果用节点编号则改为by = c("node" = "nodes"))
  left_join(note_df, by = c("label" = "nodes"))

# 为分支着色,直接使用color列的十六进制值
tree_plot + 
  geom_tree(aes(color = color)) +
  scale_color_identity(guide = "none") + # 禁用图例,直接用指定颜色
  theme_tree()

核心说明

  • 若note_df的nodes是节点编号(而非自定义名称),合并时替换为by = c("node" = "nodes")即可,ggtree数据框的node列存储节点编号。
  • scale_color_identity()让ggtree直接使用color列中的颜色值,无需额外调色板映射。
  • 该方法完全支持1000个节点的批量处理,只要note_df包含所有目标节点的颜色信息,就能自动完成着色,无需手动逐个配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:31:09