ggtree中geom_tippoint绑定PSV设tip大小报错:‘node’未找到
解决ggtree中geom_tippoint绑定外部数据时的"node not found"报错
报错原因
geom_tippoint是ggtree专属图层,必须依赖ggtree内部生成的node变量来定位进化树的末端位置。- 你手动指定
data = phylo_traits_PSV时,这个外部数据框里没有ggtree绘图必需的node列,图层找不到定位依据,因此抛出node not found错误。 - 直接赋值
size = ((phylo_traits_PSV$PSV)+0.01)*7能运行,是因为这只是把数值向量直接传给size,没有触发数据框的美学映射匹配,ggtree仍用自身的定位数据绘制点。
正确实现方法
方法1:提前绑定性状数据到进化树对象(推荐)
ggtree提供%<+%运算符,能把性状数据框和进化树绘图对象绑定,后续图层可直接调用数据列:
# 把性状数据绑定到已有的进化树绘图对象p2 p2 <- p2 %<+% phylo_traits_PSV # 添加geom_tippoint,直接用aes映射PSV p3 <- p2 + geom_tippoint(aes(size = PSV)) + scale_size_continuous(range = c(2, 6)) + theme_tree() plot(p3)
⚠️ 注意:phylo_traits_PSV的第一列必须是与进化树末端标签完全一致的名称,否则无法匹配关联。
方法2:手动给外部数据框添加node列
如果不想提前绑定数据,可以从ggtree的绘图数据中提取末端节点信息,合并到你的性状数据框:
# 从p2中提取末端节点的编号和对应标签 tree_nodes <- p2$data %>% filter(isTip) %>% select(node, label) # 合并到性状数据框,确保label列匹配 phylo_traits_PSV <- merge(phylo_traits_PSV, tree_nodes, by = "label") # 现在添加geom_tippoint即可正常使用 p3 <- p2 + geom_tippoint(aes(size = PSV), data = phylo_traits_PSV) + scale_size_continuous(range = c(2, 6)) + theme_tree() plot(p3)
内容的提问来源于stack exchange,提问作者Iona Cunningham-Eurich
相关产品推荐
相关产品推荐

