Python绘图库之Matplotlib:图与子图(Figure subfigures)

本篇博客详细介绍了如何使用Matplotlib v3.4及以上版本绘制包含多个子图区域的图文件,此处的子图与子绘图区域(axes)有所区别。本篇博客内容参考了官方文档Figure subfigures,并在此基础上进一步取舍和补充,仅供学习和参考。🚀🚀🚀

简介

在使用Python的绘图库Matplotlib进行科研等绘图时,有时我们希望一个Figure中能有多个子图(subfigure),而不仅仅是多个Axes绘图区域。这个可以通过嵌套使用Matplotlib自带的布局管理工具gridspec实现。但是,有的时候一个拥有自己绘图元素的专业子图API更是人们希望的。庆幸的是,在Matplotlib的v3.4版本之后自带了两个创建子图的API:

  • matplotlib.figure.Figure.add_subfigure:为某个figure添加一个子图。
    • 参数:
      • subplotspec: gridspec.SubplotSpec类型. 定义父图网格中子图放置区域的位置.
      • **kwargs: 其它关键字参数. 参考Subfigure
  • matplotlib.figure.Figure.subfigures:为某个figure创建多个子图。
    • 参数:
      • nrows, ncols: int类型, 默认为1. 子图的行数和列数.
      • squeeze:bool类型, 默认为Ture. 是否从返回的子图数组中挤出额外的维度.
      • wspace, hspace: float类型, 默认为None. 子图之间间隔的宽度/高度.
      • width_ratios: array-like类型, 定义子图列的相对宽度. 可选项.
      • height_ratio: array-like类型, 定义子图行的相对高度. 可选项.
    • 返回值: 返回多个子图的集合.

检查自己的Matplotlib版本和支持的字体

# 查看Matplotlib版本
import matplotlib

print(f"The Matplotlib version is: {matplotlib.__version__}")

# 查看Matplotlib的字体参数
font_list = sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

for ft in font_list:
    print(ft)
The Matplotlib version is: 3.7.0
Agency FB
Agency FB
Algerian
Arial
...

子图绘图示例

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = 'SimHei'  # 设置Matplotlib的字体为黑体, 进而正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于在中文字体环境下正常显示负号


def example_plot(ax, fontsize=12, hide_labels=False):
    """示例绘图函数"""
    pc = ax.pcolormesh(np.random.randn(30, 30), vmin=-2.5, vmax=2.5)
    if not hide_labels:
        ax.set_xlabel('x-label', fontsize=fontsize)
        ax.set_ylabel('y-label', fontsize=fontsize)
        ax.set_title('Title', fontsize=fontsize)
    
    return pc


np.random.seed(19680808)

# 子图嵌套,基于gridspec实现
fig = plt.figure(layout='constrained', figsize=(10, 4))
subfigs = fig.subfigures(1, 2, wspace=0.07)  # 创建一行两列两个子图

# 左侧子图绘制
axsLeft = subfigs[0].subplots(1, 2, sharey=True)  # 左边子图的两个Axes
subfigs[0].set_facecolor('0.75')
for ax in axsLeft:
    pc = example_plot(ax)
subfigs[0].suptitle('左侧子图', fontsize='x-large')
subfigs[0].colorbar(pc, shrink=0.6, ax=axsLeft, location='bottom')

# 右侧子图绘制
axsRight = subfigs[1].subplots(3, 1, sharex=True)
for nn, ax in enumerate(axsRight):
    pc = example_plot(ax, hide_labels=True)
    if nn == 2:
        ax.set_xlabel('横坐标')
    if nn == 1:
        ax.set_ylabel('纵坐标')
subfigs[1].set_facecolor('0.85')
subfigs[1].colorbar(pc, shrink=0.6, ax=axsRight)
subfigs[1].suptitle('右侧子图', fontsize='x-large')

fig.suptitle('主绘图', fontsize='x-large')  # 主绘图大标题

plt.show()

绘制结果如下图所示。

请添加图片描述

参考文献

  1. The matplotlib development team. Figure subfigures[EB/OL]. [2024-09-11]. https://matplotlib.org/stable/gallery/subplots_axes_and_figures/subfigures.html#sphx-glr-gallery-subplots-axes-and-figures-subfigures-py
  2. The matplotlib development team. Nested Gridspecs[EB/OL]. [2024-09-11]. https://matplotlib.org/stable/gallery/subplots_axes_and_figures/gridspec_nested.html
  3. The matplotlib development team. matplotlib.figure.Figure.subfigures[EB/OL]. [2024-09-11]. https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.subfigures.html#matplotlib.figure.Figure.subfigures
  4. The matplotlib development team. matplotlib.figure.Figure.add_subfigure[EB/OL]. [2024-09-11]. https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.add_subfigure.html#matplotlib.figure.Figure.add_subfigure

收集整理和创作不易, 若有帮助🉑, 请帮忙点赞👍➕收藏❤️, 谢谢!✨✨🚀🚀

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值