使用set()/ setp()在matplotlib

时间:2015-05-19 16:00:41

标签: python matplotlib

我在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()

,我真的想不出办法解决这个问题

2 个答案:

答案 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')
Out[59]: [<matplotlib.text.Text at 0x10b936110>]
相反,我会积累并使用像这样的kwargs:

kwargs = {'title':'foo'}

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

相同的输出,令人放心。