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

Matplotlib大图例被截断:如何通过代码实现完整显示?

解决Matplotlib超大图例被截断问题

问题说明

Matplotlib图表因图例过大出现截断,图表本身位置正常,拖动查看器可显示完整图例,但调整set_position参数后要么图表被截断要么尺寸过小,暂不考虑单独导出图例。

可行解决方案

  • 直接预留图表底部空间:用fig.subplots_adjust()在图表底部留出足够容纳图例的区域,比手动调整轴位置更可靠。
  • 优化图例列数:根据标签数量增加ncol值,减少图例行数,避免纵向占用过多空间。
  • 压缩图例内部间距:通过handlelength、handletextpad等参数缩小图例元素间的空隙,减少整体体积。
  • 确保图例完整渲染:若需保存图表,添加bbox_extra_artists和bbox_inches='tight'参数,防止保存时图例被截断。

修改后的代码示例

fig, ax = plt.subplots()
for t in list(set(df['t'])):
    subset = df[df['t'] == t]
    plt.scatter(subset.x, subset.y, c=subset.color, s=dot_size, label=t) 

# 修正原代码中t.shape的错误:t是循环变量,需替换为实际数据维度计算
data_y_range = df['y'].max() - df['y'].min()
data_x_range = df['x'].max() - df['x'].min()
plt.ylim([-0.5 - 0.05, data_y_range + 0.5 + 0.05])
plt.xlim([-0.5 - 0.05, data_x_range + 0.5 + 0.05])

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

# 调整底部预留空间,数值越大预留越多
fig.subplots_adjust(bottom=0.3)

# 优化图例参数
legend = plt.legend(
    loc='upper center', 
    bbox_to_anchor=(0.5, -0.2),  # 适配底部预留空间调整位置
    ncol=5,  # 根据标签数量调整列数,标签多则设更大值
    fontsize=7,
    handlelength=0.5,  # 缩小图例标记长度
    handletextpad=0.3  # 缩小标记与文字的间距
)

# 保存图表时添加以下参数确保图例完整
# plt.savefig('output.png', bbox_extra_artists=[legend], bbox_inches='tight')

关键注意点

  • 原代码中plt.ylim/plt.xlim里的t.shape属于逻辑错误(t是单个标签值,无shape属性),需替换为实际数据的范围计算。
  • fig.subplots_adjust(bottom=...)的数值需根据图例实际大小调整,图例行数越多,bottom值应越大。
  • 增加ncol是解决超大图例纵向占用空间的核心手段,可根据标签总数灵活设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:39