Matplotlib 绘制等高等宽的正方形子图

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图像绘制提供帮助。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程