Matplotlib 嵌套网格规格

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,你将学习如何在 Matplotlib 中使用嵌套的.GridSpec来创建大小各异的子图网格。当你想要创建复杂的绘图布局并控制每个绘图的大小和间距时,这会很有用。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。

导入库

首先,我们需要导入必要的库。我们将使用matplotlib.pyplot来创建图表,并使用numpy来生成一些用于绘图的数据。

import matplotlib.pyplot as plt
import numpy as np

创建数据

在这一步中,我们将创建一些用于绘图的数据。我们将使用squiggle_xy函数来生成一些具有不同频率的正弦和余弦波。

def squiggle_xy(a, b, c, d):
    i = np.arange(0.0, 2*np.pi, 0.05)
    return np.sin(i*a)*np.cos(i*b), np.sin(i*c)*np.cos(i*d)

创建图形和外部网格

接下来,我们将使用add_gridspec函数创建图形和外部网格。我们将创建一个 4x4 的网格,子图之间没有间距。

fig = plt.figure(figsize=(8, 8))
outer_grid = fig.add_gridspec(4, 4, wspace=0, hspace=0)

创建内部网格和子图

在这一步中,我们将使用嵌套的.GridSpec来创建内部网格和子图。我们将遍历外部网格中的每个单元格,并为每个单元格创建一个 3x3 的网格。

for a in range(4):
    for b in range(4):
        ## 网格规格嵌套在网格规格中
        inner_grid = outer_grid[a, b].subgridspec(3, 3, wspace=0, hspace=0)
        axs = inner_grid.subplots()  ## 为内部网格创建所有子图。
        for (c, d), ax in np.ndenumerate(axs):
            ax.plot(*squiggle_xy(a + 1, b + 1, c + 1, d + 1))
            ax.set(xticks=[], yticks=[])

仅显示外部边框

在这一步中,我们将移除内部子图的边框,仅显示外部边框。这会使图表看起来更简洁。

for ax in fig.get_axes():
    ss = ax.get_subplotspec()
    ax.spines.top.set_visible(ss.is_first_row())
    ax.spines.bottom.set_visible(ss.is_last_row())
    ax.spines.left.set_visible(ss.is_first_col())
    ax.spines.right.set_visible(ss.is_last_col())

显示图表

最后,我们将使用show()函数来显示图表。

plt.show()

总结

在这个实验中,你学习了如何在 Matplotlib 中使用嵌套的.GridSpec来创建大小各异的子图网格。我们还学习了如何使用numpy生成数据,以及如何自定义子图的边框。有了这些知识,你可以精确控制图表的大小和间距,从而创建复杂的图表布局。