老码农和你一起学AI:Python系列-Matplotlib 核心架构

在数据可视化领域,Matplotlib 就像一位全能的画家 —— 它能画出折线图、柱状图等基础图表,也能创作热力图、3D 图等复杂作品。但要真正用好这位 “画家”,首先得理解它的 “创作工具”:Figure 与 Axes 对象的关系、绘图的基本流程、图表保存的关键参数,以及如何统一调整图表风格。这些基础架构知识,是从 “能画图” 到 “画好图” 的关键。

一、Figure 与 Axes

如果把 Matplotlib 的绘图过程比作在画室创作,那么 Figure 和 Axes 就是最核心的两个工具 —— 前者是 “画布”,后者是画布上的 “绘图区域”。

1.1 核心关系

  • Figure 对象:相当于物理世界的 “画布”,是所有绘图元素的容器。当我们启动 Matplotlib 时,首先要创建一个 Figure,它就像一张白纸,本身不直接用于绘图,但决定了图表的整体尺寸、背景等基础属性。
  • Axes 对象:是画布上的 “绘图区域”(可以理解为 “子图”),所有的线条、文字、坐标轴都画在 Axes 上。一个 Figure 可以包含多个 Axes(比如在一张画布上画 4 个小图),但一个 Axes 只能属于一个 Figure。

用代码直观感受两者的关系:

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(面向对象)模式。前者适合快速出图,后者适合复杂图表定制,理解两者的区别能让绘图效率翻倍。

2.1 plt.subplots ()

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()

2.2 OOP 模式

当需要绘制多子图、嵌套图表,或对图表元素(如坐标轴刻度、网格线)做精细调整时,OOP 模式更合适。它的核心是 “直接操作 Figure 和 Axes 对象”,而非依赖 plt 的全局函数。

OOP 模式的典型流程:

  • 手动创建 Figure(fig = plt.figure())
  • 向 Figure 添加 Axes(ax = fig.add_subplot(行, 列, 位置))
  • 通过 Axes 对象的方法(ax.plot()、ax.set_*())绘图

示例:用 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()

2.3 两种模式的核心区别

  • 快速模式(plt.subplots ()):自动关联 Figure 和 Axes,适合单图或简单多子图,代码更短。
  • OOP 模式:手动管理 Figure 和 Axes,适合复杂布局(如子图大小不一、嵌套图表),控制更精细。

三、保存图表:fig.savefig () 的关键参数

画好的图表需要保存为图片(用于报告、论文或网页),fig.savefig()是最可靠的保存方式。它的参数直接影响图片质量和显示效果,其中 4 个参数最关键。

3.1 基础用法

fig, ax = plt.subplots()

ax.plot([1, 2, 3], [2, 4, 6])

# 保存为PNG格式(默认),路径为当前目录

fig.savefig('my_plot.png')

# 保存为PDF(矢量图,放大不失真)

fig.savefig('my_plot.pdf')

3.2 核心参数

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(运行时配置参数)可以 “一劳永逸”—— 提前定义全局风格,所有图表自动应用。

4.1 核心配置

最常用的配置包括:字体(避免中文乱码)、默认尺寸、线条样式等。


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()

4.2 临时生效与永久配置

  • 临时生效:上述代码仅在当前脚本中生效,关闭后恢复默认。
  • 永久配置:找到 Matplotlib 的配置文件(matplotlibrc),修改对应参数(适合固定工作环境)。

最后小结

Matplotlib 的基础架构看似是 “工具使用规则”,实则是一种 “绘图思维”:

  • 先有画布(Figure),再划分绘图区(Axes);
  • 简单图用快速模式,复杂图用 OOP 模式;
  • 保存时关注清晰度和完整性,全局设置提升效率。

理解这些逻辑后,无论面对简单的数据展示还是复杂的多图组合,都能快速找到绘图思路。下一节课,我们将基于这些基础,深入学习 Axes 对象的绘图细节 —— 如何用它画出更丰富的图表元素。

你可能感兴趣的:(熬之滴水穿石,matplotlib,python)