71

私は次のデータセットを持っています:

x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4],
      [5, 6, 7, 8, 9],
      [9, 8, 7, 6, 5] ]

今私はそれをプロットします:

import matplotlib.pyplot as plt
plt.plot(x, y)

ただし、このコマンドで3つのyデータセットにラベルを付けたいので、.legend()が呼び出されるとエラーが発生します。

lineObjects = plt.plot(x, y, label=['foo', 'bar', 'baz'])
plt.legend()

File "./plot_nmos.py", line 33, in <module>
  plt.legend()
...
AttributeError: 'list' object has no attribute 'startswith'

私が調べるときlineObjects

>>> lineObjects[0].get_label()
['foo', 'bar', 'baz']
>>> lineObjects[1].get_label()
['foo', 'bar', 'baz']
>>> lineObjects[2].get_label()
['foo', 'bar', 'baz']

質問

メソッドを使用するだけで複数のラベルを割り当てるエレガントな方法はあり.plot()ますか?

4

9 に答える 9

63

ライン オブジェクト リストを繰り返し処理できるため、ラベルが個別に割り当てられます。iter組み込みの python関数を使用した例:

lineObjects = plt.plot(x, y)
plt.legend(iter(lineObjects), ('foo', 'bar', 'baz'))`

編集: matplotlib 1.1.1 に更新した後plt.plot(x, y)、リストのリストとして y を使用した (質問の作成者によって提供された) が機能しなくなったようです。numpy.arrayy 配列を反復せずに 1 ステップでプロットすることは、y を((numpy)[http://numpy.scipy.org/] が以前にインポートされていると仮定して)渡した後でも可能です。

この場合、plt.plot(x, y)(2D y 配列のデータが列 [軸 1] として配置されているplt.plot(x, y.transpose())場合) または (2D y 配列のデータが行 [軸 0] として配置されている場合) を使用します。

編集2: @pelsonが指摘したように(以下の解説を参照)、iter関数は不要であり、単純な機能はplt.legend(lineObjects, ('foo', 'bar', 'baz'))完全に機能します

于 2012-07-14T17:59:09.403 に答える
47

これらの 2 つの配列を互いに直接プロットすることはできません (少なくともバージョン 1.1.1 では)。したがって、y 配列をループする必要があります。私のアドバイスは、ラベルを同時にループすることです。

import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 7, 6, 5] ]
labels = ['foo', 'bar', 'baz']

for y_arr, label in zip(y, labels):
    plt.plot(x, y_arr, label=label)

plt.legend()
plt.show()

編集: @gcalmettes は、numpy 配列として、すべての行を同時に (転置することにより) プロットできることを指摘しました。詳細については、@gcalmettes の回答とコメントを参照してください。

于 2012-07-15T15:54:13.707 に答える
38

私は同じ問題に遭遇し、今では最も簡単な解決策を見つけました! うまくいけば、それはあなたにとって手遅れではありません。イテレータはありません。結果を構造体に割り当てるだけです...

from numpy import *
from matplotlib.pyplot import *
from numpy.random import *

a = rand(4,4)
a
>>> array([[ 0.33562406,  0.96967617,  0.69730654,  0.46542408],
   [ 0.85707323,  0.37398595,  0.82455736,  0.72127002],
   [ 0.19530943,  0.4376796 ,  0.62653007,  0.77490795],
   [ 0.97362944,  0.42720348,  0.45379479,  0.75714877]])

[b,c,d,e] = plot(a)
legend([b,c,d,e], ["b","c","d","e"], loc=1)
show()

次のようになります。 ここに画像の説明を入力

于 2012-11-17T14:19:57.543 に答える
4

曲線をプロットしながらラベルを付けることができます

import pylab as plt

x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 7, 6, 5] ]
labels=['foo', 'bar', 'baz']
colors=['r','g','b']

# loop over data, labels and colors
for i in range(len(y)):
    plt.plot(x,y[i],'o-',color=colors[i],label=labels[i])

plt.legend()
plt.show()

ここに画像の説明を入力

于 2012-07-14T13:15:14.070 に答える