一.Matplotlib的概念
Matplotlib 是 Python 生态中最核心、最基础的 2D 数据可视化库,被称为 Python 数据可视化的 "泰斗"。
- 核心能力:生成出版级质量的静态、动态、交互式图表,支持折线图、柱状图、散点图、饼图等几乎所有常见图表类型。
- 应用场景:可用于 Python 脚本、Jupyter Notebook、Web 应用、GUI 工具等,是 pandas、seaborn 等高级可视化库的底层基础(这些库本质是对 Matplotlib 的封装)。
- 核心优势:高度可定制化,能精准控制图表的每一个细节(线条、颜色、标签、字体等),是数据分析师、科研人员的必备工具。
二、一个最简单的绘图例子
Matplotlib 绘图的核心是两个层级:
- Figure(画布):整个图表的最外层容器,相当于我们画图的 "纸",可以是窗口、Jupyter 单元格等。
- Axes(坐标轴 / 子图):画在 Figure 上的、带坐标系的绘图区域,一个 Figure 可以包含 1 个或多个 Axes。
简单来说:Figure 是画布,Axes 是画布上的画纸,所有的图表元素(线条、标签、刻度)都画在 Axes 上。
1.面向对象式
这是 Matplotlib 官方推荐的标准写法,适合复杂图表和精细化控制
# 1. 导入依赖库
import matplotlib.pyplot as plt
import numpy as np
# 2. 创建画布(figure)和坐标轴(axes)
fig, ax = plt.subplots() # 默认创建1个Axes,也可指定行列数,如 plt.subplots(2,1) 创建2行1列的子图
# 3. 在Axes上绘制折线图
# plot(横坐标列表, 纵坐标列表)
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
# 4. 显示图表(Jupyter中可省略,脚本中必须加)
plt.show()
运行效果:

2.pyplot 式
这种写法模仿 MATLAB 的语法,自动创建 Axes,适合快速绘图、简单场景。
# 导入依赖库
import matplotlib.pyplot as plt
# 直接调用 plt.plot() 绘图,Matplotlib 自动创建 Figure 和 Axes
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
# 显示图表
plt.show()
运行效果:

三、Figure 的组成
1.Matplotlib 的图表是一个层级化的容器结构,从顶层到底层依次为:
| 层级 | 名称 | 核心作用 | 对应操作 |
|---|---|---|---|
| 顶层 | Figure(画布) | 整个图表的最外层容器,容纳所有绘图元素 | plt.figure() / fig = plt.figure() |
| 核心 | Axes(子图 / 坐标轴区域) | Matplotlib 的核心,一个 Figure 可包含 1 个或多个 Axes,是真正的绘图区域 | fig.subplots() / ax = plt.subplots() |
| 从属 | Axis(坐标轴) | Axes 的下属层级,处理坐标轴、网格等相关元素 | ax.xaxis / ax.yaxis |
| 底层 | Tick(刻度) | Axis 的下属层级,处理刻度、刻度标签等细节 | ax.xaxis.set_major_locator() 等 |
2.完整图表的所有元素
1. 基础容器类
- Figure:最外层画布,控制图表大小、背景色等
- Axes:子图区域,所有绘图操作的核心载体
- Spine(坐标轴脊线) :包围 Axes 的四条边框,可隐藏、修改样式(
ax.spines)
2. 坐标轴与刻度类
- Axis(x/y 轴):坐标轴对象,控制轴的范围、样式
- Major tick(主刻度) :主刻度线,对应大的数值标记(
ax.yaxis.set_major_locator) - Minor tick(次刻度) :次刻度线,用于更精细的刻度划分(
ax.yaxis.set_minor_locator) - Major/Minor tick label(刻度标签) :刻度上的文字,可自定义格式(
set_major_formatter) - xlabel /ylabel(坐标轴标签) :坐标轴的说明文字(
ax.set_xlabel()/ax.set_ylabel())
3. 数据与装饰类
- Line(线条) :折线图的线条,通过
ax.plot()绘制 - Markers(标记) :散点图的标记点,通过
ax.scatter()绘制 - Title(标题) :图表的标题(
ax.set_title()) - Grid(网格线) :背景网格,辅助读数(
ax.grid()) - Legend(图例) :标注不同数据系列的含义(
ax.legend())
四、两种核心绘图接口详解
Matplotlib 提供了两种完全等效的绘图方式,适用于不同场景:
1. 面向对象式(OO 模式)
核心逻辑 :显式创建 figure 和 axes 对象,所有操作都通过对象方法完成,逻辑清晰、可维护性高。
import matplotlib.pyplot as plt
import numpy as np
# 1. 生成数据:0到2之间取100个等间距点
x = np.linspace(0, 2, 100)
# 2. 显式创建figure和axes
fig, ax = plt.subplots()
# 3. 在axes上绘制三条曲线
ax.plot(x, x, label='linear') # 一次函数 y=x
ax.plot(x, x**2, label='quadratic') # 二次函数 y=x²
ax.plot(x, x**3, label='cubic') # 三次函数 y=x³
# 4. 配置图表元素
ax.set_xlabel('x label') # x轴标签
ax.set_ylabel('y label') # y轴标签
ax.set_title("Simple Plot") # 图表标题
ax.legend() # 显示图例
# 5. 显示图表(脚本中必须,Jupyter中可省略)
plt.show()
运行效果

- 优势 :
- 逻辑清晰,每个操作都明确作用于哪个
axes,多子图场景下不会混淆 - 高度可定制,适合复杂图表、科研绘图、生产环境
- 符合 Python 面向对象的编程思想,可维护性强
- 逻辑清晰,每个操作都明确作用于哪个
2. pyplot 式(MATLAB 风格)
核心逻辑 :依赖 pyplot 自动创建 figure 和 axes,所有操作都通过 plt.xxx() 完成,代码极简。
import matplotlib.pyplot as plt
import numpy as np
# 1. 生成数据
x = np.linspace(0, 2, 100)
# 2. 直接调用plt.plot绘图,自动创建figure和axes
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
# 3. 配置图表元素
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
# 4. 显示图表
plt.show()
运行效果
- 优势 :
- 代码极简,一行绘图,适合快速探索数据、简单可视化
- 语法和 MATLAB 高度相似,MATLAB 用户上手无压力
- 劣势 :
- 多子图场景下容易混淆当前操作的
axes,不适合复杂定制 - 代码可维护性差,大型项目不推荐
- 多子图场景下容易混淆当前操作的
3.两种接口的核心对比
| 对比维度 | 面向对象式(OO 模式) | pyplot 式(MATLAB 风格) |
|---|---|---|
| 创建方式 | 显式创建 fig, ax = plt.subplots() |
隐式自动创建,无需手动声明 |
| 操作方式 | 所有操作通过 ax.xxx() 完成 |
所有操作通过 plt.xxx() 完成 |
| 代码复杂度 | 稍多,需手动创建对象 | 极简,一行绘图 |
| 灵活性 | 极高,支持多子图、精细化控制 | 一般,简单场景够用 |
| 适用场景 | 复杂图表、科研绘图、生产环境 | 快速探索、简单可视化、MATLAB 迁移 |
| 可维护性 | 高,逻辑清晰,不易出错 | 低,多子图易混淆 |
| 官方推荐 | 官方推荐标准写法 | 仅用于快速绘图 |