簡體   English   中英

在matplotlib中創建兩個完全獨立的圖並在它們之間來回傳遞

[英]Creating two completely independent plots in matplotlib and going back and forth between them

我想在python腳本中創建兩個獨立的matplotlib圖,並且可能在它們之間來回跳轉,因為我在各個圖中添加了行,注釋等(例如,我可能會調用一個函數來為兩個圖添加行繪圖,然后是另一個添加注釋的函數)。

我希望通過使用matplotlib示例,我能夠找到一些有效的解決方案,但我想知道這樣做的首選和最干凈的方法是什么。 我傾向於對我應該做什么事感到困惑

fig,ax=plt.subplots()

當我應該做的事情:

fig=plt.figure()

此外,我應該如何在情節之間來回切換。 如果我做了類似的事情

fig1,ax1=plt.subplots()
fig2,ax2=plt.subplots()

我可以通過做類似的事情來參考這些情節:

ax1.plt.plot([some stuff])
ax2.plt.plot([otherstuff]

我問這個是因為經常在matplotlib示例中他們在調用plt.subplot()之后沒有引用這樣的圖,而是調用像這樣的命令

plt.plot([stuff])

大概他們沒有指定ax1或ax2並不重要,因為在這個例子中只有一個情節。 最后,我想使用類似的東西將兩個圖表保存到文件中

plt.savefig(....)

雖然我再次需要能夠獨立地參考這兩個圖。 那么實現這個的正確方法是什么?

如果您希望能夠編寫明確將命令應用於不同軸的代碼,則需要使用面向對象的接口

實際上,前兩個示例都使用此接口。 不同之處在於plt.subplots()將同時創建一個圖形對象和一個軸網格,而plt.figure()只會創建該圖形。

圖形對象具有在其中創建軸的方法。 所以,這兩個代碼塊是等價的:

fig, ax = plt.subplots()

fig = plt.figure()
ax = fig.add_subplot(111)

通常,當您希望圖中的多個軸不遵循常規網格時,后一種方法將更有用。 所以,你可以這樣做:

fig = plt.figure()
ax = fig.add_axes([.1, .1, .2, .8])

這將在圖的左側添加一個高軸對象。


接下來,如何繪制多個軸?

subplots函數有兩個位置參數,指定網格中的行數和列數(默認為(1, 1) 。所以如果你想要兩個軸並排,你會做

fig, axes = plt.subplots(1, 2)

現在, axes將成為一個填充了Axes對象的(1, 2)對象數組。 對於小網格來說,使用Python的元組解包並獲得對象的直接引用通常更方便:

fig, (ax1, ax2) = plt.subplots(1, 2)

現在,您如何處理這些對象,以及它們與MATLAB風格的過程接口之間的關系是什么?

pyplot命名空間中的大多數函數也作為Figure或Axes對象上的方法存在。 Matplotlib(和MATLAB)具有“當前”圖形和軸的概念。 當你調用像plt.plot這樣的函數時,它會在當前軸上繪制(通常是最近創建的軸)。 當你調用像plt.savefig這樣的函數時,它會保存當前的數字。

對於簡單的任務,這比使用面向對象的接口更直接,更容易。 但是,當你開始做更復雜的情節,如軸的網格,每個網格具有多個層(也許散點圖和回歸直線),能夠構建周圍你在做什么 ,而不是你在做,其中有大量的代碼好處。 通常,以面向對象的方式編寫的繪圖代碼將比以過程方式編寫的代碼更好地擴展。

暫無
暫無

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

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