Matplotlib 是 Python 最基础、最核心的绘图库,它功能强大,高度可定制,可以生成从简单的折线图、散点图到复杂的三维图形、统计图表等几乎所有类型的静态、动态和交互式图表,可以说,它是 Python 数据科学可视化工具的基石。

核心概念:三层结构
理解 Matplotlib 的三层结构是掌握其高级定制的关键:
-
后端层
- 这是 Matplotlib 的最底层,负责处理图形的渲染和显示。
- 它决定了你的图表是显示在交互式窗口中(如 Qt, Tkinter),还是保存为图片文件(如 PNG, PDF, SVG)。
- 通常我们不需要直接操作这一层,但了解它有助于解决一些显示问题。
-
艺术家层
- 这是 Matplotlib 的核心,也是面向对象的 API。
- 图表上的所有元素(如
Figure,Axes,Axis,Line2D,Text等)都是一个Artist对象。 - 你可以通过创建和修改这些
Artist对象来精确控制图表的每一个细节,这对于创建复杂的、非标准的图形非常有用。
-
脚本层 (Scripting Layer -
pyplot)
(图片来源网络,侵删)- 这是 Matplotlib 提供的最常用、最简单的接口,它是一个过程式的 API。
pyplot模块模仿了 MATLAB 的绘图风格,提供了一系列函数(如plt.plot(),plt.title())来快速绘图。- 它在底层自动管理了
Artist对象的创建和更新,让你能用更少的代码实现绘图,对于绝大多数日常任务,pyplot就足够了。
简单比喻:
- 脚本层 (
pyplot):像是在用自动挡的汽车,你只需告诉它去哪里(调用函数),它会自动处理换挡、油门等细节。 - 艺术家层:像是在手动挡的赛车,你可以精确控制每一个部件(
Artist对象),从而获得极致的性能和自定义效果。
基本使用流程 (使用 pyplot)
这是最常见、最简单的绘图方式,一个完整的绘图流程通常包括以下几步:
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
x = np.linspace(0, 10, 100) # 生成 0 到 10 之间的 100 个点
y = np.sin(x)
# 2. 创建图形和坐标轴
# plt.figure() 可以创建一个画布,但通常可以省略,让 pyplot 自动管理
plt.figure(figsize=(8, 5)) # 可选:指定画布大小
# 3. 绘制图形
plt.plot(x, y, label='sin(x)', color='blue', linestyle='--') # 绘制正弦曲线
# 4. 添加图表元素(让图表更易读)"Sine Wave Plot", fontsize=16) # 标题
plt.xlabel("X-axis", fontsize=12) # X轴标签
plt.ylabel("Y-axis", fontsize=12) # Y轴标签
plt.grid(True) # 显示网格
plt.legend() # 显示图例
# 5. 显示或保存图表
plt.show() # 显示图形(在 Jupyter Notebook 或脚本中)
# plt.savefig("sine_wave.png") # 保存图形为文件
常用图表类型
Matplotlib 支持几乎所有常见的图表类型。
a. 折线图
用于展示数据随时间或有序类别的变化趋势。

