如何在R中创建连接指定聚类数切割树状图的缠结图?
在R中实现指定聚类数的树状图缠结图对比
1. 安装并加载必要的包
我们使用dendextend包处理树状图与缠结图绘制,它提供了丰富的树状图操作和可视化工具:
install.packages("dendextend") library(dendextend)
2. 准备数据与生成层次聚类结果
以下以鸢尾花数据集为例生成两种不同的层次聚类结果(可替换为你自己的聚类对象):
# 提取iris的数值型特征 data(iris) iris_data <- iris[, -5] # 生成两种差异化的层次聚类 hc1 <- hclust(dist(iris_data, method = "euclidean"), method = "ward.D2") hc2 <- hclust(dist(iris_data, method = "manhattan"), method = "complete") # 转换为dendrogram对象 dend1 <- as.dendrogram(hc1) dend2 <- as.dendrogram(hc2)
3. 切割树状图到指定聚类数
假设需要保留3个聚类,使用cut函数完成切割,并为聚类分支上色以增强区分度:
# 指定目标聚类数 k <- 3 # 切割树状图 cut_dend1 <- cut(dend1, k = k) cut_dend2 <- cut(dend2, k = k) # 为树状图的聚类分支上色 dend1_colored <- color_branches(dend1, k = k) dend2_colored <- color_branches(dend2, k = k)
4. 绘制仅展示指定聚类的缠结图
使用tanglegram函数绘制缠结图,通过参数控制仅突出目标聚类,隐藏冗余细节:
tanglegram( dend1_colored, dend2_colored, # 关闭公共子树线条颜色,突出聚类差异 common_subtrees_color_lines = FALSE, # 高亮不同分支 highlight_distinct_edges = TRUE, # 显示切割线明确聚类划分 show_vertical_lines = TRUE, vertical_lines_lwd = 2, vertical_lines_col = "gray", # 调整标签大小避免重叠 labels_cex = 0.6, # 设置子图标题 main_left = "欧氏距离 + Ward.D2 聚类", main_right = "曼哈顿距离 + Complete 聚类" )
额外技巧:修剪树状图仅保留指定聚类
若需完全移除非目标聚类的分支(而非仅上色),可使用prune函数修剪树状图:
# 提取切割后的聚类成员 clust1_members <- cut_dend1$lower clust2_members <- cut_dend2$lower # 修剪树状图,仅保留目标聚类分支 pruned_dend1 <- prune(dend1, names(unlist(clust1_members))) pruned_dend2 <- prune(dend2, names(unlist(clust2_members))) # 绘制修剪后的缠结图 tanglegram( pruned_dend1, pruned_dend2, color_branches = TRUE, k = k, labels_cex = 0.6, main_left = "修剪后:欧氏距离 + Ward.D2 聚类", main_right = "修剪后:曼哈顿距离 + Complete 聚类" )
内容的提问来源于stack exchange,提问作者Ivan Z
相关产品推荐
相关产品推荐

