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 axis
  • ax2.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 极坐标网格子图,仅左上、右下有图

✅ 核心知识点总结

  1. plt.subplots(nrows, ncols):创建画布 + 子图网格,面向对象绘图写法(推荐)
  2. sharey=True / sharex=True:共享坐标轴,多子图对比常用
  3. ax.plot() 折线图;ax.scatter() 散点图
  4. subplot_kw=dict(projection="polar"):极坐标,代替普通直角坐标系
  5. 多次调用plt.subplots()会生成多张独立图片窗口,不是在一张图里叠加

易错点

  • 多次plt.subplots()不是新增子图,而是新建独立画布;
  • axs是二维数组,访问方式 axs[行,列];
  • 极坐标下,x 代表角度,y 代表径向半径,图形和直角坐标系视觉完全不同。

 

posted @ 2026-10-21 11:44  emanlee  阅读(4)  评论(0)    收藏  举报