1. ホーム
  2. python

[解決済み] matplotlib が凡例でラベルを繰り返すのを止める

2023-04-23 02:37:01

質問

非常に単純化した例です。

xvalues = [2,3,4,6]

for x in xvalues:
    plt.axvline(x,color='b',label='xvalues')

plt.legend()

凡例に'xvalues'が青い線で4回表示されるようになりました。 これを修正する以下の方法よりエレガントな方法はありますか?

for i,x in enumerate(xvalues):
    if not i:
        plt.axvline(x,color='b',label='xvalues')
    else:
        plt.axvline(x,color='b')

どのように解決するのですか?

plt.legend はパラメータとして

  1. 軸ハンドルのリストで Artist オブジェクトである
  2. 文字列であるラベルのリスト

これらのパラメータは両方ともオプションで、デフォルトは plt.gca().get_legend_handles_labels() . を呼び出す前にラベルを辞書に登録することで、重複したラベルを削除することができます。 legend . これは、辞書は重複するキーを持つことができないからです。

例えば

Python バージョン < 3.7 の場合

from collections import OrderedDict
import matplotlib.pyplot as plt

handles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys())

Pythonバージョン3.7用

Python 3.7では、辞書はデフォルトで入力順を保持します。そのため OrderedDict は必要ありません。

import matplotlib.pyplot as plt

handles, labels = plt.gca().get_legend_handles_labels()
by_label = dict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys())

ドキュメント について plt.legend