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

时间:2012-01-23 22:02:44

标签: python plot ipython matplotlib

或者,为什么不

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

工作? c.f。

> 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>]

2 个答案:

答案 0 :(得分:12)

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

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

你可以提出一个很好的论点,即这是一种过时的,非语音的设计,但这不是重点。

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

matplotlib.line.Line2D.update(kwargs)基本上可以:

update

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

此外,接受的关键字参数列表基本上是从具有for key, value in kwargs.iteritems(): func = getattr(self, 'set_'+key) func(value) 的任何内容自动生成的。由于set_*具有Line2Dset_xdata方法,因此它们会显示在关键字参数列表中。

关键是,关键字参数在set_ydata的大部分初始化之后才会实际使用,如果您没有指定任何参数,Line2D将不会初始化任何plot 1}}的。

你可以认为这是一个错误,但我怀疑它会被修复。我不认为Line2Dxdata曾被用作关键字参数。

ydataset_xdata可让您快速更新set_ydata实例,而不是创建新实例(适用于动画等)。由于matplotlib的设置方式,它们恰好被允许作为关键字参数。

答案 1 :(得分:4)

为什么呢?谁知道,但除非您定义xy参数,否则看起来不会创建一行。 xdataydata仅在创建行时更改行的数据,并且似乎没有参数创建它。试试这个:

plt.plot([0],[0],xdata = [1,2,3,4], #numpy.array([3,4]),
               ydata = [4,5,6,7], #numpy.array([3,4]), 
               color = 'red', 
               marker = 'o')

它的工作原理我认为你打算这样做。