【Python】matplotlibで凡例を表示する

matplotlibではlegend()を使ってグラフに凡例を表示させることができます。

今回はlegend()の基本的な使い方からカスタマイズして使う使い方まで紹介していきます。

使用するデータ

今回は以下のようなデータを作成、グラフに描画します。

import numpy as np
from matplotlib import pyplot as plt

x = np.linspace(0, 10, 1000)
y1 = np.cos(x)
y2 = np.sin(x)

fig, ax = plt.subplots()
ax.plot(x, y1)
ax.plot(x, y2)
fig, ax = plt.subplots()ax.plot(x, y1)ax.plot(x, y2)

凡例を表示する

凡例はlegend()で表示させます。引数と特に指定していない場合は、plot()でlabelに指定した値が凡例として表示されます。

fig, ax = plt.subplots()
ax.plot(x, y1, label="cos")
ax.plot(x, y2, label="sin")
ax.legend()
ax.plot(x, y1, label="cos")ax.plot(x, y2, label="sin")ax.legend()

legend()内で表示したいラベルを指定する場合はラベルのリストを渡します。ラベルはプロットの順に適用されます。

プロットの数以上のラベルをリストの要素に含めた場合、プロット数を上回る分のラベルは無視されます。このときエラーは出ません。

fig, ax = plt.subplots()
ax.plot(x, y1, label="cos")
ax.plot(x, y2, label="sin")
ax.legend(["cosine", "sine", "tan"])
ax.plot(x, y1, label="cos")ax.plot(x, y2, label="sin")ax.legend(["cosine", "sine", "tan"])

凡例の位置を指定する

上記のやり方だけでは、凡例を表示することはできていますが、表示位置は自動配置されています。以下、位置を指定する方法をまとめます。

loc

引数locで凡例をグラフ中のどこに配置するかを指定することができます。locには指定の文字列または座標のタプルを渡します。

文字列で指定

locで指定できる文字列には以下のようなものがあります。

  • ‘best’
  • ‘upper right’
  • ‘upper left’
  • ‘lower left’
  • ‘right’
  • ‘center left’
  • ‘center right’
  • ‘lower center’
  • ‘upper center’
  • ‘center’

デフォルトは’best’です。’best’は描画したプロットと極力被らないように最適化された位置に凡例を配置してくれます。

locのみ指定した場合は、プロット全体に対する位置を意味します。プロット中の任意の範囲内で凡例位置を指定する場合は、後述のbbox_to_anchorと組み合わせます。

例として、’upper left’を指定してみます。

fig, ax = plt.subplots()
ax.plot(x, y1, label="cos")
ax.plot(x, y2, label="sin")
ax.legend(loc="upper left")
ax.plot(x, y1, label="cos")ax.plot(x, y2, label="sin")ax.legend(loc="upper left")

座標で指定

座標のタプルを渡すことで、より細かく位置をを指定することができます。座標はAxis座標(プロット範囲)の左下が(0,0)、右上が(1,1)です。指定した座標が凡例の左下に位置します。

Axis座標系におけるlocの位置
fig, ax = plt.subplots()
ax.plot(x, y1, label="cos")
ax.plot(x, y2, label="sin")
ax.legend(loc=(0.4,0.4))
ax.plot(x, y1, label="cos")ax.plot(x, y2, label="sin")ax.legend(loc=(0.4,0.4))

bbox_to_anchorとlocを組み合わせる

bbox_to_anchorは座標系(loc等)で基準となる点を作成します。locのみで指定した場合はプロット範囲全体の中で位置を指定していましたが、bbox_to_anchorを指定指定することでプロット内の特定の範囲で凡例の位置を指定することができます。

bbox_to_anchorは(x, y, width, height)で表します。loc同様範囲の左下が(x, y)に相当します。そこから右方向への距離がwidth、上方向への距離がheightとなります。

範囲の左下が(x, y)に相当します。そこから右方向への距離がwidth、上方向への距離がheightとなります。

下の例では、bbox_to_anchorを(0.5, 0.5, 0.5, 0.5)に指定した場合です。bbox_to_anchorの範囲を赤枠で表しました。

fig, ax = plt.subplots()
ax.plot(x, y1, label="cos")
ax.plot(x, y2, label="sin")
ax.legend(bbox_to_anchor=(0.5, 0.5, 0.5, 0.5),loc="upper left", borderaxespad=0.5)
ax.plot(x, y1, label="cos")ax.plot(x, y2, label="sin")ax.legend(bbox_to_anchor=(0.5, 0.5, 0.5, 0.5),loc="upper left", borderaxespad=0.5)

borderaxespadはbbox_to_anchorで指定した矩形と凡例間の隙間(パディング)をフォントサイズの単位で指定することができます。

まとめ

matplotlibでグラフに凡例を表示する方法を紹介しました。

凡例は簡単につけることができる一方、細かく位置を指定することもできます。肝心のプロットの邪魔にならないように気を付けたいところです。

ではでは👋