2012-01-23 20 views
4

或者,爲什麼沒有在matplotlib中傳遞x和y數據作爲關鍵字參數?

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

您是否試過'plt.plot(xdata = [1],ydata = [1],color ='red',marker ='o')'?這與您的第一個工作示例相符。 – Velociraptors

回答

9

只是爲了擴大在什麼@Yann已經說過:

要理解爲什麼出現這種情況,您需要了解更多的關於matplotlib的結構。爲了允許「matlab-isms」像plt.setp那樣,爲了保持與老版本python的兼容性,matplotlib避免了屬性,並且嚴重依賴於getter和setter。 (plot實際上是最複雜的情​​況之一,只是由於它支持的所有瘋狂形式)。

您可以很好地爭辯說這是一個過時的unpythonic設計,但那不是重點。

實際情況(爲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) 

我囫圇吞棗,但是這是基本的想法。

此外,接受的關鍵字參數列表基本上是從任何有set_*的東西中自動生成的。因爲Line2Dset_xdataset_ydata方法,它們顯示在關鍵字參數列表中。

的一點是,該關鍵字參數都從來沒有實際使用,直到大部分Line2D初始化後,如果您不指定任何參數,plot不會初始化任何Line2D的。

你可以考慮這個錯誤,但我懷疑它會被修復。我不認爲xdataydata曾經打算用作關鍵字參數。

set_xdataset_ydata是否允許您快速更新Line2D實例而不是創建新實例(對於動畫等)。由於matplotlib的設置方式,它們恰好被允許作爲關鍵字參數。

+0

我明白了;好的,謝謝! – aresnick

+0

非常有幫助的解釋。多謝。 –

3

爲什麼?誰知道,但似乎沒有創建一行,除非你定義了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') 

它的工作原理我認爲你打算這樣做。

+0

太棒了;謝謝! – aresnick