You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Dataframe的klinger列绘制4×2布局共享图例的子图?

解决方案

可以利用matplotlib的子图布局结合Seaborn的绘图功能,通过循环遍历klinger的唯一值批量绘制子图,最后统一设置共享图例,具体实现如下:

  1. 导入必要库
import matplotlib.pyplot as plt
import seaborn as sns
  1. 创建4×2的子图布局
fig, axes = plt.subplots(nrows=4, ncols=2, figsize=(12, 16))
# 将二维子图数组转为一维,方便循环遍历
axes = axes.flatten()
  1. 循环绘制每个子图
# 获取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('')
  1. 设置全局共享图例
# 提取第一个子图的图例元素
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))
  1. 调整布局避免元素重叠
plt.tight_layout(rect=[0, 0, 0.85, 1])  # 预留右侧空间给图例
plt.show()

关键说明

  • 用axes.flatten()简化子图的循环配对逻辑,无需手动定位每个子图位置。
  • 通过legend参数控制仅在单个子图生成图例元素,减少冗余。
  • 利用fig.legend()创建全局图例,实现所有子图共享同一图例的效果。
  • tight_layout的rect参数用于调整画布布局,确保图例不会被截断。

内容的提问来源于stack exchange,提问作者user6346482

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:31:12