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

如何在层次聚类树状图中仅显示簇标签而隐藏原始样本?

层次聚类树状图:仅显示簇/子簇标签,隐藏原始样本

问题描述

希望在层次聚类的树状图中,只显示自定义的簇(及子簇)标签,隐藏参与聚类的原始样本名称。以mtcars数据集为例,聚类后切割为4个簇,自定义标签为"sedan"、"truck"、"sportscar"和"van",需要生成仅显示这四个标签的树状图,同时也想了解如何显示簇内的子簇。


一、仅显示顶级簇标签(隐藏原始样本)

可以借助dendextend包合并原始样本节点,替换为自定义簇标签,具体步骤如下:

# 加载所需包
library(dplyr)
library(dendextend)

# 数据准备与层次聚类
data("mtcars")
# 计算距离矩阵并执行聚类
clust <- hclust(dist(mtcars, method = "pearson"), method = "complete")
# 转换为dendrogram对象,方便后续操作
dend <- as.dendrogram(clust)

# 切割为4个簇,获取样本分组
clust_groups <- cutree(clust, k = 4)
# 自定义簇标签
custom_labels <- recode(factor(clust_groups), 
                        '1'='sedan', '2'='truck', '3'='sportscar', '4'='van')

# 合并每个簇的所有原始样本节点为单个节点
dend_collapsed <- collapse_dendrogram(dend, k = 4)
# 给合并后的节点设置自定义标签(按簇顺序匹配)
labels(dend_collapsed) <- unique(custom_labels[order(clust_groups)])

# 绘制树状图,此时仅显示自定义簇标签
plot(dend_collapsed, 
     main = "层次聚类树状图(仅显示顶级簇)",
     ylab = "距离",
     leaflab = "none") # 关闭默认叶节点标签显示

这段代码会把每个簇的所有原始车型节点合并成一个节点,替换为你设置的自定义标签,最终树状图底部只会显示4个簇名称,原始样本名被完全隐藏。


二、显示簇内的子簇标签

如果需要展示顶级簇下的子簇,有两种常用方式:

方式1:合并到子簇层级,显示所有子簇标签

直接切割到子簇数量,然后给每个子簇设置自定义标签:

# 切割为8个节点(4个顶级簇各包含2个子簇)
dend_sub_collapsed <- collapse_dendrogram(dend, k = 8)

# 自定义子簇标签
sub_custom_labels <- c("sedan_sub1", "sedan_sub2", 
                       "truck_sub1", "truck_sub2",
                       "sportscar_sub1", "sportscar_sub2",
                       "van_sub1", "van_sub2")
# 设置子簇标签
labels(dend_sub_collapsed) <- sub_custom_labels

# 绘图
plot(dend_sub_collapsed, 
     main = "层次聚类树状图(显示子簇标签)",
     ylab = "距离",
     leaflab = "none")

方式2:保留层级结构,用颜色区分顶级簇+显示子簇

借助factoextra包的可视化功能,既能区分顶级簇,又能展示子簇的层级关系,同时隐藏原始样本标签:

library(factoextra)

# 绘制带层级区分的树状图,隐藏原始样本标签
fviz_dend(dend,
          k = 4, # 顶级簇数量
          k_colors = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"),
          rect = TRUE, # 用矩形框住顶级簇
          rect_border = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"),
          rect_fill = TRUE,
          labels = FALSE, # 隐藏原始样本标签
          main = "层次聚类树状图(顶级簇+子簇层级)",
          ylab = "距离")

这种方式会保留树的完整层级,用颜色和矩形区分顶级簇,子簇的分支结构也会清晰展示,同时不会显示原始样本名称。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:33:34