在数据可视化领域,Matplotlib 就像一位全能的画家 —— 它能画出折线图、柱状图等基础图表,也能创作热力图、3D 图等复杂作品。但要真正用好这位 “画家”,首先得理解它的 “创作工具”:Figure 与 Axes 对象的关系、绘图的基本流程、图表保存的关键参数,以及如何统一调整图表风格。这些基础架构知识,是从 “能画图” 到 “画好图” 的关键。
如果把 Matplotlib 的绘图过程比作在画室创作,那么 Figure 和 Axes 就是最核心的两个工具 —— 前者是 “画布”,后者是画布上的 “绘图区域”。
用代码直观感受两者的关系:
import matplotlib.pyplot as plt
# 创建一个Figure(画布),同时创建1个Axes(绘图区)
fig, ax = plt.subplots() # fig是Figure对象,ax是Axes对象
# 在Axes上绘图
ax.plot([1, 2, 3], [2, 4, 6]) # 画一条直线
# 显示图表
plt.show()
如果需要在一张画布上画多个绘图区,可以指定行数和列数:
# 创建1行2列的Axes(共2个绘图区)
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2)
# 分别在两个Axes上绘图
ax1.plot([1, 2, 3], [1, 4, 9], color='red') # 红色曲线
ax2.bar([1, 2, 3], [3, 1, 4], color='blue') # 蓝色柱状图
plt.show()
此时的 Figure 就像一张分了两格的画布,两个 Axes 分别在左右格子里独立绘图,互不干扰。
Matplotlib 提供了两种绘图模式:plt.subplots () 快速模式和OOP(面向对象)模式。前者适合快速出图,后者适合复杂图表定制,理解两者的区别能让绘图效率翻倍。
plt.subplots () 是最常用的入口,它的核心作用是 “一键创建 Figure 和 Axes”,返回的 fig(Figure)和 ax(Axes)可以直接使用。这种模式的优势是简洁 —— 不需要手动创建 Figure 和 Axes,适合快速绘制单个或少量子图。
示例:快速绘制带标题和坐标轴标签的折线图
import matplotlib.pyplot as plt
# 1. 创建画布和绘图区
fig, ax = plt.subplots(figsize=(8, 4)) # figsize指定画布尺寸(宽8英寸,高4英寸)
# 2. 在绘图区添加元素
ax.plot([1, 2, 3, 4], [1, 3, 2, 4], label='数据曲线') # 绘图并添加标签
ax.set_title('示例折线图') # 设置标题
ax.set_xlabel('X轴') # X轴标签
ax.set_ylabel('Y轴') # Y轴标签
ax.legend() # 显示图例
# 3. 显示图表
plt.show()
当需要绘制多子图、嵌套图表,或对图表元素(如坐标轴刻度、网格线)做精细调整时,OOP 模式更合适。它的核心是 “直接操作 Figure 和 Axes 对象”,而非依赖 plt 的全局函数。
OOP 模式的典型流程:
示例:用 OOP 模式创建 2x2 网格的子图
import matplotlib.pyplot as plt
# 1. 创建画布(指定尺寸和分辨率)
fig = plt.figure(figsize=(10, 8), dpi=100) # dpi:每英寸像素数(影响清晰度)
# 2. 向画布添加4个Axes(2行2列)
ax1 = fig.add_subplot(2, 2, 1) # 第1行第1列
ax2 = fig.add_subplot(2, 2, 2) # 第1行第2列
ax3 = fig.add_subplot(2, 2, 3) # 第2行第1列
ax4 = fig.add_subplot(2, 2, 4) # 第2行第2列
# 3. 分别绘图
ax1.plot([1, 2, 3], [1, 2, 3], color='green')
ax2.scatter([1, 2, 3], [3, 2, 1], color='orange') # 散点图
ax3.bar([1, 2, 3], [2, 5, 3], color='purple') # 柱状图
ax4.pie([30, 40, 30], labels=['A', 'B', 'C']) # 饼图
# 4. 调整子图间距(避免标签重叠)
fig.tight_layout()
plt.show()
画好的图表需要保存为图片(用于报告、论文或网页),fig.savefig()是最可靠的保存方式。它的参数直接影响图片质量和显示效果,其中 4 个参数最关键。
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 6])
# 保存为PNG格式(默认),路径为当前目录
fig.savefig('my_plot.png')
# 保存为PDF(矢量图,放大不失真)
fig.savefig('my_plot.pdf')
dpi(分辨率):单位是 “像素 / 英寸”,数值越高图片越清晰(但文件越大)。打印或论文建议 300,屏幕显示建议 100-150。
fig.savefig('high_res.png', dpi=300)
bbox_inches(边界调整):解决 “标签被裁剪” 的问题。设置为'tight'会自动裁剪空白区域,确保标题、坐标轴标签完整显示。
fig.savefig('no_cut.png', bbox_inches='tight')
transparent(背景透明):保存为 PNG 时,设置transparent=True可让背景透明(适合嵌入 PPT 或网页)。
fig.savefig('transparent.png', transparent=True)
pad_inches(边距):配合bbox_inches='tight'使用,控制裁剪后的边距(默认 0.1 英寸)。
fig.savefig('with_margin.png', bbox_inches='tight', pad_inches=0.5)
如果每次绘图都要调整字体、线条颜色,会非常繁琐。Matplotlib 的rcParams(运行时配置参数)可以 “一劳永逸”—— 提前定义全局风格,所有图表自动应用。
最常用的配置包括:字体(避免中文乱码)、默认尺寸、线条样式等。
import matplotlib.pyplot as plt
# 查看所有可配置参数(可选)
# print(plt.rcParams.keys())
# 设置全局参数
plt.rcParams.update({
# 字体:支持中文(SimHei黑体、Microsoft YaHei微软雅黑等)
'font.family': ['SimHei', 'WenQuanYi Micro Hei', 'Heiti TC'],
# 坐标轴刻度和标签的字体大小
'axes.labelsize': 12,
'xtick.labelsize': 10,
'ytick.labelsize': 10,
# 标题字体大小
'axes.titlesize': 14,
# 默认画布尺寸
'figure.figsize': (8, 5),
# 默认分辨率
'figure.dpi': 100,
# 线条宽度
'lines.linewidth': 2.0
})
# 测试配置效果:中文标题正常显示
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 6])
ax.set_title('中文标题测试') # 不再乱码
ax.set_xlabel('X轴(中文)')
plt.show()
Matplotlib 的基础架构看似是 “工具使用规则”,实则是一种 “绘图思维”:
理解这些逻辑后,无论面对简单的数据展示还是复杂的多图组合,都能快速找到绘图思路。下一节课,我们将基于这些基础,深入学习 Axes 对象的绘图细节 —— 如何用它画出更丰富的图表元素。