scipy:如何绘制层次聚类树

问题描述 投票:0回答:1

我有兴趣绘制由

hierarchy.to_tree()
的输出表示的树。

为了澄清我的问题,我给出以下 MWE:

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_classes = hierarchy.to_tree(hc)

但是我不确定如何绘制层次聚类树本身。

编辑:

为了使问题更清楚,我对其进行了修改以显示预期的输出。

预期输出:

类似这样的:

python scipy hierarchical-clustering
1个回答
0
投票

我建议递归地遍历树并使用 graphviz 来可视化它。

示例:

import graphviz


def render_tree(tree, labels):
    dot = graphviz.Digraph('cluster_heirarchy')
    render_tree_recursive(tree, dot, labels)
    return dot


def render_tree_recursive(node, dot, labels, parent=None):
    label = None
    if node.count == 1 and node.id < len(labels):
        label = labels[node.id]
    dot.node(f"c{node.id}", label)
    if parent is not None:
        dot.edge(f"c{parent.id}", f"c{node.id}")
    if node.left is not None:
        render_tree_recursive(node.left, dot, labels, node)
    if node.right is not None:
        render_tree_recursive(node.right, dot, labels, node)


graph = render_tree(hierarchy_classes, labels=['A','B','C', 'D', 'F'])

输出:

© www.soinside.com 2019 - 2024. All rights reserved.