我正在尝试使用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相同的结果?
答案 0 :(得分:1)
subplot
做的是检查重叠图并删除它们(如果存在)。您的第二个子图重叠了第一个子图,因此您的第二个plt.subplot
将删除第一个子图。 Figure.add_subplot
不会删除重叠的子图。
请注意,您正在创建填充整个图形的子图:
gs = gridspec.GridSpec(1,1)
ax1 = plt.subplot(gs[0,0])
这是1x1网格中的子图,因此它将填充整个图形并重叠任何先前的子图。
BTW这个问题与正常工作的tight_layout
无关。