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

已知所有聚类合并规则,在R中绘制树状图的方法

手动构建指定合并规则的层次聚类树并截断

1. 基于自定义合并规则创建聚类对象

在R中,层次聚类的核心对象是hclust,我们可以手动构建它的关键组件来匹配自定义的合并规则:

  • labels:初始对象的名称,对应示例中的a、b、c、d、e
  • merge矩阵:每行代表一次合并操作,初始单个对象用负索引,已合并的聚类用正索引(对应merge矩阵的行号,从1开始)
  • height:自定义每次合并的高度值,只需保证递增即可,用于区分合并顺序

示例代码:

# 定义初始对象标签
labels <- c("a", "b", "c", "d", "e")

# 构建merge矩阵,对应合并规则[(1,2), (3,5), (6,4)]
merge_matrix <- rbind(
  c(-1, -2),   # 合并初始聚类1(a)和2(b),生成聚类6
  c(-3, -5),   # 合并初始聚类3(c)和5(e),生成聚类7
  c(1, -4)     # 合并第1次的结果(聚类6)和初始聚类4(d),生成聚类8
)

# 定义合并高度(自定义递增数值)
merge_heights <- c(1, 2, 3)

# 创建hclust对象
custom_hc <- structure(
  list(
    merge = merge_matrix,
    height = merge_heights,
    labels = labels,
    method = "custom",
    call = NULL,
    dist.method = NULL
  ),
  class = "hclust"
)

# 直接绘制层次聚类树
plot(custom_hc, main = "自定义合并规则的层次聚类树")

# 转换为dendrogram对象(更灵活的操作)
custom_dend <- as.dendrogram(custom_hc)
plot(custom_dend, main = "自定义合并规则的树状图")

2. 截断未完成的树状图

由于我们的合并规则本身未执行到顶层(未合并聚类7和8),生成的聚类对象自然就是截断状态,绘图时会保留所有未合并的分支(比如示例中的c和e分支)。

如果需要手动指定截断高度,可以用基础R的cut函数:

# 截断高度为2,仅保留高度≤2的合并分支
truncated_dend <- cut(custom_dend, h = 2)$upper
plot(truncated_dend, main = "截断到高度2的树状图")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:15:18