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
相关产品推荐
相关产品推荐

