matplotlib 是 Python 最基础、最核心的数据绘图库,它功能强大,高度可定制,几乎可以绘制任何你想要的静态、动态和交互式图表,很多其他流行的可视化库(如 Seaborn、Pandas 的内置绘图功能)都是建立在 matplotlib 之上的。

为什么使用 Matplotlib?
- 基础且强大:它是 Python 数据可视化的基石,提供了最底层的绘图控制。
- 高度可定制:你可以控制图表的几乎每一个元素(坐标轴、线条、颜色、标签、图例等)。
- 兼容性好:与 NumPy、Pandas 等科学计算库无缝集成。
- 丰富的图表类型:支持线图、散点图、柱状图、直方图、饼图、箱线图、热力图、3D 图等。
- 广泛的应用:从简单的数据探索到学术论文的图表制作,都能胜任。
核心概念与基本用法
理解 matplotlib 的基本工作原理是高效使用它的关键。
a. 架构
matplotlib 的架构可以分为三层:
- 后端层:负责处理图形的渲染和显示,将图形渲染成 PNG、SVG 图片,或者在交互式窗口中显示,通常我们不需要直接接触这一层。
- 艺术家层:这是
matplotlib的核心,你看到的所有图表元素(如图表、坐标轴、线条、文本、图例等)都是一个“Artist”对象,你可以通过创建和修改这些对象来精确控制图表的方方面面,这是进行高级定制的主要方式。 - 脚本层 (Scripting Layer -
pyplot):这是大多数用户接触的层面。matplotlib.pyplot模块提供了一个类似 MATLAB 的接口,它简化了绘图过程,让你能用几行代码快速创建图表,它在底层自动管理了 Artist 对象的创建和更新。
推荐:对于初学者和大多数日常任务,直接使用 pyplot 足矣,当你需要对图表进行精细控制时,就需要深入了解 Artist 层。
b. 基本绘图流程
一个典型的 matplotlib 绘图流程如下:

