Matplotlib 绘制等高等宽的正方形子图
前言
Matplotlib中,绘制等高等宽的正方形子图是经常需要的操作。在本文中,我们将会介绍如何使用Matplotlib中的subplot操作来创建这样的图像。这里要注意的是,虽然此处仅介绍正方形子图的创建,但本文中介绍的方法也同样适用于矩形子图的创建。
阅读更多:Matplotlib 教程
布局
Matplotlib有三种布局类型,这些布局类型可以通过plt.subplots_adjust()函数来修改:
- Tight:密集型布局,子图之间没有空间。可以通过设置周围间距来实现。
- Normal:正常的布局,子图之间有较小的间距。
- Loose:宽松的布局,子图之间有大的空间。
在本文中,我们将采用Normal布局。
配置子图
Matplotlib的subplot()函数创建子图,默认情况下,它会创建N x M数量的子图。我们可以通过调整函数中的参数来调整子图的数量,以及子图的行列宽高比。例如,plt.subplot(3, 3, 1, aspect='equal')将创建一个子图网格,其中有3行和3列,其中第1个子图是正方形而其他子图的宽高比是不一样的。
这里需要注意的是,aspect参数的值可以设置为’equal’,这将使得图像的长宽比相等。
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(6, 6))
axes[0, 0].set_aspect('equal')
plt.show()
上述代码将会产生一个2×2的子图网络。
设置等高等宽的正方形子图
从上面的例子中,我们可以看到使用aspect参数可以使得每个子图都成为正方形。但是,在不同数量的子图中,我们需要注意一些问题。比如一个子图网格中存在奇数个子图,我们应该将axis间距设置为0并调整网格宽高比,以便子图尽可能的填满整个网格。
下面是一些示例代码:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4.5, 4.5))
# 3x3 with one axis missing
sp = fig.add_gridspec(3, 3, left=0.05, right=0.48, bottom=0.05, top=0.48, wspace=0.05, hspace=0.05)
for i in range(8):
ax = fig.add_subplot(sp[i])
ax.text(0.5, 0.5, str(i+1), fontsize=18, ha='center')
ax = fig.add_subplot(sp[2, 1])
ax.text(0.5, 0.5, '9', fontsize=18, ha='center')
plt.show()
这里我们使用了add_gridspec()函数来创建一个子图网格。在该函数中,我们设置了宽高比为1,在网格中加入了9个子图。而对于缺失的子图,我们手动创建了第九个子图,来保证网格布局的完整性。
# 3x3 per we dont have the last axis
sp = fig.add_gridspec(3, 3, left=0.05, right=0.48, bottom=0.05, top=0.48, wspace=0.05, hspace=0.05)
for i in range(9):
if i == 8:
continue
ax = fig.add_subplot(sp[i])
ax.text(0.5, 0.5, str(i+1), fontsize=18, ha='center')
plt.show()
这里是防止紊乱的另一种方法。
总结
在本文中,我们介绍了如何使用Matplotlib创建等高等宽的正方形子图。无论是使用 subplot函数还是 add_gridspec()函数,都可以很方便的实现这个目标。同时,我们还注意到子图的行列宽高比对于创建正方形子图非常重要,我们可以通过设置子图的 aspect 参数来实现这一目的。除此之外,在创建子图网格时,我们要特别注意奇数子图数量以及子图网格的宽高比,以便子图尽可能的填满整个网格。希望本文能对您的Matplotlib图像绘制提供帮助。
极客教程