简介
在本实验中,你将学习如何在 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生成数据,以及如何自定义子图的边框。有了这些知识,你可以精确控制图表的大小和间距,从而创建复杂的图表布局。