使用ggtree按分类变量着色节点时遇调色板请求错误
问题原因分析
- 核心错误是节点ID匹配错误:ggtree中,进化树的末端(tips)ID从1到
n_tips,内部节点(internal nodes)ID从n_tips + 1开始。你的树有9个末端(spec1-spec9),因此内部节点ID是10到17,而非你使用的1-8。 geom_nodepoint仅针对内部节点,但你给这些节点对应的分类值全为NA,导致调色板没有可生成颜色的有效分类,触发"Must request at least one colour from a hue palette."错误。
解决方案
修正节点ID的匹配逻辑,给正确的内部节点ID分配分类变量,同时使用支持填充的形状:
# 读取进化树 tree.1 <- read.tree(text="(spec1:2.2,((spec2:1.8,(spec9:1.4,(spec3:1.3,spec5:1.3):0.1):0.4):0.2,(spec8:1.7,(spec6:1.5,(spec7:1,spec4:1):0.5):0.2):0.3):0.2);") # 添加节点标签 tree.1$node.label <- rep(100, 8) # 绘制基础树图 tree_plot <- ggtree(tree.1, branch.length = "none", ladderize = TRUE) + geom_tiplab() + geom_nodelab() # 构建匹配内部节点ID的分类数据框 # 9个末端节点,内部节点ID范围是10-17 category_nodes_df <- data.frame( node = 10:17, category_nodes = c(rep("cat1", 4), rep("cat2", 4)) ) # 为内部节点着色,使用shape=21(支持填充的圆形) tree_plot %<+% category_nodes_df + geom_nodepoint(aes(fill = category_nodes), shape = 21, size = 5)
补充说明
- 若需给末端节点着色,可搭配
geom_tippoint,并给末端ID(1-9)分配对应分类值。 - 将分类变量转为因子不是必须操作,但如果需要固定分类的显示顺序,可提前用
as.factor()转换。
内容的提问来源于stack exchange,提问作者mareikedaubert
相关产品推荐
相关产品推荐

