或者,为什么不
import numpy import matplotlib.pyplot as plt plt.plot(xdata = numpy.array([1]), ydata = numpy.array(1), color = 'red', marker = 'o')
工作?cf
> In [21]: import numpy > In [22]: import matplotlib.pyplot as plt > In [23]: plt.plot(xdata = numpy.array([1]), ydata = numpy.array(1), color = 'red', marker = 'o') > Out[23]: [] > In [24]: plt.plot([1],[1], color = 'red', marker = 'o') > Out[24]: [<matplotlib.lines.Line2D at 0x108036890>] > In [25]: plt.plot(1, 1, color = 'red', marker = 'o') > Out[25]: [<matplotlib.lines.Line2D at 0x1041024d0>]
只是为了扩展@Yann已经说过的内容:
要了解为什么会发生这种情况,您需要进一步了解matplotlib的结构。为了允许像这样的“ matlab- isms”plt.setp并保持与旧版本python的兼容性,matplotlib避免使用属性,并且严重依赖于getter和setter。(plot实际上是最复杂的情况之一,仅仅是由于调用它支持的所有疯狂形式。)
plt.setp
plot
您可以提出一个很好的论据,认为这是一种过时的,非Python的设计,但这并非重点。
plot(x, y, other=stuff)调用时实际发生的情况(对于最简单的情况)是从前两个参数创建plot一个新matplotlib.line.Line2D对象,然后matplotlib.line.Line2D.update(kwargs)调用该对象。
plot(x, y, other=stuff)
matplotlib.line.Line2D
matplotlib.line.Line2D.update(kwargs)
update 基本上是这样的:
update
for key, value in kwargs.iteritems(): func = getattr(self, 'set_'+key) func(value)
我过于简化了,但这是基本思想。
同样,可接受的关键字参数列表基本上是从具有的任何内容自动生成的set_*。由于Line2D具有set_xdata和set_ydata方法,它们显示在关键字参数列表中。
set_*
Line2D
set_xdata
set_ydata
关键是,直到完成大多数的初始化之后Line2D,才可以实际使用关键字参数,并且,如果您不指定任何参数,plot则不会初始化任何Line2D。
您可以认为这是一个错误,但是我怀疑它是否会解决。我不认为xdata并且ydata曾经打算用作关键字参数。
xdata
ydata
set_xdata并且set_ydata在那里可以让您快速更新Line2D实例,而不用创建一个新实例(用于动画等)。由于设置matplotlib的方式,它们恰好被允许作为关键字参数。