2011-05-11 66 views
1

我有許多函數,每個函數都會創建一個或多個數字。作爲被創造的附圖中,附圖被添加到詞典中,像這樣:如何迭代對matplotlib數字的引用字典

self.figures['figureKey'] = figure() 

在另一個功能,我想遍歷這個詞典和挽救每個圖;使用字典密鑰作爲文件名的一部分或全部是很好的。我已經能夠迭代字典,但figure()函數似乎需要一個與數字相對應的整數,拒絕該鍵給出的引用。

for fig in self.figures: 
     figure(self.figures[fig]) #does not work 
     figure(fig)    #also does not work 
     savefig(fig)    #seems to let me use the key as a filename--nice 

我也試圖使用`get_fignums()和迭代返回的數組,但失去與鍵名關聯。也許有可能從數字指針中提取數字數字?任何人都有一個光滑的方法呢?

請拒絕用「你爲什麼不只是......」這個詞開始回答的傾向。答案是這對我來說不是一個明顯的方法。我在這方面有點新鮮。

回答

1

您可以從圖形實例中獲取圖形編號。 From the docs

返回的圖形對象有一個數字屬性,它包含這個數字。

所以訪問由數一個數字,你可以這樣做:

figure(self.figures[fig].number) 

我沒有安裝matplotlib剛纔測試,雖然。

+0

你的解決方案像一個魅力工作。感謝您參考文檔,但除了說有「數字」屬性之外,我沒有發現它是製表或在pyplot_api或figure_api的文檔中。我想這不應該是尋找類的詳盡描述的地方。 – 2NinerRomeo 2011-05-11 19:10:37

+0

@ 2NinerRomeo,那也是我發現'number'屬性的唯一地方 - 我甚至想知道'number'屬性是否被_pyplot.figure()添加了。 – senderle 2011-05-11 19:12:43

1

我可能在這裏錯過了一些東西(不是真的是一個matplotlib用戶),但不是將圖形對象本身存儲在字典中嗎?如果是這樣,則可以使用for key, value in self.figures.items()迭代鍵和值,然後使用number屬性獲取圖號。

作爲一個測試,我嘗試使用交互式解釋如下:

>>> import matplotlib.pyplot as plt 
>>> figures = {} 
>>> figures['name1'] = plt.figure() 
>>> plt.plot([1, 2, 3]) 
>>> figures['name2'] = plt.figure() 
>>> plt.plot([6, 5, 4]) 
>>> for key, figure in figures.items(): 
...  print 'Saving figure #%d as %s.' % (figure.number, key) 
...  plt.figure(figure.number) 
...  plt.savefig(key) 
... 
Saving figure #2 as name2 
Saving figure #1 as name1 

而且它似乎工作:2個地塊(一個單調遞增的,一個單調遞減的)被保存爲PNG文件name1.png和當前目錄中的name2.png。

+0

我的理解是'savefig()'保存當前圖形,這是通過調用現有圖號上的'figure()'來設置的。所以你在做什麼(如果我解釋文檔的權利)保存在三個不同的名字相同的數字。 – senderle 2011-05-11 00:40:58

+0

@senderle,你是對的。向該圖添加一些數據顯示了我的錯誤。我已經用我的系統上實際工作的例子更新了我的答案。 – Blair 2011-05-11 01:05:59

+0

我不知道數字屬性。這很好地訣竅。 – 2NinerRomeo 2011-05-11 19:15:03

2

也許我很困惑你在做什麼...如果你只是想保存這個數字,爲​​什麼不使用fig對象的savefig方法?

pyplot.savefig保存活動圖形,但使用特定圖形實例的fig.savefig方法保存該特定圖形,而不管哪個圖形處於活動狀態。

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

figures = [plt.figure() for _ in range(10)] 

for i, fig in enumerate(figures): 
    ax = fig.add_subplot(111) 
    ax.plot(x, i*x) 
    ax.axis('equal') 

for i, fig in enumerate(figures): 
    fig.savefig('temp_slope_%02i.png' % i) 
+0

知道每個實例都有自己的.savefig方法 – 2NinerRomeo 2011-05-11 19:15:48