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

R中hclust转dendrogram再转回后绘图差异问题及解决

问题描述

我手动创建了名为hc1a的hclust对象,代码如下:

# Create hc1a and plot
hc1a <- list()
hc1a$merge <- matrix(c(-8, -9,
                      -1, -2,
                      -5,  1,
                      -7,  2,
                      -3,  4,
                       3,  5,
                      -4,  6,
                      -6,  7), ncol = 2, byrow = T)
hc1a$height <- c(0.01333333, 0.02000000, 0.03833333, 0.05500000, 0.06888889, 0.10555556, 0.13285714, 0.19625000)
hc1a$order <- c(4, 3, 2, 1, 7, 5, 9, 8, 6)            
hc1a$labels <- c(4136, 4137, 4139, 4141, 4292, 4302, 4303, 4305, 4306)
class(hc1a) <- "hclust" 
plot(hc1a)

绘制得到对应树状图后,我将hc1a转为dendrogram对象,再转回hclust对象命名为hc1b:

# Create hc1b and plot
hc1b <- as.hclust(as.dendrogram(hc1a))
plot(hc1b)

但hc1b的树状图与hc1a存在差异,请问差异原因是什么?如何让hc1b绘图与hc1a完全一致?

原因分析
  • hclust转dendrogram再转回的过程中,merge矩阵的子节点顺序会被自动调整:dendrogram结构默认会按标签顺序或聚类规模重新排列子节点,而你手动定义的hc1a$merge里的左右合并顺序,和转换后生成的hc1b$merge不一致。
  • 同时,hclust绘图依赖order属性确定叶子节点的排列,转换后的hc1b会根据新的merge矩阵重新生成order,导致叶子排列或分支左右位置改变,最终树状图呈现差异。
解决方法

要让hc1b绘图与hc1a完全一致,只需将hc1a的order和merge属性覆盖到hc1b上,保留原始的聚类逻辑和叶子排列:

# 转换后替换为原始hclust的关键属性
hc1b <- as.hclust(as.dendrogram(hc1a))
hc1b$order <- hc1a$order
hc1b$merge <- hc1a$merge
# 重新绘图
plot(hc1b)

这样就能保证hc1b的聚类合并规则和叶子节点顺序与hc1a完全一致,树状图也就完全相同了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:22:25