如何绘制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
相关产品推荐
相关产品推荐

