如何在ggtree绘制的进化树中为节点和枝端添加外部数值标注
在ggtree中为进化树的节点和枝端标注数值信息
问题说明
需要给进化树的所有枝端和内部节点标注对应的基因计数,现有CSV数据框(包含节点/枝端名称及对应计数),基础绘图代码可正常运行,但尝试关联数据并添加标注时出现报错:Error in UseMethod("left_join") : no applicable method for 'left_join' applied to an object of class "NULL"
报错原因
- 错误将
%<+%(ggtree的数据集关联操作)与ggplot图层操作混合赋值给原始树对象:tree <- tree %<+% dd + geom_tiplab()这种写法会破坏对象结构,%<+%应作用于ggtree绘图对象,而非原始phylo对象。 - 未确保数据框的名称列与树的节点/枝端名称匹配(ggtree默认匹配
label列)。
解决方案
步骤1:预处理数据
确保数据框中存储节点/枝端名称的列名为label(或在关联时指定匹配列),示例数据处理:
# 读取CSV数据,注意分隔符(逗号分隔用sep=",",制表符用sep="\t") dd <- read.table(file = 'raw_data/counts.csv', sep='\t', header=TRUE) # 将原列名"Node Name"改为ggtree默认的"label" colnames(dd)[colnames(dd) == "Node Name"] <- "label"
步骤2:正确关联数据并添加标注
使用%<+%将数据框关联到ggtree绘图对象,然后用geom_text同时标注枝端和内部节点的数值(geom_tiplab仅处理枝端,geom_nodelab仅处理内部节点,geom_text可统一处理):
library(tidyverse) library(ggtree) # 读取进化树 tree <- read.tree("raw_data/tree.txt") # 绘图并添加标注 ggtree(tree, branch.length = 'none') %<+% dd + theme_tree2() + # 标注枝端和节点的计数,hjust控制水平位置,避免与树枝重叠 geom_text(aes(label = Count), hjust = -0.1, size = 3) + # 保留原有的枝端名称标注(如果需要) geom_tiplab(align = TRUE, linesize = .5) + xlim(0, 25) # 保存图片 ggsave("test_2.pdf", width = 60, height = 80, units = "cm", limitsize = FALSE)
进阶:区分枝端和节点的标注样式
如果需要给枝端和节点设置不同的标注样式(比如颜色、大小),可以通过subset参数筛选:
ggtree(tree, branch.length = 'none') %<+% dd + theme_tree2() + # 标注内部节点计数,颜色设为红色 geom_text(aes(label = Count), subset = .!isTip, color = "red", hjust = 1.1, size = 3) + # 标注枝端计数,颜色设为蓝色 geom_text(aes(label = Count), subset = .isTip, color = "blue", hjust = -0.1, size = 3) + geom_tiplab(align = TRUE, linesize = .5) + xlim(0, 25)
关键注意事项
- 数据框中的
label列必须与树的tip.label(枝端名称)和node.label(内部节点名称)完全匹配,包括大小写、空格和特殊字符。 - 如果树的内部节点没有名称,需要用节点编号(可通过
ggtree(tree)$data查看节点的node列)来匹配数据框,此时数据框的label列应替换为节点编号。
内容的提问来源于stack exchange,提问作者Sudoh
相关产品推荐
相关产品推荐

