Matplotlib 绘制多图(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在数据可视化领域,Matplotlib 是 Python 开发者最常使用的工具之一。无论是科研报告、商业分析还是算法调试,通过图像直观展示数据规律始终是高效沟通的核心手段。当需要在同一页面中呈现多个图表时,如何灵活布局、统一风格并保持代码简洁性,便成为开发者必须掌握的关键技能。本文将围绕 "Matplotlib 绘制多图" 这一主题,从基础语法到高级技巧,通过具体案例逐步解析多图绘制的实现方法与最佳实践。

1.1 子图(Subplot)的直观理解

在 Matplotlib 中,"多图"通常指在同一画布(Figure)上创建多个子图(Axes)。想象一个房间被分割成多个区域,每个区域展示不同的内容——这便是子图布局的直观比喻。通过合理规划这些区域的位置和大小,开发者可以实现数据对比、趋势分析等复杂需求。

12 使用 plt.subplots() 快速创建基础布局

Matplotlib 提供了 plt.subplots() 函数,这是绘制多图最常用的接口。其核心参数包括:

  • nrows:子图的行数
  • ncols:子图的列数
  • figsize:整张画布的尺寸
  • sharex/sharey:是否共享坐标轴

示例代码

import matplotlib.pyplot as plt  
import numpy as np  

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))  

x = np.linspace(0, 10, 100)  
y1 = np.sin(x)  
y2 = np.cos(x)  
y3 = np.exp(x/10)  

axes[0,0].plot(x, y1, color='blue', label='Sine Wave')  
axes[0,0].set_title("Sine Function")  

axes[0,1].plot(x, y2, color='red', label='Cosine Wave')  
axes[0,1].set_title("Cosine Function")  

axes[1,0].plot(x, y3, color='green', label='Exponential Growth')  
axes[1,0].set_title("Growth Curve")  

fig.delaxes(axes[1,1])  

fig.suptitle("Basic Subplots Demonstration", fontsize=16, y=1.02)  
plt.tight_layout()  
plt.show()  

1.3 子图的坐标轴控制技巧

通过 sharexsharey 参数,可以实现多图坐标轴的同步控制。例如:

fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(10,4))  
ax1.plot(x, y1)  
ax2.scatter(x, y2)  

这组代码将使左右两个子图共享 y 轴范围,特别适合对比不同数据集的分布特征。

2.1 网格分隔的底层逻辑

当需要非均匀布局时,GridSpec 类提供了更精细的控制。它允许开发者将画布划分为自定义行列,并通过 subplotspec 参数指定每个子图占据的区域。

示例:创建异形布局

from matplotlib.gridspec import GridSpec  

fig = plt.figure(figsize=(10, 6))  
gs = GridSpec(nrows=3, ncols=3, figure=fig)  

ax1 = fig.add_subplot(gs[:, 0])  
ax1.plot(x, y1)  

ax2 = fig.add_subplot(gs[0:2, 1:])  
ax3 = fig.add_subplot(gs[2, 1:])  

ax2.scatter(x, y2, color='orange')  
ax3.bar(x[:10], y3[:10], color='purple')  

plt.tight_layout()  
plt.show()  

2.2 高级布局案例:仪表盘式图表

通过组合 GridSpecsubplots,可以构建复杂的可视化看板:

fig = plt.figure(figsize=(16, 8))  
gs = GridSpec(2, 3, figure=fig)  

ax_main = fig.add_subplot(gs[:, 0])  
ax_main.plot(x, y3, linewidth=2)  

ax1 = fig.add_subplot(gs[0, 1])  
ax2 = fig.add_subplot(gs[0, 2])  
ax3 = fig.add_subplot(gs[1, 1:])  

ax1.hist(y1, bins=20, color='skyblue')  
ax2.boxplot(y2)  
ax3.pie([len(y1), len(y2)], labels=['Sine', 'Cosine'], autopct='%1.1f%%')  

plt.tight_layout()  
plt.show()  

3.1 共享坐标轴的高级用法

通过 sharex=Truesharey=True 参数,不仅同步坐标范围,还能实现交互式联动。例如:

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)  
ax1.plot(x, y1)  
ax2.scatter(x, y2)  

当用户缩放下方子图的 x 轴时,上方子图的 x 轴范围会同步变化,这对时间序列数据对比特别有用。

3.2 通过 plt.style 统一全局样式

使用 plt.style 可以快速应用预定义样式,或自定义全局样式参数:

plt.style.use('seaborn')  # 应用 Seaborn 风格  

custom_style = {  
    'axes.titlesize': 14,  
    'xtick.color': '#333333',  
    'ytick.color': '#333333',  
    'grid.linestyle': '--',  
}  
plt.rcParams.update(custom_style)  

3.3 图例与标题的全局管理

当多个子图需要共享图例时,可以使用 plt.legend() 并结合 labelcolor 参数:

ax1.plot(..., label='Data 1')  
ax2.plot(..., label='Data 2')  

fig.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05),  
           ncol=2, frameon=False)  

4.1 内存管理与图像缓存

当绘制大量子图时,注意及时关闭不再使用的 Figure 对象:

plt.close(fig)  # 显式关闭画布  
del fig        # 释放内存引用  

4.2 分辨率与文件保存技巧

使用 dpi 参数控制图像分辨率,bbox_inches 去除空白边距:

plt.savefig('output.png', dpi=300, bbox_inches='tight', transparent=False)  

4.3 子图重叠与布局冲突解决

当子图元素(如标题、轴标签)发生重叠时,可通过以下方法调整:

  • 使用 plt.tight_layout() 自动优化间距
  • 手动设置 padh_pad 参数
  • 调整 fig.suptitley 坐标参数

5.1 科研论文级可视化

在学术场景中,推荐使用 plt.subplots() 结合 GridSpec 创建复杂的对比布局,并通过 matplotlib.ticker 精确控制刻度格式。

5.2 Web 应用集成

通过 plt.savefig() 生成 PNG/BMP 图像后,可将其嵌入到 Flask/Django 等 Web 框架中,实现动态图表展示。

5.3 动态交互扩展

结合 mpl_toolkitsplotly,可以将静态多图升级为可缩放、可交互的三维或动态可视化图表。

Matplotlib 绘制多图的能力,本质上是通过灵活的坐标轴管理和布局控制实现的。本文通过基础语法到高级技巧的递进讲解,展示了从简单网格到复杂异形布局的完整解决方案。开发者需要根据具体需求选择 subplots()GridSpec,并通过样式统一化和性能优化提升可视化质量。随着实践经验的积累,这些技能将帮助开发者在数据可视化领域构建出既专业又美观的多图展示方案。

提示:掌握本文中提到的 subplots() 参数配置、GridSpec 分区策略以及全局样式管理方法,是提升多图绘制效率的关键。建议读者通过实际修改代码参数,观察布局变化,逐步内化这些可视化技巧。

最新发布