subplot 是 Python Matplotlib 库里面的函数,作用是在同一个画布 figure 里面创建多张子图,把画布划分成网格,在指定位置生成独立坐标轴,方便一张图里面并排或者多行多列展示多组数据,是数据可视化最常用的多图布局函数,基础语法是 plt.subplot (nrows, ncols, index),也就是行数 列数 当前子图序号,序号是从 1 开始计数,从左到右从上到下编号,很多新手容易把序号从 0 开始,这个是高频错误,同时新版 Matplotlib 也支持 subplot 返回 axes 对象的写法,结合面向对象绘图方式,灵活控制每一张子图。
基础语法对照表
| 参数 | 含义 |
|---|---|
| nrows | 网格总行数 |
| ncols | 网格总列数 |
| index | 当前选中子图位置,从 1 开始 |
最简基础代码示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
划分成2行1列,选中第1张子图
plt.subplot(2,1,1)
plt.plot(x, np.sin(x))
plt.title("sin曲线")
选中第2张子图
plt.subplot(2,1,2)
plt.plot(x, np.cos(x))
plt.title("cos曲线")
plt.tight_layout()
plt.show()
常用写法分类
第一种 pyplot 接口写法
也就是 plt.subplot,属于简洁写法,适合快速绘图,每次调用 subplot 之后,后续 plot title 等操作都会作用在当前激活的子图上。
第二种 面向对象写法 ax = plt.subplot (...)
把坐标轴对象 ax 保存下来,之后通过 ax.plot ax.set_title 操作子图,推荐项目代码使用,多图管理更清晰。
ax1 = plt.subplot(2,2,1)
ax1.plot(x, x2)
ax1.set_title("平方")
常用拓展要点
1 网格划分举例 2 行 2 列 也就是 2 2 1,2 2 2,2 2 3,2 2 4,对应四个子图
2 tight_layout 可以自动调整子图间距,解决标题坐标轴文字重叠
3 subplot 和 subplots 区分,subplots 是一次性批量生成全部子图,返回 fig 和 ax 数组,subplot 是单次创建激活单个子图
4 如果想要跨行列合并子图,需要使用 subplot2grid 或者 gridspec,普通 subplot 不能合并单元格
学习操作步骤
第一步 导入 matplotlib.pyplot 和 numpy
第二步 确定画布网格,填写 nrows ncols
第三步 调用 subplot 指定 index,激活目标子图
第四步 在该子图上绘图 添加标题坐标轴标签
第五步 切换下一个 index,绘制下一张子图
第六步 调用 tight_layout 调整布局,最后 show 展示画布
易错提醒
index 编号是从 1 开始,不是从 0 开始,写 0 会报错
多次调用 subplot 的时候,网格参数要保持一致,不能中途修改行列总数
子图标题用 plt.title,面向对象 ax 方式要用 ax.set_title,不能混用
【常见问题】
问题 1 subplot 怎么用,序号是从 0 开始吗
回答 1 subplot 怎么用,subplot 的 index 序号是从 1 开始,按照从上到下从左到右排序,不是从 0 开始。
问题 2 subplot 怎么用,subplot 和 subplots 有什么区别
回答 2 subplot 怎么用,subplot 是单次激活一张子图,subplots 一次性生成全部子图,返回 axes 数组,适合批量操作。
问题 3 subplot 怎么用,子图文字重叠怎么解决
回答 3 subplot 怎么用,绘制完成之后加上 plt.tight_layout,自动调整 subplot 子图之间间距,解决文字重叠。
问题 4 subplot 怎么用,可以实现跨格子合并子图吗
回答 4 subplot 怎么用,基础 subplot 不能跨格合并,跨行列布局需要改用 gridspec 或者 subplot2grid。
【免责申明】
本内容为 Matplotlib 代码科普,不同版本库函数参数可能存在细微差异,请结合对应版本官方文档核对。


