Matplotlib 07-Python实验七-2 并排绘制多图.py
import numpy as np import matplotlib.pyplot as plt # 创建一些测试数据 x = np.linspace(0, 2*np.pi, 400) y = np.sin(x**2) # 创建一个画像 fig, ax = plt.subplots() ax.plot(x, y) ax.set_title('Simple plot') # 创建两个子图,共享Y轴 fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True) ax1.plot(x, y) ax1.set_title('Sharing Y axis') ax2.scatter(x, y) # 创建四个子图 fig, axs = plt.subplots(2, 2, subplot_kw=dict(projection="polar")) axs[0, 0].plot(x, y) axs[1, 1].scatter(x, y) plt.show()
逐行详细代码解释
程序功能:演示 matplotlib 3 种画布 / 子图创建方式:单图、一行 2 个子图、2×2 极坐标子图网格。 用到库:numpy 生成数据,matplotlib 绘图。
import numpy as np
import matplotlib.pyplot as plt
import numpy as np:导入 numpy,用来生成 x 数组、做数值计算import matplotlib.pyplot as plt:matplotlib 绘图模块,绘图核心
# 创建一些测试数据
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
np.linspace(0, 2*np.pi, 400):在区间 \([0,2\pi]\)(0~6.283)均匀生成400 个点,包含首尾,存入数组 x。- \(y=\sin(x^2)\):对数组 x 里每一个元素先平方,再求正弦,得到 y 数组。
这是一个频率随 x 变大而不断加快的振荡曲线。
# 创建一个画像
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
fig, ax = plt.subplots():创建1 张画布 fig + 1 个坐标轴 ax(单图,无分块子图)fig:画布对象,整张图片容器ax:绘图坐标系(子图对象)
ax.plot(x, y):在 ax 坐标系绘制折线图,x 横坐标,y 纵坐标ax.set_title('Simple plot'):给这个子图设置标题Simple plot
⚠️ 注意:执行这一段会弹出第一张独立窗口。
# 创建两个子图,共享Y轴
fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(x, y)
ax1.set_title('Sharing Y axis')
ax2.scatter(x, y)
plt.subplots(1,2, sharey=True)1,2:布局:1 行,2 列,一共 2 个子图sharey=True:两个子图共用同一套 Y 轴刻度,左右 Y 轴范围、刻度完全一致,方便对比数据- 返回画布 fig,以及子图对象元组
(ax1,ax2)
ax1.plot(x,y):左边子图 ax1 画折线,设置标题Sharing Y axisax2.scatter(x,y):右边子图 ax2 画散点图(一个个离散圆点,不是连续线条)
⚠️ 执行这段,弹出第二个独立窗口,窗口里面并排两张图。
# 创建四个子图
fig, axs = plt.subplots(2, 2, subplot_kw=dict(projection="polar"))
axs[0, 0].plot(x, y)
axs[1, 1].scatter(x, y)
plt.subplots(2,2, subplot_kw=dict(projection="polar"))2,2:布局 2 行 2 列,一共 4 个子图,axs是二维数组axs[行号,列号]subplot_kw=dict(projection="polar"):给所有子图设置极坐标投影,不再是直角坐标系(x-y 笛卡尔坐标),换成极坐标(半径 r,角度 θ)
axs[0,0].plot(x,y):第 0 行、第 0 列子图,绘制极坐标折线axs[1,1].scatter(x,y):第 1 行、第 1 列子图,绘制极坐标散点
其余两个子图
axs[0,1]、axs[1,0]创建了但是没有绘图,是空的。
⚠️ 执行这段,弹出第三个独立窗口,2×2 四个极坐标子图网格。
plt.show()
一次性渲染所有画布,弹出全部绘图窗口。
运行完整代码,会依次弹出3 个图片窗口: 窗口 1:单张直角坐标折线图 窗口 2:1 行 2 列子图(左折线,右散点,共享 Y 轴) 窗口 3:2×2 极坐标网格子图,仅左上、右下有图
✅ 核心知识点总结
plt.subplots(nrows, ncols):创建画布 + 子图网格,面向对象绘图写法(推荐)sharey=True / sharex=True:共享坐标轴,多子图对比常用ax.plot()折线图;ax.scatter()散点图subplot_kw=dict(projection="polar"):极坐标,代替普通直角坐标系- 多次调用
plt.subplots()会生成多张独立图片窗口,不是在一张图里叠加
易错点
- 多次
plt.subplots()不是新增子图,而是新建独立画布; axs是二维数组,访问方式axs[行,列];- 极坐标下,x 代表角度,y 代表径向半径,图形和直角坐标系视觉完全不同。

浙公网安备 33010602011771号