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

如何绘制Scipy中hierarchy.to_tree()输出的层次聚类树?

如何绘制hierarchy.to_tree()输出的层次聚类树

我希望绘制由scipy.cluster.hierarchy.to_tree()输出结果所代表的层次聚类树,以下是最小可复现示例:

import numpy as np
from scipy.cluster import hierarchy
from scipy.spatial import distance_matrix
import matplotlib.pyplot as plt

arr = np.array([[141, 0, 0, 0, 0],
                [0, 144, 0, 0, 0],
                [0, 0, 138, 0, 0],
                [0, 0, 0, 143, 0],
                [0, 0, 0, 0, 134]])

d = distance_matrix(arr, arr)
hc = hierarchy.linkage(d, method="complete")

目前我可以用以下代码绘制传统树状图:

hierarchy.dendrogram(hc, labels=['A','B','C', 'D', 'F'])
plt.show()

但我通过hierarchy.to_tree(hc)获取了树结构的对象表示后,不知道如何将其绘制成层级分明的树形结构(预期输出是类似横向展开的树,每个叶子节点对应样本标签,内部节点代表聚类合并,分支清晰展示聚类的层级关系,而非传统树状图的样式)。


解决方案:递归遍历树结构并绘制

可以通过递归遍历to_tree()返回的ClusterNode对象,手动用matplotlib绘制节点和连线,实现预期的树形结构:

def plot_tree(node, x, y, x_step, ax, labels):
    # 绘制当前节点
    ax.scatter(x, y, s=100, c='white', edgecolors='black')
    
    # 如果是叶子节点,添加标签
    if node.is_leaf():
        ax.text(x, y - 0.2, labels[node.id], ha='center', va='top')
        return
    
    # 计算左右子节点的x坐标
    left_x = x - x_step
    right_x = x + x_step
    child_y = y - 1
    
    # 绘制当前节点到子节点的连线
    ax.plot([x, left_x], [y, child_y], 'k-')
    ax.plot([x, right_x], [y, child_y], 'k-')
    
    # 递归绘制左右子树,x步长减半
    plot_tree(node.left, left_x, child_y, x_step/2, ax, labels)
    plot_tree(node.right, right_x, child_y, x_step/2, ax, labels)

# 获取树结构
tree = hierarchy.to_tree(hc)

# 设置绘图参数
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(-8, 8)
ax.set_ylim(-5, 1)
ax.axis('off')

# 绘制树形结构,传入样本标签
plot_tree(tree, 0, 0, 4, ax, ['A','B','C', 'D', 'F'])

plt.show()

这段代码通过递归遍历树的每个节点,从根节点开始逐步绘制子节点和连线,最终生成符合预期的层级树形结构。你可以根据需求调整x_step、节点大小、坐标范围等参数来优化可视化效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:55:22