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

如何调整pandas多子图绘图的图例位置,保障图表可读性

解决方案

方案1:移除子图独立图例,指标名嵌入子图标题(最适合单曲线子图场景)

你当前每个子图仅对应1条曲线,完全不需要单独放置图例,直接把列名作为子图标题即可,能节省大量显示空间:

import pandas as pd
import matplotlib.pyplot as plt

# 按5列布局,向上取整计算所需行数,避免子图溢出
cols = 5
rows = (df.shape[1] + cols - 1) // cols

# 绘图时关闭默认图例,后续手动配置子图标题
axes = df.plot(
    legend=False, 
    subplots=True, 
    layout=(rows, cols), 
    grid=True, 
    suptitle="Labs", 
    sharex=True, 
    sharey=False,
    figsize=(12, 32),
)

# 遍历所有子图,将对应指标名设为子图标题,调整字体大小避免拥挤
for ax, col in zip(axes.flat, df.columns):
    ax.set_title(col, fontsize=8)

# 调整子图间距,给顶部总标题预留空间
plt.tight_layout(rect=[0, 0, 1, 0.97])
plt.show()

方案2:保留图例,统一放置在整张图的公共区域

如果业务要求必须保留图例,可以取消每个子图的独立图例,统一在整张图的右侧/底部生成公共图例:

import pandas as pd
import matplotlib.pyplot as plt

cols = 5
rows = (df.shape[1] + cols - 1) // cols

# 适当加宽画布,给右侧公共图例预留空间
axes = df.plot(
    legend=False, 
    subplots=True, 
    layout=(rows, cols), 
    grid=True, 
    suptitle="Labs", 
    sharex=True, 
    sharey=False,
    figsize=(14, 32),
)

# 生成公共图例,放在整张图的右侧区域
handles, labels = axes.flat[0].get_legend_handles_labels()
plt.figlegend(handles, df.columns, loc="upper right", bbox_to_anchor=(1.15, 0.97), fontsize=8)

# 调整布局,给图例和总标题预留空间
plt.tight_layout(rect=[0, 0, 0.9, 0.97])
plt.show()

额外优化建议

  • 如果所有指标量级接近,可以将sharey设置为True,进一步减少y轴刻度占用的空间
  • 子图标题、刻度、图例的字体大小可以根据实际显示效果灵活调整,避免文字重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:00