为什么matplotlib.gridspec的tight_layout与pyplot.subplot无法正常工作,而fig.add_subplot呢?

时间:2016-10-22 10:53:47

标签: python matplotlib

我正在尝试使用gridspec创建两个彼此相邻的子图(真实的情节更复杂,但这是基本的想法)。我正在使用plt.subplot创建子图,但这似乎不会产生预期的结果。我只得到图右侧的第二个子图,而不是第一个。

另一方面,如果我使用fig.add_subplot创建子图,虽然我收到了tight_layout警告,但图表显示正确。我对这种行为感到有些惊讶,因为pyplot的子图功能在内部调用了fig.add_subplot(然后做了一些检查以查看子图是否已经存在 - 我猜?)。这是仅产生最右边的子图的代码。将注释切换为使用plt.gcf().add_subplot可使其按预期工作。

from matplotlib import gridspec,pyplot as plt

gs = gridspec.GridSpec(1,1)
ax1 = plt.subplot(gs[0,0])
# ax1 = plt.gcf().add_subplot(gs[0,0])
ax1.plot(range(3),range(3))
gs.tight_layout(plt.gcf(),rect=[0,0,0.45,1])

gs = gridspec.GridSpec(1,1)
ax1 = plt.subplot(gs[0,0])
# ax1 = plt.gcf().add_subplot(gs[0,0])
ax1.plot(range(3),range(3))
gs.tight_layout(plt.gcf(),rect=[0.55,0,1,1])

plt.show()

我做错了什么,或者我错过了什么?作为参考,这是pyplot.subplot主要做的事情:

fig = gcf()
a = fig.add_subplot(*args, **kwargs)
bbox = a.bbox
byebye = []
for other in fig.axes:
    if other==a: continue
    if bbox.fully_overlaps(other.bbox):
        byebye.append(other)
for ax in byebye: delaxes(ax)

return a

我的问题是:为什么使用pyplot.subplot不会产生与fig.add_subplot相同的结果?

1 个答案:

答案 0 :(得分:1)

subplot做的是检查重叠图并删除它们(如果存在)。您的第二个子图重叠了第一个子图,因此您的第二个plt.subplot将删除第一个子图。 Figure.add_subplot不会删除重叠的子图。

请注意,您正在创建填充整个图形的子图:

gs = gridspec.GridSpec(1,1)
ax1 = plt.subplot(gs[0,0])

这是1x1网格中的子图,因此它将填充整个图形并重叠任何先前的子图。

BTW这个问题与正常工作的tight_layout无关。