如何在层次聚类树状图中仅显示簇标签而隐藏原始样本?
层次聚类树状图:仅显示簇/子簇标签,隐藏原始样本
问题描述
希望在层次聚类的树状图中,只显示自定义的簇(及子簇)标签,隐藏参与聚类的原始样本名称。以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
相关产品推荐
相关产品推荐

