plt.subplots(1, 3) 实现三图并排,ncols 控制横向排列而非 figsize;axes 为一维数组,2×2 网格则为二维;tight_layout() 防重叠;共享坐标轴需显式设 sharex/sharey=true,否则无效。

用 plt.subplots() 创建多图并排布局,核心是控制 ncols 和 nrows
默认横向排布靠的是设 ncols,不是靠 figsize 拉宽——后者只缩放单个子图,不改变排列结构。比如要并排 3 张图,直接写 plt.subplots(1, 3),第一个参数是行数,第二个是列数;写成 (3, 1) 就变竖排了。
常见错误:传参顺序记反,写成 subplots(3, 1) 却想要横着排;或者漏掉逗号,写成 subplots(1 3) 直接报 SyntaxError。
-
fig, axes = plt.subplots(1, 3)返回的axes是一维数组,可直接用axes[0]、axes[1]等索引 - 如果画 2×2 网格,
axes变成二维,得用axes[0, 0]、axes[1, 1]访问,别硬套一维下标 - 想让每张图尺寸一致又紧凑,加
fig.tight_layout(),否则标题/标签容易重叠或被截断
共享坐标轴时,sharex/sharey 参数不能只设一半
比如四张图纵坐标范围差不多,想共用 Y 轴刻度,必须显式写 sharey=True;只写 sharex=True 而忽略 sharey,Y 轴还是各自独立缩放,看着像没共享。
典型现象:上下两张图 Y 轴数值范围差很大,但你以为开了 sharey 就自动对齐了——其实没开,或者开了但没生效(比如在 Jupyter 中反复运行 cell 没重启内核,旧 figure 残留干扰)。
- 共享后,只有最左边(
sharey)或最下边(sharex)的轴显示刻度和标签,其余隐藏,这是正常行为 - 若需所有子图都显示 Y 轴标签,别用
sharey,改用手动统一set_ylim()和set_ylabel() -
sharex='col'或sharey='row'是进阶用法,仅在多行多列时按行列局部共享,但兼容性注意:Matplotlib ValueError: Unknown sharex value 'col'
往每个子图里画图,别直接用 plt.plot(),要用 axes[i].plot()
很多人习惯写 plt.plot(x, y),但在 subplots 下这会把线画到当前「活跃」的子图上,而这个活跃状态不可控——尤其循环绘图时容易串图,A 的数据画到了 B 的坐标系里。
错误现场:for 循环里没指定 axes[i],结果所有曲线堆在第一个子图,其余空白;或者用了 plt.subplot() 混搭 subplots(),导致 plt.gca() 返回错对象。
- 正确做法:明确调用
axes[0].plot(x1, y1)、axes[1].scatter(x2, y2),哪怕只有一张图也养成这个习惯 - 如果
axes是二维(如(2, 2)),用axes.flat[i]可以当一维遍历,比嵌套 for 更简洁 - 避免混用
plt.xxx()和ax.xxx():前者操作全局状态,后者操作具体对象,混用易出竞态
中文标签显示不了?不是字体问题,是 plt.rcParams 没关掉 usetex
即使装了中文字体、设置了 font.sans-serif,图里标题/坐标轴仍是方块,大概率是因为 plt.rcParams['text.usetex'] = True 在起作用——它强制走 LaTeX 渲染,而默认没配中文 LaTeX 支持。
这个配置常被隐藏在配置文件或早期 notebook cell 里,不容易发现;一旦开启,所有文本(包括 ax.set_title('测试'))都会尝试用 TeX 解析,失败就回退成方框。
- 检查方式:打印
plt.rcParams['text.usetex'],如果是True,立刻设为False - 顺手加上
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'],覆盖系统默认字体栈 - Mac 用户注意:
'Helvetica Neue'不支持中文,别把它放在列表最前
子图多了以后,每个 ax 上的 tick_params、grid、spines 设置容易漏,与其逐个写,不如用 for ax in axes.flat: 统一处理——这点容易被跳过,但省事且防错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











