2017-04-01 80 views
2

我目前正在學習使用Jupyter Notebook在Python中使用matplotlib製作圖的基本原理。我主要抱怨的是當涉及到創建子圖時,爲什麼我必須在單個塊中運行代碼?每當我試圖用不同的步驟運行它時,它會引發我奇怪的情節。對於exampple:用matplotlib創建子圖

plt.subplot(211)

plt.plot(range(10))

plt.subplot(212, facecolor='y')

plt.plot(randn(50))

我不得不EXCUTE碼的那些四行在一個步驟中而不是在四步運行它們每個。這裏到底發生了什麼?爲什麼這兩種方法之間存在這種差異?

+0

注有一種叫做['plt.subplots()'](http://matplotlib.org/examples/pylab_examples/subplots_demo.html)微妙替代(帶有「s」)。這種方法與經典的matlab風格有點不同,並且允許你在一行中聲明圖形和軸的元組,例如, 'fig,(ax1,ax2)= plt.subplots(1,2,sharey = True)'。這些軸可以隨時分配新的數據。 – pylang

+0

@pylang問題不在於是否使用'plt.subplot'或使用'plt.subplots'來創建子圖。關鍵在於是使用狀態機還是使用oo api,即是否保留對象的引用。 – ImportanceOfBeingErnest

+0

也許我應該把它說得更清楚,我猜。我打算做的是啓動一個子情節並在其上繪製,然後啓動另一個子情節並在其上創建另一個情節,依此類推。問題是我必須在一個單元格中執行這些步驟(而不是單獨的單元格中的每個單元格)以獲得所需的效果。爲什麼我不允許一步一步地製作幾個小插圖,以便能夠檢查每個中間結果的樣子? –

回答

1

在jupyter筆記本中,一旦對一個單元格進行了評估並顯示該圖形,則表明您正在丟失對該單元格的引用,並且該單元格中生成的圖形已關閉。
在新的單元格中,當調用plt.subplot()時,pyplot不會看到任何打開的圖形,因此會創建一個新圖形。

大多數pyplot命令都是這樣工作的:找出是否有開放圖形(可能還有當前座標軸)。如果是這種情況,請對該圖(軸)進行操作,如果沒有,則創建它。這就是爲什麼它通常被稱爲statemachine;取決於當前的狀態,做一些事情。

與此相反,還有一個面向對象的API。它通過明確地調用要操作的對象的方法來工作。所以爲了重用以前單元格中的圖形或座標軸,我們會保留對它們的引用。

明確地呼叫fig = plt.figure(),使得fig在下一個單元中仍然可用。與軸相同,請撥ax = fig.add_subplot(111)使子圖在下一個單元格中可用。在任何時候,請致電fig來調用圖形的顯示。

下面是一個例子:

enter image description here

+0

非常感謝。這正是我正在尋找的。儘管如此,「無記憶」的東西對我來說似乎並不直觀。 –