图例位置需手动用 bbox_to_anchor 和 loc 精控,中文字体需配置 font.sans-serif 或 prop 参数,标签顺序由 plot 调用顺序决定,多列布局用 ncol 和 columnspacing 优化。

plt.legend() 位置总跑偏?用 loc 和 bbox_to_anchor 精控
图例不贴边、遮挡数据、挤在角落——根本不是“自动”不够聪明,而是默认的 loc='best' 只在有限区域内找“看起来还行”的位置,不考虑你画布留白或子图布局。真要稳,得手动定锚点。
-
loc控制图例内部对齐方式(比如'upper right'表示图例框右上角对齐锚点) -
bbox_to_anchor才是真正指定锚点坐标的参数,接收二元组:(x,y),坐标系默认是 axes 坐标(0~1),左下为 (0, 0) - 常见组合:
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left')把图例左上角钉在绘图区右边界外侧,避免遮挡 - 如果用了
plt.subplots()多子图,bbox_to_anchor的坐标是相对于当前 axes 的,不是整个 figure
中文图例标签显示为方块?检查字体和 prop 设置
Matplotlib 默认字体不支持中文,plt.legend() 一渲染就出□,不是标签没传进去,是字库没加载。
- 最简方案:全局设中文字体,加在绘图前:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] - 只改图例字体:用
prop参数传字体属性字典,例如plt.legend(prop={'family': 'SimHei', 'size': 12}) - Mac 用户注意:
'Heiti SC'或'STHeiti'更可靠;Linux 可能需先安装fonts-wqy-zenhei - 别漏掉
plt.rcParams['axes.unicode_minus'] = False,否则负号也变方块
图例项顺序和内容对不上?根源在 plt.plot() 调用顺序
图例标签顺序严格按 plt.plot()(或 ax.plot())的调用次序来,不是按变量名、颜色、还是你心里想的逻辑。
- 显式传
label最安全:plt.plot(x, y1, label='训练误差')、plt.plot(x, y2, label='验证误差') - 如果忘了写
label,Matplotlib 会自动生成'line0'、'line1'这类名字,后续再用plt.legend(['A', 'B'])强行覆盖,极易错位 - 多条线共用一个 label?加
label='_nolegend_'可跳过该线(下划线开头是 Matplotlib 内部约定) - 用
ax.get_lines()可查当前 axes 里 line 对象顺序,调试时有用
图例太挤/文字重叠?别硬调 fontsize,先看 ncol 和 columnspacing
缩小字号只是掩盖问题,图例项横向排太密、行高不够、列间距为零,才是重叠主因。
-
ncol控制列数,默认 1,多标签时设成 2 或 3 让它横排,比竖着拉长更省空间 -
columnspacing调整列之间空白(单位是 fontsize 倍数),默认 2.0,设成 3.0 常能立刻缓解挤压 -
handletextpad控制图例符号和文字间距离,handlelength控制符号长度,这两个比调fontsize更治本 - 极端情况可用
plt.legend(..., fancybox=False, shadow=False)关掉边框阴影,省像素
plt.legend() 这一行,顺手 print 一下 ax.get_xlim()、检查下 plt.rcParams 里有没有残留配置,往往比反复试 bbox_to_anchor 更快定位问题。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











