如何在单个画布上通过子图绘制6种不同Linkage类型的树状图?
解决方法
你的问题核心在于每次循环都调用plt.figure()创建新画布,导致每个树状图单独显示。要把6个图放在同一画布的子图中,按以下方式修改代码:
修改后的代码
import matplotlib.pyplot as plt from scipy.cluster import hierarchy linkage_types = ['single', 'complete', 'average', 'weighted', 'centroid', 'ward'] # 创建2行3列的子图布局,可根据需求调整figsize fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(30, 15)) # 扁平化子图数组,方便循环遍历 axes = axes.flatten() for idx, link_type in enumerate(linkage_types): Z = hierarchy.linkage(X, link_type) # 获取当前子图对象 ax = axes[idx] # 指定子图绘制树状图 hierarchy.dendrogram(Z, leaf_rotation=90, leaf_font_size=10, labels=Label, ax=ax) # 设置子图标题与坐标轴标签 ax.set_title(f'Hierarchical Clustering on Covid Data: {link_type}', size=14) ax.set_xlabel('State', size=12) # 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() plt.show()
关键修改说明
- 用
plt.subplots()一次性生成包含6个子图的画布,替代循环中重复创建新画布的操作 - 扁平化子图数组,确保能按顺序逐个分配给不同的linkage类型
- 调用
hierarchy.dendrogram()时指定ax参数,将图绑定到对应子图上 - 用
plt.tight_layout()自动优化子图布局,解决元素重叠问题
内容的提问来源于stack exchange,提问作者AshleyLee
相关产品推荐
相关产品推荐

