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) # Convert hc1a to a dendrogram object and plot dend <- as.dendrogram(hc1a) plot(dend)
转换为dendrogram对象并绘图后,发现两张图的节点顺序不一致,验证结果如下:
> order.dendrogram(dend) [1] 6 4 5 8 9 3 7 1 2 > labels(dend) [1] 4302 4141 4292 4305 4306 4139 4303 4136 4137 > > hc1a$order [1] 4 3 2 1 7 5 9 8 6 > hc1a$labels [1] 4136 4137 4139 4141 4292 4302 4303 4305 4306
我想了解:
- 为何转换后节点顺序和标签均发生变化?
- 如何绘制
dendrogram对象,使其与plot(hc1a)的结构完全一致(即相同节点顺序、标签及树形)?
原因分析
hclust的order属性作用:hc1a$order是hclust对象专门用于定义绘图时叶子节点显示顺序的属性,plot(hc1a)会直接遵循该顺序排列叶子,完全忽略合并矩阵中可能存在的子节点顺序差异。as.dendrogram()的默认行为:转换时,函数会自动对每个内部节点的子节点进行排序(默认按子节点包含的叶子索引升序排列),而非严格遵循hc1a$merge中的原始合并顺序,也不会自动继承hc1a$order的叶子排列规则。- 标签顺序的差异来源:
labels(dend)的结果是按dendrogram对象的叶子遍历顺序生成的,自然与hc1a$labels[hc1a$order](即plot(hc1a)的标签顺序)不一致。
解决方法
要让dendrogram的绘图与plot(hc1a)完全一致,需要根据hc1a$order重新排序dendrogram的叶子节点,使用reorder()函数即可实现:
# 根据hc1a$order重新排序dendrogram dend_aligned <- reorder(dend, w = match(seq_along(hc1a$labels), hc1a$order)) # 绘制对齐后的树状图 plot(dend_aligned) # 验证顺序一致性 # 检查标签顺序是否与plot(hc1a)一致 all(labels(dend_aligned) == hc1a$labels[hc1a$order]) # 检查叶子索引顺序是否匹配 all(order.dendrogram(dend_aligned) == hc1a$order)
原理说明
match(seq_along(hc1a$labels), hc1a$order)生成了一个权重向量,用于告诉reorder()函数将叶子节点调整为hc1a$order指定的顺序。执行后,dend_aligned的树形结构、叶子顺序和标签排列都会与plot(hc1a)完全一致。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

