或者,为什么不
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>]
答案 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_*
具有Line2D
和set_xdata
方法,因此它们会显示在关键字参数列表中。
关键是,关键字参数在set_ydata
的大部分初始化之后才会实际使用,如果您没有指定任何参数,Line2D
将不会初始化任何plot
1}}的。
你可以认为这是一个错误,但我怀疑它会被修复。我不认为Line2D
和xdata
曾被用作关键字参数。
ydata
和set_xdata
可让您快速更新set_ydata
实例,而不是创建新实例(适用于动画等)。由于matplotlib的设置方式,它们恰好被允许作为关键字参数。
答案 1 :(得分:4)
为什么呢?谁知道,但除非您定义x
和y
参数,否则看起来不会创建一行。 xdata
和ydata
仅在创建行时更改行的数据,并且似乎没有参数创建它。试试这个:
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')
它的工作原理我认为你打算这样做。