plt.plot(x, y)
b. 散点图
用于展示两个变量之间的关系。
x = np.random.rand(50) y = np.random.rand(50) plt.scatter(x, y, alpha=0.5)
c. 柱状图
用于比较不同类别的数据大小。
categories = ['A', 'B', 'C', 'D'] values = [15, 30, 45, 10] plt.bar(categories, values, color='skyblue')
d. 直方图
用于展示数据的分布情况。
data = np.random.randn(1000) # 生成1000个标准正态分布的随机数 plt.hist(data, bins=30, color='green', alpha=0.7)
e. 饼图
用于展示各部分占整体的比例。
sizes = [15, 30, 45, 10]
labels = ['A', 'B', 'C', 'D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal') # 保证饼图是圆的
f. 箱线图
用于展示数据的分布范围、中位数、异常值等统计信息。
data = np.random.randn(100, 5) # 5组数据,每组100个样本 plt.boxplot(data) plt.xticks([1, 2, 3, 4, 5], ['Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5'])
在 Jupyter Notebook 中使用 Matplotlib
在 Jupyter Notebook 中,为了能让图表直接在单元格内显示,通常需要在代码开头加上 "magic command":
# 这行代码让 Matplotlib 的图表直接在 Notebook 中显示
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
plt.plot([1, 2, 3, 4])
plt.ylabel('Some numbers')
plt.show() # 在 inline 模式下,plt.show() 有时不是必须的,但加上更保险
进阶定制与技巧
a. 使用 subplots 创建子图
当需要在一张图中展示多个图表时,plt.subplots() 非常方便。
fig, axes = plt.subplots(2, 2, figsize=(10, 8)) # 创建一个 2x2 的子图网格,画布大小为 10x8
# 绘制第一个子图 (左上)
axes[0, 0].plot(x, np.sin(x), 'b-')
axes[0, 0].set_title('Sine')
# 绘制第二个子图 (右上)
axes[0, 1].plot(x, np.cos(x), 'r--')
axes[0, 1].set_title('Cosine')
# 绘制第三个子图 (左下)
axes[1, 0].scatter(np.random.randn(50), np.random.randn(50))
axes[1, 0].set_title('Scatter')
# 绘制第四个子图 (右下)
axes[1, 1].bar(['A', 'B', 'C'], [3, 7, 2])
axes[1, 1].set_title('Bar')
# 调整子图间距,防止标签重叠
plt.tight_layout()
plt.show()
b. 使用面向对象的方式
当图形变得复杂时,直接操作 Axes 对象会更清晰。
fig, ax = plt.subplots(figsize=(8, 6))
# ax 是一个 Axes 对象,我们直接在它上面绘图
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
# 直接在 ax 对象上设置属性
ax.set_title("Trigonometric Functions")
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.grid(True)
ax.legend()
plt.show()
c. 样式设置
Matplotlib 提供了多种内置样式,可以快速美化图表。
# 查看所有可用的样式
print(plt.style.available)
# 使用一种样式
plt.style.use('seaborn-v0_8-whitegrid') # 这是一个非常受欢迎的样式
plt.plot(x, np.sin(x))"Styled Plot")
plt.show()
与其他库的关系
Matplotlib 是整个 Python 可视化生态的基石。
- Pandas: Pandas 的
.plot()方法底层就是调用了 Matplotlib,这使得可以直接在 DataFrame 或 Series 上快速绘图。import pandas as pd df = pd.DataFrame({'A': np.random.randn(100).cumsum(), 'B': np.random.randn(100).cumsum()}, index=pd.date_range('20250101', periods=100)) df.plot() # 等同于 df.plot.line() plt.show() - Seaborn: Seaborn 是一个基于 Matplotlib 的高级统计绘图库,它提供了更美观的默认样式和更简单的函数来绘制复杂的统计图表(如热力图、小提琴图等),Seaborn 在底层仍然使用 Matplotlib 进行渲染。
- Plotly: Plotly 是一个用于创建交互式、动态图表的库,它生成的图表可以在浏览器中进行缩放、悬停查看数据点等操作。
| 特性 | 描述 |
|---|---|
| 定位 | Python 数据可视化的基石,功能最全面。 |
| 优点 | - 功能强大,支持几乎所有图表类型 - 高度可定制,能精确控制每个元素 - 庞大的社区和丰富的文档 - 是其他高级库(如 Seaborn)的基础 |
| 缺点 | - 语法相对繁琐,默认样式不够美观 - 对于复杂图表,代码量可能较大 |
| 适用场景 | - 从简单的探索性数据分析到复杂的出版级图表 - 需要精细控制图表的每一个细节时 - 作为其他可视化库的后端引擎 |
学习建议:
- 从
pyplot开始:掌握plt.plot(),plt.title(),plt.xlabel()等基本函数,能解决 80% 的日常绘图需求。 - 学习
subplots:学会在一个画布上创建多个子图,这是数据比较时的必备技能。 - 了解面向对象 API:当需要绘制复杂图形或进行深度定制时,切换到
fig, ax的方式会让你的代码更清晰、更可控。 - 结合 Seaborn:当你觉得 Matplotlib 的默认样式不够好,或者想快速绘制统计图表时,直接使用 Seaborn,它会让你的图表更漂亮、代码更简洁。
