次のデータセットがあります。
_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()
メソッドを使用するだけで複数のラベルを割り当てるエレガントな方法はありますか?
これらの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の回答とコメントを参照してください。
ラインオブジェクトリストを反復処理できるため、ラベルが個別に割り当てられます。組み込みの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'))
は完全に機能します
同じ問題に出くわし、今では最も簡単な解決策を見つけました!うまくいけば、それはあなたにとって遅すぎることではありません。イテレータなし、結果を構造に割り当てるだけです...
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()
次のようになります。
曲線をプロットしながらラベルを付けることができます
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()
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()
これが役立つことを願っています