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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:32:24