已知所有聚类合并规则,在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
相关产品推荐
相关产品推荐

