簡體   English   中英

為什么matplotlib.gridspec的緊密布局不能與pyplot.subplot一起正常工作,而與fig.add_subplot一起工作呢?

[英]Why does matplotlib.gridspec's tight_layout not work correctly with pyplot.subplot whereas it does with fig.add_subplot?

我正在嘗試使用gridspec創建兩個彼此相鄰的子圖(實際圖更為復雜,但這是基本思想)。 我正在使用plt.subplot創建子圖,但這似乎無法產生預期的結果。 我僅在圖的右側獲得第二個子圖,而沒有獲得第一個子圖。

另一方面,如果我使用fig.add_subplot創建了子圖,盡管得到了tight_layout警告,該圖仍可以正確顯示。 我對此行為感到有些驚訝,因為pyplot的subplot函數在內部調用了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相同的結果?

subplot作用是檢查重疊的圖並刪除它們(如果存在)。 您的第二plt.subplot圖與第一plt.subplot圖重疊,因此您的第二個plt.subplot將刪除第一個。 Figure.add_subplot不會刪除重疊的子圖。

請注意,您正在創建填充整個圖形的子圖:

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

這是1x1網格中的子圖,因此它將填充整個圖形並與以前的任何子圖重疊。

順便說一句,這個問題與可以正常工作的tight_layout無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM