在matplotlib中传递x和y数据作为关键字参数?

are*_*ick 5 python plot matplotlib ipython

或者,为什么不呢

import numpy
import matplotlib.pyplot as plt
plt.plot(xdata = numpy.array([1]), ydata = numpy.array(1), color = 'red', marker = 'o')
Run Code Online (Sandbox Code Playgroud)

工作?比照

> 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>]
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 12

只是为了扩展@Yann已经说过的内容:

要理解为什么会发生这种情况,您需要更多地了解matplotlib的结构.为了允许"matlab-isms" plt.setp,并保持与旧版python的兼容性,matplotlib避免了属性并且在很大程度上依赖于getter和setter.(plot实际上是最复杂的案例之一,仅仅是因为它支持的所有疯狂形式的调用.)

你可以提出一个很好的论据,即这是一种过时的,无声的设计,但这不是重点.

plot(x, y, other=stuff)当你调用时实际发生的事情(对于最简单的情况)是从前两个参数创建plot一个新matplotlib.line.Line2D对象,然后matplotlib.line.Line2D.update(kwargs)被调用.

update 基本上做了:

for key, value in kwargs.iteritems():
    func = getattr(self, 'set_'+key)
    func(value)
Run Code Online (Sandbox Code Playgroud)

我过度简化,但那是基本的想法.

此外,接受的关键字参数列表基本上是自动生成的set_*.因为Line2Dhas set_xdataset_ydatamethods,它们出现在关键字参数列表中.

关键是,关键字参数在大多数初始化之后才会实际使用Line2D,如果没有指定任何参数,plot则不会初始化任何参数Line2D.

你可以认为这是一个错误,但我怀疑它会被修复.我不认为xdata并且ydata曾经打算用作关键字参数.

set_xdataset_ydata允许您快速更新Line2D实例而不是创建新实例(对于动画等...).由于matplotlib的设置方式,它们恰好被允许作为关键字参数.