-
导入库:
import matplotlib.pyplot as plt import numpy as np # 通常会和 numpy 一起使用
-
准备数据:
x = np.linspace(0, 10, 100) # 创建一个从0到10的数组,包含100个点 y = np.sin(x)
-
创建图表和坐标轴:
plt.figure()创建一个图表窗口(一个 Figure 对象),plt.subplots()可以同时创建图表和一组坐标轴(一个 Axes 对象)。Axes是绘图的实际区域,我们大部分操作都在 Axes 上进行。fig, ax = plt.subplots() # 推荐的方式,可以获得 ax 对象进行更灵活的控制 # 或者简单点 # plt.figure()
-
在坐标轴上绘图: 使用
ax.plot()、ax.scatter()、ax.bar()等方法。ax.plot(x, y, label='sin(x)', color='blue', linestyle='--')
-
添加图表元素(装饰图表): 添加标题、坐标轴标签、图例、网格等。
ax.set_title("Sine Wave") # 设置标题 ax.set_xlabel("X-axis") # 设置x轴标签 ax.set_ylabel("Y-axis") # 设置y轴标签 ax.legend() # 显示图例 ax.grid(True) # 显示网格 -
显示或保存图表:
plt.show()在一个新窗口中显示图表。plt.savefig()将图表保存为文件。plt.savefig("sine_wave.png") # 保存为PNG文件 plt.show() # 显示图表
常用图表类型示例
a. 线图
最常用的图表,用于展示数据随时间或某个连续变量的变化趋势。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.arange(0, 5, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制两条线
ax.plot(x, y1, label='Sine', color='blue', linestyle='-')
ax.plot(x, y2, label='Cosine', color='red', linestyle='--')
# 添加装饰
ax.set_title("Sine and Cosine Waves")
ax.set_xlabel("Angle in radians")
ax.set_ylabel("Value")
ax.legend()
ax.grid(True)
plt.show()
b. 散点图
用于展示两个变量之间的关系。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50) # 点的大小
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制散点图
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
# 添加颜色条
fig.colorbar(scatter, ax=ax, label="Color Value")
# 添加装饰
ax.set_title("Random Scatter Plot")
ax.set_xlabel("X Value")
ax.set_ylabel("Y Value")
plt.show()
c. 柱状图
用于比较不同类别之间的数据大小。
import matplotlib.pyplot as plt
# 准备数据
categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制柱状图
bars = ax.bar(categories, values, color=['skyblue', 'salmon', 'lightgreen', 'gold'])
# 在柱子上方添加数值标签
ax.bar_label(bars, fmt='%d')
# 添加装饰
ax.set_title("Category Comparison")
ax.set_xlabel("Category")
ax.set_ylabel("Value")
plt.show()
d. 直方图
用于展示数据的分布情况。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据 (生成1000个符合正态分布的随机数)
data = np.random.randn(1000)
# 创建图表和坐标轴
fig, ax = plt.subplots()
# 绘制直方图
ax.hist(data, bins=30, color='purple', alpha=0.7, edgecolor='black')
# 添加装饰
ax.set_title("Distribution of Random Data")
ax.set_xlabel("Value")
ax.set_ylabel("Frequency")
plt.show()
样式与美化
matplotlib 提供了多种方式来美化图表。
a. 内置样式
matplotlib 内置了多种预设样式,可以一键改变图表的整体外观。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 设置样式
plt.style.use('seaborn-v0_8-darkgrid') # 尝试 'ggplot', 'bmh', 'fivethirtyeight' 等
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("Styled Plot")
plt.show()
b. 使用 rcParams 全局配置
你可以通过修改 matplotlib.rcParams 字典来全局设置字体、线宽、颜色等。
import matplotlib.pyplot as plt
import numpy as np
# 全局设置
plt.rcParams.update({
'font.size': 12,
'font.family': 'serif',
'axes.labelsize': 14,
'axes.titlesize': 16,
'xtick.labelsize': 10,
'ytick.labelsize': 10,
'lines.linewidth': 2,
'grid.color': 'gray',
'grid.linestyle': ':'
})
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("Global RCParams Styled Plot")
plt.show()
与 Pandas 的结合使用
在数据分析中,我们通常使用 Pandas 处理数据,然后用 matplotlib 进行可视化,Pandas 的 DataFrame 和 Series 对象内置了 .plot() 方法,该方法底层就是调用 matplotlib。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建一个 Pandas DataFrame
data = {
'Date': pd.to_datetime(pd.date_range('20250101', periods=10)),
'Sales': np.random.randint(100, 500, size=10),
'Profit': np.random.randint(20, 100, size=10)
}
df = pd.DataFrame(data)
df.set_index('Date', inplace=True)
# 使用 Pandas 内置的 plot 方法
# kind='line' 是默认值
df.plot(kind='line',
title='Sales and Profit Over Time',
ylabel='Amount ($)',
marker='o', # 在数据点上添加圆圈标记
colormap='viridis') # 使用颜色映射
# 获取当前的坐标轴对象,并添加图例
plt.gca().legend(title='Metrics')
plt.grid(True)
plt.show()
# 绘制柱状图
df.plot(kind='bar',
title='Sales and Profit by Day',
ylabel='Amount ($)',
figsize=(10, 6))
plt.show()
进阶技巧
a. 子图
在一个图表窗口中绘制多个小图表。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建一个 2x1 的子图布局
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
# 在第一个子图上绘制
ax1.plot(x, y1, 'r-')
ax1.set_title('Sine Wave')
ax1.grid(True)
# 在第二个子图上绘制
ax2.plot(x, y2, 'b-')
ax2.set_title('Cosine Wave')
ax2.set_xlabel('X-axis')
ax2.grid(True)
# 调整子图间距,防止标签重叠
plt.tight_layout()
plt.show()
b. 3D 绘图
需要导入 Axes3D 工具包。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
# 准备数据
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# 绘制3D曲面
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_title("3D Surface Plot")
plt.show()
总结与学习资源
matplotlib 是一个功能极其丰富的库,本指南只涵盖了其核心用法,要精通它,需要大量的实践和查阅官方文档。
核心要点:
- 从
plt.subplots()开始,获取ax对象进行操作是更现代和灵活的方式。 - 数据准备 -> 创建画布 -> 绘图 -> 装饰 -> 显示/保存”的流程。
- 善用
plt.style和rcParams快速美化图表。 - 与 Pandas 结合使用,能让数据分析流程更顺畅。
学习资源:
- 官方文档:Matplotlib Documentation (最权威、最全面)
- 教程:Matplotlib Tutorials
- 示例库:Matplotlib Gallery (寻找你想要的图表类型,查看其源码是最好的学习方式)
