2015-05-19 37 views
0

我在matplotlib中使用一個可以由用戶修改的數字。由於應用程序的設計方式,當用戶想要更改圖形的屬性時(例如xlim),輸入將通過字典(如{'xlim': value})接收。由於我不能預先知道用戶想要更改哪些屬性,因此我一直試圖使用set()來更改屬性;然而,當我處理的字典是這樣的:使用set()/ setp()在matplotlib中設置未知屬性

for key, value in changes.iteritems(): 
      if self.seen[key][1] == 1: # Key is seen 
       self.obj.set(key=value) 

我得到的錯誤:AttributeError: 'AxesSubplot' object has no attribute 'set_key'

是否有任何其他的方式,我不需要事先其中知道設置在matplotlib屬性具體的財產將會改變?我真的不能想辦法解決此不使用set()/setp()

回答

1

由於cphlewis已在他的answer中指出,問題在於如何將鍵/值對傳遞給set

但是你的問題與matplotlib無關,這是一個普通的python問題:在matplotlib中定義爲set的函數接收到作爲字典的**kwargs中的關鍵字參數。鑰匙是總是字符串!因此,如果你有一個函數func

def func(**kwargs): 
    pass 

,並稱之爲:

func(foo='bar') 

然後kwargs將是一本字典:{'foo':'bar'}。因此,如果你撥打:

key = 'foo' 
value = 1 
ax.set(key=value) 

然後ax.set將收到這本字典:(!和{'foo':1}{'key':1}。由於key不是axes的財產,所以會導致錯誤。

所以你可以做這樣的:

kwargs_for_set = dict() 
for key, value in changes.iteritems(): 
    if self.seen[key][1] == 1: # Key is seen 
     kwargs_for_set[key] = value 
self.obj.set(**kwargs_for_set) 
0

更多的堆棧跟蹤該錯誤:

826    funcName = "set_%s" % k 
--> 827    func = getattr(self, funcName) 
    828    ret.extend([func(v)]) 
    829   return ret 

AttributeError: 'AxesSubplot' object has no attribute 'set_key' 

看看是如何被使用key - 它的名字(」關鍵'),而不是它的值('xlim'或其他)。

我會添加元素到我的kwarg詞典作爲用戶修改情節。其中,在劇本,我會做

ax.set(title='foo') 
Out[59]: [<matplotlib.text.Text at 0x10b936110>] 

,而不是我積累和使用kwargs像這樣:

kwargs = {'title':'foo'} 

ax.set(**kwargs) 
Out[61]: [<matplotlib.text.Text at 0x10b936110>] 

相同的輸出,讓人放心。