我有兴趣绘制由
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)
但是我不确定如何绘制层次聚类树本身。
编辑:
为了使问题更清楚,我对其进行了修改以显示预期的输出。
预期输出:
类似这样的:
我建议递归地遍历树并使用 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'])
输出: