matplotlib 如何让图例放在图外且自动调整大小
技术百科
舞姬之光
发布时间:2026-01-24
浏览: 次 图例放图外需协同 bbox_to_anchor、loc、tight_layout 及 rect 参数:bbox_to_anchor 定锚点(相对 figure),loc 定对齐方式,tight_layout(rect=...) 为图例预留空间,缺一不可。
用 plt.legend() 的 bbox_to_anchor 和 loc 控制图例位置
图例放图外的核心是脱离坐标轴范围,靠 bbox_to_anchor 指定锚点坐标(相对于整个 figure),再用 loc 定义图例自身哪一点对齐该锚点。比如右上角外侧:plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left')。注意坐标系:x ∈ [0,1] 是 figure 宽度比例,x > 1 就在图右侧;y > 1 就在图上方。
常见错误是只设 bbox_to_anchor 却忽略 loc,导致图例“飘”得离谱——例如 (1.02, 1) 配 loc='center',图例中心会卡在右上角边缘,一半被切掉。
-
loc='upper right'+bbox_to_anchor=(1.02, 1):图例右上角贴图右边界 -
loc='lower left'+bbox_to_anchor=(0, -0.15):图例左下角放在图正下方 - 横向图例放底部时,推荐
ncol控制列数,避免过长换行错乱
必须调用 plt.tight_layout() 或 fig.tight_layout()
光设图例位置不够,matplotlib 默认布局不会为图外元素留白,图例大概率被截断或压盖坐标轴。解决方法不是手动调 plt.subplots_adjust() 猜参数,而是用 tight_layout() 自动重排。
但要注意:如果图例在右侧,tight_layout() 默认不考虑它,需显式传参:plt.tight_layout(rect=[0, 0, 0.85, 1]),意思是“把绘图区压缩到 figure 宽度的 85%,右边 15% 给图例”。数值要根据图例宽度微调,0.85 是常见起点。

- 图例在右侧 →
rect=[0, 0, 0.85, 1] - 图例在下方 →
rect=[0, 0.1, 1, 1](下边留 10%) - 用
fig.tight_layout()更灵活,可配合pad、h_pad微调间距
避免 plt.legend() 覆盖已有图形或文字
图例放图外后仍可能和标题、子图标签冲突,尤其多子图时。这时不能只依赖 tight_layout(),得检查 plt.suptitle() 或 ax.set_title() 是否被挤偏。一个可靠做法是:先画图、加标题、再调 legend(),最后统一 tight_layout()。
另一个坑是使用 plt.figure(figsize=...) 时,figure 太小会导致图例文字挤压变形——图例字体大小默认不随 figure 缩放,建议显式设 fontsize 或用 prop={'size': 10}。
- 图例文字太小?加
fontsize=10或prop={'size': 10} - 图例边框太粗?加
frameon=True, fancybox=False, shadow=False控制样式 - 多子图共享图例时,别在每个
ax上重复legend(),统一用fig.legend()
rect 参数和 figsize 的联动——图再大,tight_layout() 不告诉它“右边要留空”,它就真不留。
# 的是
# 放在
# 解决方法
# 已有
# 这件事
# 就在
# 再用
# igs
# 相对于
# 太小
# matplotlib
# 压盖
# 多子
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何高效删除 NumPy 二维数组中所有元素相同的
- 如何使用Golang搭建Web开发环境_快速启动H
- Windows10电脑怎么设置文件权限_Win10
- Win11怎么卸载Photos应用_Win11卸载
- Win11怎么关闭小组件_Win11禁用任务栏天气
- 如何将文本文件中的竖排字符串转换为横排字符串
- 如何用::实现单例模式_php静态方法与作用域操作
- Mac系统更新下载慢或失败怎么办_解决macOS升
- 如何在 Go 后端安全获取并验证前端存储的 JWT
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Python数据挖掘进阶教程_分类回归与聚类案例解
- Win11怎么关闭应用权限_Windows11相机
- Python与MongoDB NoSQL开发实战_
- Windows10怎样设置家长控制_Windows
- Windows10如何更改鼠标图标_Win10鼠标
- 如何在Golang中实现自定义Benchmark_
- Win11怎么清理C盘下载文件夹_Win11清理下
- php查询数据怎么导出csv_查询结果转csv文件
- Windows10如何重置此电脑_Windows1
- Windows10任务栏图标变成白色文件_Win1
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- 如何在Golang中定义接口_抽象方法和多态实现
- C++中的Pimpl idiom是什么,有什么好处
- Python数据挖掘核心算法实践_聚类分类与特征工
- 如何在Golang中实现WebSocket广播_使
- Win10怎样安装PPT模板_Win10安装PPT
- c++怎么设置线程优先级与cpu亲和性_c++ 多
- Windows10无法连接到Internet_Wi
- Mac如何备份到iCloud_Mac桌面与文稿文件
- php嵌入式日志记录怎么实现_php将硬件数据写入
- c++中如何使用auto关键字_c++11类型推导
- Win10路由器怎么隐藏ssid Win10隐藏w
- Win11怎么开启剪贴板历史记录_Windows1
- Python数据抓取合法性_合规说明【指导】
- LINUX如何删除用户和用户组_Linux use
- 如何在Golang中引入测试模块_Golang测试
- Python与GPU加速技术_CUDA与Numba
- C++ static_cast和dynamic_c
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Win10系统怎么查看端口状态_Windows10
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Python性能剖析高级教程_cProfileLi
- 如何使用Golang recover捕获panic
- c++中explicit(bool)的用法 c++
- Win10如何卸载Skype_Win10卸载Sky
- Win11如何设置自动关机 Win11定时关机命令
- Bpmn 2.0的XML文件怎么画流程图
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】

QQ客服