删除matplotlib图中的空子图

时间:2016-07-22 09:03:30

标签: python matplotlib

如何判断子图(AxesSubplot)是否为空?我想停用空子图的空轴并删除完全空的行。

例如,在这个图中只填充了两个子图,其余的子图是空的。

import matplotlib.pyplot as plt

# create figure wit 3 rows and 7 cols; don't squeeze is it one list
fig, axes = plt.subplots(3, 7, squeeze=False)
x = [1,2]
y = [3,4]

# plot stuff only in two SubAxes; other axes are empty
axes[0][1].plot(x, y)
axes[1][2].plot(x, y)

# save figure
plt.savefig('image.png')

注意:必须将squeeze设置为False

基本上我想要一个稀疏的人物。行中的某些子图可以为空,但应将其取消激活(不能显示任何轴)。必须删除完全空行,不得将其设置为不可见。

2 个答案:

答案 0 :(得分:10)

您可以使用fig.delaxes()方法:

import matplotlib.pyplot as plt

# create figure wit 3 rows and 7 cols; don't squeeze is it one list
fig, axes = plt.subplots(3, 7, squeeze=False)
x = [1,2]
y = [3,4]

# plot stuff only in two SubAxes; other axes are empty
axes[0][1].plot(x, y)
axes[1][2].plot(x, y)

# delete empty axes
for i in [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17,
          18, 19, 20]:
    fig.delaxes(axes.flatten()[i])

# save figure
plt.savefig('image.png')
plt.show(block=False)

答案 1 :(得分:4)

实现所需要的一种方法是使用matplotlibs subplot2grid功能。使用此选项可以设置网格的总大小(在您的情况下为3,7),并选择仅绘制此网格中某些子图中的数据。我在下面修改了你的代码,举例说明:

import matplotlib.pyplot as plt

x = [1,2]
y = [3,4]

fig = plt.subplots(squeeze=False)
ax1 = plt.subplot2grid((3, 7), (0, 1))
ax2 = plt.subplot2grid((3, 7), (1, 2))

ax1.plot(x,y)
ax2.plot(x,y)

plt.show()

这给出了以下图表:

enter image description here

修改

Subplot2grid实际上会为您提供一个轴列表。在您的原始问题中,您使用fig, axes = plt.subplots(3, 7, squeeze=False)然后使用axes[0][1].plot(x, y)来指定您的数据将在哪个子图中绘制。这与subplot2grid的作用相同,除了它只显示包含数据的子图你已经定义了。

所以在上面的答案中取ax1 = plt.subplot2grid((3, 7), (0, 1)),在这里我指定了'网格'的形状,它是3乘7。这意味着如果我愿意,我可以在该网格中有21个子图,就像你原来的一样码。不同之处在于您的代码显示所有子图,而subplot2grid则不显示。上面(3,7)中的ax1 = ...指定整个网格的形状,(0,1)指定 中该子网格将显示的网格。

您可以在3x7网格中的任何位置使用子图的任何位置。如果您需要一直向上到ax21 = plt.subplot2grid(...),您还可以使用包含数据的子图填充该网格的所有21个空格。