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

如何仅对树状图(Dendrogram)叶节点标签按组着色且不附加组标签?

嘿,我刚好对这个问题门儿清!Tal Galili的那段代码确实是树状图着色的经典参考,要实现你要的「只给原始叶节点标签按组上色,不额外加组标识」的效果,其实只需要做几个小改动就行,核心就是去掉标签里的组名拼接,保留原始标签同时保留颜色映射逻辑。

修改Tal Galili的树状图叶节点着色代码(仅保留标签颜色,不附加组名)

下面是修改后的完整可运行代码,以及关键修改点的详细说明:

完整修改后的代码

# 生成示例数据(和原代码一致,保证可复现)
set.seed(123)
sample <- data.frame(matrix(floor(abs(rnorm(20000)*100)),ncol=200))

# 聚类与树状图构建(和原代码逻辑一致)
hc <- hclust(dist(sample))
dend <- as.dendrogram(hc)

# 定义分组(这里用k=3做示例,你可以根据自己的数据调整)
k <- 3
clusMember <- cutree(hc, k=k)

# 自定义组对应的颜色(可根据需求替换成你喜欢的颜色)
groupColors <- c("#E63946", "#457B9D", "#1D3557")
names(groupColors) <- 1:k

# 关键修改1:直接提取原始叶节点标签,不拼接组名
labels.dendro <- labels(dend)

# 关键修改2:给每个原始标签匹配对应组的颜色
labelColors <- groupColors[as.character(clusMember)]

# 绘制树状图+上色标签
plot(dend, main = "仅叶节点标签按组着色的树状图", 
     labels = FALSE, # 先不绘制默认标签,避免重复
     col.axis = "black", 
     cex = 0.8)
# 用text函数单独绘制带颜色的原始标签
text(x = 1:length(labels.dendro), 
     y = par("usr")[3] - 0.15, # 调整y轴位置,避免和树状图重叠
     labels = labels.dendro, 
     col = labelColors, 
     cex = 0.8, 
     srt = 45) # 旋转标签避免拥挤,可根据需求调整角度

关键修改点(对比原代码)

  • 删掉组标签拼接操作:原代码里Tal会把组标识和原始标签拼在一起(比如paste(groupCodes[clusMember], labels.dendro, sep = "")),我们直接用labels.dendro <- labels(dend)提取原始标签即可,完全不用拼接组名。
  • 简化颜色匹配逻辑:直接用每个叶节点的组归属(clusMember或者你的自定义groupCodes)去匹配预设的颜色向量,得到每个原始标签对应的颜色,不用处理拼接后的复合标签。
  • 单独控制标签绘制:绘图时先隐藏默认标签,再用text()函数精准绘制带颜色的原始标签,既保留树状图的原始结构,又能单独控制标签颜色。

如果你的groupCodes是自定义的分组向量(不是通过cutree生成的),只需要把clusMember换成你的groupCodes,颜色映射逻辑保持一致就可以了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:08