matplotlib简介

matplotlib 是 python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式进行绘图。

几个图像相关的定义:

图像(Figure)

定义:一个完整的绘图窗口或画布,相当于绘图的“纸”。

对应对象:plt.figure() 创建。

作用:容纳一个或多个坐标系(Axes)。

坐标系(Axes)

定义:显示数据的区域,通常包含 x 轴和 y 轴。

对应对象:fig.add_subplot()plt.subplot() 创建。

作用:在同一个 Figure 中可以有多个 Axes,比如一个窗口里显示多张小图。

坐标轴(Axis)

定义:控制坐标刻度和标签的对象,分为 X 轴(XAxis)和 Y 轴(YAxis)。

作用:

  • 显示刻度值(ticks
  • 控制坐标范围(plt.xlim() / plt.ylim()
  • 设置刻度标签(plt.xticks() / plt.yticks()

数据曲线(Line2D)

定义:由一系列点连接成的线,是 plt.plot() 返回的对象。

属性:

  • 颜色(color='r'
  • 线型(linestyle='--'
  • 线宽(linewidth=2
  • 标记(marker='o'

图例(Legend)

定义:显示曲线名称的标注。

创建方式:在 plt.plot() 中加 label='名称',然后用 plt.legend() 显示。

标题与标签

标题:plt.title("标题")

x 轴名称:plt.xlabel("x 轴名称")

y 轴名称:plt.ylabel("y 轴名称")

网格(Grid)

定义:背景参考线,用于帮助读取数值。

开启方式:plt.grid(True)

颜色(Color)

常用写法:

  • 字母:'r' 红,'g' 绿,'b'
  • 英文单词:color='red'
  • RGB:color=(0.2, 0.4, 0.6)
  • 十六进制:color='#1f77b4'

线型(Linestyle)

  • '-':实线(默认)
  • '--':虚线
  • '-.':点划线
  • ':':点线

标记(Marker)

  • 'o' 圆点
  • 's' 方形
  • '^' 上三角
  • '*' 星形
  • '+' 加号

绘图步骤

1. 导入必要库

1
2
import numpy as np      # 用于数值计算和生成数据
import matplotlib.pyplot as plt # 绘图库

2. 定义自变量(x 轴)

一般用 numpy.linspacenumpy.arange 来生成一系列连续的 x 值。

1
2
# 生成从 -10 到 10 的 200 个等间距的点
x = np.linspace(-10, 10, 200)

3. 定义函数(y 轴)

直接在 Python 中用数学公式写出来即可。

1
2
# 例如:y = sin(x)
y = np.sin(x)

4. 绘制图像

1
plt.plot(x, y, label='y = sin(x)', color='b')  # 画线并加标签

5. 美化图像(可选)

1
2
3
4
5
plt.title("Sine Function")   # 图像标题
plt.xlabel("x") # x 轴名称
plt.ylabel("y") # y 轴名称
plt.legend() # 显示图例
plt.grid(True) # 显示网格

6. 显示图像

1
plt.show()

完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import matplotlib.pyplot as plt

# 1. 定义自变量
x = np.linspace(-10, 10, 200)

# 2. 定义函数
y = np.sin(x)

# 3. 绘制图像
plt.plot(x, y, label='y = sin(x)', color='b', linewidth=2)

# 4. 添加标题、标签、网格和图例
plt.title("Sine Function")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(True)

# 5. 显示图像
plt.show()

隐式创建机制

当你调用

1
plt.plot(...)

的时候,matplotlib 会:

  1. 检查当前是否有 Figure(画布)存在,如果没有,就创建一个默认的 Figure
  2. 在这个 Figure 上放一个默认的 Axes(坐标系)。
  3. 在 Axes 中画你的线条。

所以,即使你没写 fig, ax = plt.subplots(),它也会帮你自动搞定。

显式创建写法

1
2
3
4
5
6
7
8
9
10
11
12
13
fig, ax = plt.subplots()  # 显式创建 Figure 和 Axes

x = np.linspace(-10, 10, 200)
y = np.sin(x)

ax.plot(x, y, label='y = sin(x)', color='b', linewidth=2) # 在 ax 这个坐标系上画
ax.set_title("Sine Function")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.legend()
ax.grid(True)

plt.show()

多个子图

subplots()matplotlib 里同时创建 Figure(画布) 和一个或多个 Axes(坐标系) 的常用方法。
它的强大之处在于:可以一次性创建多个子图,方便你在一个窗口里比较不同的函数或数据。

1
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(宽, 高), dpi=分辨率)
  • nrows:子图的行数
  • ncols:子图的列数
  • figsize:画布大小(英寸)
  • dpi:分辨率(每英寸像素点数)

返回值:

  • figFigure 对象(整个画布)
  • axAxes 对象(一个或多个坐标系)

默认返回1行1列的子图

多个子图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fig, ax = plt.subplots(2, 2, figsize=(8, 6))  # 创建2x2子图

x = np.linspace(0, 2*np.pi, 200)

ax[0, 0].plot(x, np.sin(x))
ax[0, 0].set_title("sin(x)")

ax[0, 1].plot(x, np.cos(x))
ax[0, 1].set_title("cos(x)")

ax[1, 0].plot(x, np.tan(x))
ax[1, 0].set_title("tan(x)")

ax[1, 1].plot(x, np.exp(x/5))
ax[1, 1].set_title("exp(x/5)")

plt.tight_layout() # 自动调整子图间距
plt.show()

注意

  • 多个子图时,ax 是一个二维 numpy 数组(行、列索引)。
  • 如果是 nrows=1ncols=1ax 可能是一维数组或直接是单个对象。

共享坐标轴

1
fig, ax = plt.subplots(2, 1, sharex=True, sharey=False)
  • sharex=True:共享 x 轴范围
  • sharey=True:共享 y 轴范围
  • 好处:对齐刻度,方便比较