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

