web-dev-qa-db-ja.com

matplotlibで複数のラベルを一度に割り当てるにはどうすればよいですか?

次のデータセットがあります。

_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()メソッドを使用するだけで複数のラベルを割り当てるエレガントな方法はありますか?

46
Kit

これらの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の回答とコメントを参照してください。

36
pelson

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

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

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

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

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

46
gcalmettes

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

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()

次のようになります。 enter image description here

29
Milla Well

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

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()

enter image description here

4
imsc

Numpyマトリックスプロットの場合、各列に複数の凡例を同時に割り当てます

2列の行列のプロットに基づいてこの質問に答えたいと思います。

2列の行列Retがあるとします

このコードを使用して複数のラベルを一度に割り当てることができます

import pandas as pd, numpy as np, matplotlib.pyplot as plt
pd.DataFrame(Ret).plot()

plt.xlabel('time')
plt.ylabel('Return')
plt.legend(['Bond Ret','Equity Ret'], loc=0)
plt.show()

これが役立つことを願っています

1
rsc05