如何基于节点数据使用ggtree为进化树分支着色?
问题:使用ggtree批量为进化树分支按指定节点颜色着色
我有一个记录指定进化树节点颜色的dataframe(为清晰展示仅列3个节点,实际需扩展至1000个节点):
note_df
| nodes | color |
|---|---|
| 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
相关产品推荐
相关产品推荐

