如何基于Dataframe的klinger列绘制4×2布局共享图例的子图?
解决方案
可以利用matplotlib的子图布局结合Seaborn的绘图功能,通过循环遍历klinger的唯一值批量绘制子图,最后统一设置共享图例,具体实现如下:
- 导入必要库
import matplotlib.pyplot as plt import seaborn as sns
- 创建4×2的子图布局
fig, axes = plt.subplots(nrows=4, ncols=2, figsize=(12, 16)) # 将二维子图数组转为一维,方便循环遍历 axes = axes.flatten()
- 循环绘制每个子图
# 获取klinger列的所有唯一取值 klinger_unique = df['klinger'].unique() for ax, k_val in zip(axes, klinger_unique): # 筛选当前klinger值对应的数据集 subset = df[df['klinger'] == k_val] # 仅在第一个子图生成图例元素,其余子图不显示图例 sns.lineplot(x='datapoints', y='mean', hue='index', data=subset, ax=ax, legend='full' if ax == axes[0] else False) # 设置子图标题 ax.set_title(f'klinger = {k_val}') # 优化坐标轴标签显示,避免重复 if ax not in axes[::2]: ax.set_ylabel('') if ax not in axes[-2:]: ax.set_xlabel('')
- 设置全局共享图例
# 提取第一个子图的图例元素 handles, labels = axes[0].get_legend_handles_labels() # 移除第一个子图的原有图例 axes[0].get_legend().remove() # 在画布右侧添加共享图例 fig.legend(handles, labels, loc='upper left', bbox_to_anchor=(1, 1))
- 调整布局避免元素重叠
plt.tight_layout(rect=[0, 0, 0.85, 1]) # 预留右侧空间给图例 plt.show()
关键说明
- 用
axes.flatten()简化子图的循环配对逻辑,无需手动定位每个子图位置。 - 通过
legend参数控制仅在单个子图生成图例元素,减少冗余。 - 利用
fig.legend()创建全局图例,实现所有子图共享同一图例的效果。 tight_layout的rect参数用于调整画布布局,确保图例不会被截断。
内容的提问来源于stack exchange,提问作者user6346482
相关产品推荐
相关产品推荐

