2012-01-23 9 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のの構造についてもう少し理解する必要があります。 plt.setpのような "matlab-isms"を許可し、Pythonの古いバージョンとの互換性を維持するために、matplotlibはプロパティを避け、getterとsetterに大きく依存します。 (plotは、実際には最も複雑なケースの1つで、それをサポートするのは狂気のようなものだからです)。

これは時代遅れの気味悪いデザインですが、それはポイントの横にあります。あなたがplotを呼び出すときに、実際に(plot(x, y, other=stuff)の最も単純なケースのために)何が起こる

は新しいmatplotlib.line.Line2Dオブジェクトが最初の二つの引数から作成され、その後、matplotlib.line.Line2D.update(kwargs)が呼び出されるということです。

for key, value in kwargs.iteritems(): 
    func = getattr(self, 'set_'+key) 
    func(value) 

は私が過簡素化していますが、それは基本的な考え方です:

updateは基本的にありません。

また、受け入れたキーワード引数リストは、基本的にはset_*のものから自動生成されます。 Line2Dset_xdataset_ydataのメソッドを持つため、キーワード引数リストに表示されます。

ポイントはキーワード引数が実際にLine2Dの初期化の最も後まで使用されることはありません、と引数を指定しない場合、plotはどのLine2D年代を初期化しないこと、です。

あなたはこれをバグと見なすことができますが、それは修正されるとは思えません。私はxdataydataがキーワードの引数として使われることを意図していなかったと思います。

set_xdataset_ydataは、新しいものを作成する代わりにLine2Dインスタンスをすばやく更新できるようにします(アニメーションなどの場合)。 matplotlibが設定されているため、キーワード引数として許可されるだけです。

+0

私は参照してください。わかりました、ありがとう! – aresnick

+0

非常に参考になる説明。とても感謝しております。 –

3

なぜですか?誰が知っていますが、xy引数を定義しない限り、行は作成されません。 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') 

私はあなたがそれを意図していると思います。

+0

素晴らしいです。ありがとう! – aresnick

関連する問題