2016-02-22 76 views
1

由於對this question第二個答案,我認爲下面的代碼matplotlib:同時繪製不同的地塊

import matplotlib.pyplot as plt 

for i1 in range(2): 

    plt.figure(1) 
    f, ax = plt.subplots() 
    plt.plot((0,3), (2, 2), 'b') 


    for i2 in range(2): 
     plt.figure(2) 
     f, ax = plt.subplots() 
     plt.plot([1,2,3], [1,2,3], 'r') 
     plt.savefig('foo_{}_bar_{}.jpg'.format(i2, i1)) 
     plt.close() 

    plt.figure(1) 
    plt.plot([1,2,3],[1,2,3], 'r') 

    plt.savefig('bar_{}.jpg'.format(i1)) 
    plt.close() 

創建地塊bar_0.jpgbar_1.jpg呈現出藍色和紅色線的每個。

然而,數字看起來像

enter image description here

,而不是

enter image description here

我怎樣才能達到預期的行爲? 請注意,在處理bar地塊期間必須關閉並保存地塊foo_*.jpg

+0

我不是很明白爲什麼你會想要寫FOO_1和FOO_2提交兩次,也可以明確聲明你想要的行爲? –

+0

這只是一個簡單的例子,我想在foo_1.jpg和foo_2.jpg中繪製SOMETHING。期望的行爲如下:做幾次:(1)創建一個情節並繪製一些東西,(2)創建一個新情節,在其中畫一些東西,然後保存並關閉它(3)返回到前一個情節,並繪製一些額外的東西,並保存它。 – corinna

回答

2

你已經保存Axes對象,因此,而不是調用PyPlot plot功能(借鑑了最後創建或激活Axes),使用對象的plot功能:

ax.plot(...) 

如果再給出一個不同的名字,比如說ax1ax2,你可以在你喜歡的一個上繪製而不會干擾另一個。所有plt.命令也存在爲Axes成員函數,但有時名稱會更改(例如,plt.xticks變爲ax.set_xticks)。詳情請參閱the documentation of Axes

要保存到的數字,使用Figure對象以相同的方式:

f.savefig(...) 

此API類型纔剛剛來到MATLAB,僅供參考,並可能取代上的最後一個老式的「畫積極情節「行爲。這裏面向對象的方法更靈活,開銷最小,所以我強烈建議你在任何地方都使用它。

+0

我們爲什麼要談論matlab? – tom

+0

作品,非常感謝!但是,在我的問題中提到的答案是錯誤的,不是嗎? – corinna

+0

@tom除了我之外沒有人在談論Matlab。而你,現在。我提出它是因爲Pyplot API是在Matlab API之後建模的,而「面向對象的API」則不是。 – rubenvb

1

如果不能確定,最好使其明確:

import matplotlib.pyplot as plt 

for i1 in range(2): 
    fig1,ax1 = plt.subplots() 
    fig2,ax2 = plt.subplots() 
    ax1.plot([0,4],[2,2],'b') 

for i2 in range(2): 
    ax2.plot([1,2,3],[1,2,3],'r') 
    fig2.savefig('abc{}.png'.format(2*i1+i2)) 
    plt.figure(1) 
    ax1.plot([1,2,3],[1,2,3],'r') 

fig1.savefig('cba{}.png'.format(i1)) 
相關問題