我在matplotlib中使用可以由用户修改的数字。由于应用程序的设计方式,当用户想要更改图形的属性时(例如xlim
),输入将在{'xlim': value}
等字典中接收。
由于我无法事先知道用户想要更改哪些属性,因此我一直在尝试使用set()
来更改属性;但是,当我像这样处理字典时:
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()
答案 0 :(得分: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
将收到此词典:{'key':1}
(以及不 {'foo':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)
答案 1 :(得分: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')
相反,我会积累并使用像这样的kwargs:Out[59]: [<matplotlib.text.Text at 0x10b936110>]
kwargs = {'title':'foo'}
ax.set(**kwargs)
Out[61]: [<matplotlib.text.Text at 0x10b936110>]
相同的输出,令人放心。