20

次のプログラムは正常に実行されますが、凡例が 1 つしか表示されません。4 つの凡例をすべて表示するにはどうすればよいですか? 添付の画像をご覧ください。

import matplotlib.pyplot as plt
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]}

xs = [0,1,2,3,4]


for i in [1,2,3,4]:
    plt.plot(xs,dct['list_%s' %i])
    plt.legend(['%s data' %i])

plt.show()

ここに画像の説明を入力

4

2 に答える 2

31
import matplotlib.pyplot as plt
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]}

xs = [0,1,2,3,4]


for i in [1,2,3,4]:
    plt.plot(xs,dct['list_%s' %i], label='%s data' % i)

plt.legend()

plt.show()

あなたはその仕組みに逆らい、legend呼び出されるたびに現在の凡例を破壊し、新しい凡例に置き換えます。文字列のリストのみを指定すると、ラベルがなくなるまでlegendアーティスト(描画されるデータを表すオブジェクト)を繰り返し処理します(したがって、最初の曲線は4番目の曲線としてラベル付けされます)。コマンドにinaxesを含めると、引数なしで呼び出すと、アーティスト*を反復処理し、ラベル付きのアーティストの凡例エントリを生成します。kwarg labelplotlegend

[*]どのアーティストをピックアップするかについていくつかの例外があります

于 2013-02-12T05:50:35.193 に答える
10

私の知る限り、すべての引数を指定して、legend を 1 回呼び出す必要があります。

import matplotlib.pyplot as plt
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],
       'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]}

xs = [0,1,2,3,4]

lines = []    
for i in range(1,5):
    lines += plt.plot(xs,dct['list_%s' %i], label="{} data".format(i))

後で get_label() を呼び出せるように、ここでラベルを plot 関数の引数の 1 つとして含めていることに注意してください。

labels = [l.get_label() for l in lines]
plt.legend(lines, labels)
plt.show()

これは、別の軸 (twinx など) がある場合にも機能し、すべての凡例情報が 1 つの凡例に表示されます。ところで、% 表記は古いので str.format() の方がいいと思い出すようですが、残念ながらその理由は思い出せません。

于 2013-02-12T05:54:27.223 に答える