matplotlibで作成したグラフに凡例を付け加える方法を説明します。
開発環境
- matplotlib 3.3.4
- Python 3.7.9
凡例を表示させる
グラフに凡例を表示させるためには、そのAxesインスタンスのlegendメソッドを用います。
グラフ作成時にlabelを指定する方法
グラフ作成時にそのグラフのラベルをlabel引数で指定すると、最後にlegendメソッドを実行するだけでグラフに対応するラベルを自動的に凡例に表示してくれます。legendメソッドの引数に何も指定しない場合は、そのAxesに登録されたグラフのlabelプロパティが凡例として用いられます。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [0, 2, 1, 2, 4, 5, 3, 7, 5, 9]
y2 = [2, 1, 2, 3, 3, 2, 6, 5, 8, 7]
fig, ax = plt.subplots()
ax.plot(x, y1, label='Y1')
ax.plot(x, y2, label='Y2')
ax.legend()
plt.show()
なお、一部のグラフだけにラベルを設定した場合は、legendメソッドによってラベルを指定したグラフの凡例だけが表示されます。
凡例の作成時に表示する文字列を指定する方法
すべてのグラフに凡例をつける
グラフ作成時にはラベルを指定せずに、もしくはすでに設定してあるラベルとは別のものを凡例として指定することもできます。この時はlegendメソッドの引数に、Axesに登録されたグラフの順番にリストとして凡例を渡します。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [0, 2, 1, 2, 4, 5, 3, 7, 5, 9]
y2 = [2, 1, 2, 3, 3, 2, 6, 5, 8, 7]
fig, ax = plt.subplots()
ax.plot(x, y1)
ax.plot(x, y2)
ax.legend(['Y1', 'Y2'])
plt.show()
グラフを選んで凡例をつける
複数のグラフを表示させている場合に、その一部だけに凡例をつけたい場合もあります。その時はlegendメソッドの第1引数に凡例を表示させたいグラフのオブジェクトを、第2引数に表示させたい凡例をともにリスト形式で渡します。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [0, 2, 1, 2, 4, 5, 3, 7, 5, 9]
y2 = [2, 1, 2, 3, 3, 2, 6, 5, 8, 7]
height = [1, 3, 1, 2, 4, 3, 5, 7, 4, 6]
fig, ax = plt.subplots()
line2d1 = ax.plot(x, y1)
line2d2 = ax.plot(x, y2)
ax.bar(x, height, color='c')
ax.legend([line2d1[0], line2d2[0]], ['A', 'B'])
plt.show()
この方法では、リストに渡す順番を変えることで凡例として表示させる順番も自由に調整できるというメリットもあります。
凡例を表すオブジェクト
凡例を表すオブジェクトの実体はLegendクラスのインスタンスになります。legendメソッドで凡例を作成すると実際に作成された凡例を表すLegendインスタンスが返されます。
凡例のオブジェクトを取得するためには、次のようにlegendメソッドで凡例を作成する際に戻り値を取得できるようにしておきましょう。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [0, 2, 1, 2, 4, 5, 3, 7, 5, 9]
y2 = [2, 1, 2, 3, 3, 2, 6, 5, 8, 7]
fig, ax = plt.subplots()
ax.plot(x, y1, label='Y1')
ax.plot(x, y2, label='Y2')
legend = ax.legend()
print(type(legend))
<class 'matplotlib.legend.Legend'>
凡例のスタイルを調整する
スタイルを指定して凡例を作成する
凡例の設定項目はLegendクラスのプロパティからアクセスできないものもあるので、凡例作成時にスタイルを指定しましょう。
例えば凡例の場所を変える場合はlegendメソッドにloc引数を指定します。凡例の場所はデフォルトでrcParams[“legend.loc”]の設定を参照しますが、以下のように指定可能です。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [0, 2, 1, 2, 4, 5, 3, 7, 5, 9]
y2 = [2, 1, 2, 3, 3, 2, 6, 5, 8, 7]
fig, ax = plt.subplots()
ax.plot(x, y1, label='Y1')
ax.plot(x, y2, label='Y2')
ax.legend(loc='lower right')
plt.show()
なお、ここで指定可能なものは次の通りで、rcParams[“legend.loc”]のデフォルトは’best’となっています。
legendメソッドの引数として設定可能なスタイル要素はLegendクラスのイニシャライザ(__init__メソッド)の引数を指定可能で、代表的なものは次のようなものになります。
- edgecolor:凡例の枠の色
- facecolor:凡例の色
- fancybox:凡例の角を丸くするかどうか
- fontsize:フォントサイズ
- framealpha:凡例の透過度
- frameon:枠をつけるかどうか
- labelcolor:凡例の文字色
- loc:凡例の位置
- ncol:凡例の列数
- shadow:影をつけるかどうか
- title:凡例のタイトル
凡例を作成してからスタイルを変更する
凡例を表すLegendインスタンスを取得することで、凡例を作成してからその設定を変更することも可能です。例えば、凡例のタイトルはtitleプロパティで取得・変更できるので、次のようにプロパティから設定することも可能です。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [0, 2, 1, 2, 4, 5, 3, 7, 5, 9]
y2 = [2, 1, 2, 3, 3, 2, 6, 5, 8, 7]
fig, ax = plt.subplots()
ax.plot(x, y1, label='Y1')
ax.plot(x, y2, label='Y2')
legend = ax.legend()
legend.set_title('Legend')
plt.show()
ただし、ここで設定できるのは一部の項目のみなので、基本的には凡例の生成時にスタイルを設定する使い方となります。
コメント