HOWTO · Matplotlib

Matplotlib でグラフ座標の凡例位置を指定する方法

この記事では、Matplotlib でグラフ内の凡例の位置を指定する方法を説明します。

このページの内容

Matplotlibの凡例は、loc に "upper left" や "lower right" などの標準位置を指定して配置できます。特定の座標に置くには、loc と bbox_to_anchor を組み合わせます。bbox_to_anchor がアンカー座標を指定し、loc がその座標に合わせる凡例上の点を選びます。Matplotlibの既定の borderaxespad によって少し隙間ができるため、凡例上の点は座標からわずかに離れて見えることがあります。正確に揃えるには borderaxespad=0 を設定します。

Matplotlibの凡例位置を loc と bbox_to_anchor で指定する例

次の例では2つの座標軸を作成し、それぞれに凡例を付けます。1つ目の座標軸では best、2つ目では lower left を使います。これらの値を変更すると、自分のプロットデータに対する標準的な配置を比較できます。図には実行結果のプロットが示され、コードでは調整する設定を確認できます。

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="0.5x+1")
ax[0].plot(x, y2, "g-", label="2x+1")
ax[0].legend(loc="best")

ax[1].plot(x, y1, "b-", label="0.5x+1")
ax[1].plot(x, y2, "g-", label="2x+1")
ax[1].legend(loc="lower left")

plt.tight_layout()
plt.show()

Specify Legend position in graph coordinates Matplotlib

loc には、best、upper right、upper left、lower left、lower right、right、center left、center right、lower center、upper center、center などを指定できます。

best
upper right
upper left
lower left
lower right
right
center left
center right
lower center
upper center
center

標準位置を指定する場合、loc は座標軸内で凡例の位置を決めます。best を指定すると、プロットの内容に基づいて Matplotlib が配置を選びます。lower left のような名前付きの値を使えば、位置を直接選べます。凡例が重要な線やマーカーに重なる場合は、一覧から別の値を試してください。これらの位置は座標軸に対する凡例の配置を表し、図全体で共通の位置を表すものではありません。

座標を使って配置する場合は、bbox_to_anchor でアンカー座標を指定し、loc でその座標に合わせる凡例上の点を選びます。次の例では、それぞれのアンカーを各座標軸に対する相対座標で指定しています。ax.transAxes を使って同じ座標に赤いマーカーを描くため、アンカーの位置を目で確認できます。2つの座標軸で異なる loc の値を使い、選択した凡例上の点がどう変わるかを示しています。既定の borderaxespad があるため、凡例は各マーカーから少し離れて表示されますが、マーカーはアンカー座標を示します。

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="Plot-1")
ax[0].plot(x, y2, "g-", label="Plot-2")
ax[0].legend(loc="upper left", bbox_to_anchor=(0.9, 0.75))
ax[0].scatter((0.9), (0.75), s=70, c="red", transform=ax[0].transAxes)

ax[1].plot(x, y1, "b-", label="Plot-1")
ax[1].plot(x, y2, "g-", label="Plot-2")
ax[1].legend(loc="center right", bbox_to_anchor=(0.6, 0.4))
ax[1].scatter((0.6), (0.4), s=70, c="red", transform=ax[1].transAxes)

plt.tight_layout()
plt.show()

Set bbox_to_anchor to specify Legend position in graph coordinates Matplotlib

上側の座標軸では、bbox_to_anchor=(0.9, 0.75) によって赤いマーカーの位置にアンカーを置きます。loc="upper left" のため、既定の borderaxespad による小さな隙間を空けて、凡例の左上の点がアンカーに揃います。下側の座標軸ではアンカーが (0.6, 0.4)、loc="center right" なので、凡例の中央右の点が下側の赤いマーカーに揃い、同じ余白の影響を受けます。選択した点をマーカーにぴったり合わせるには、その座標軸の legend 呼び出しに borderaxespad=0 を追加します。

どちらの配置も、自分のプロットに適用するには、まず対象の座標軸に対する x 座標と y 座標を選び、対応する bbox_to_anchor のタプルに設定します。プロットを調整しながら、その点にマーカーを付けます。そこに揃えたい凡例上の点に応じて loc の値を選びます。この2つの設定は連動します。アンカーだけを変更すると選択した点が移動し、loc を変更するとアンカーに揃う凡例上の点が変わります。視覚的な目印と凡例が同じ座標空間を使うよう、各マーカーの変換には凡例と同じ座標軸を指定してください。小さな隙間を残す場合は既定の borderaxespad を使い、マーカーに正確に揃える場合は legend 呼び出しで borderaxespad=0 を設定します。コンソール出力は示していません。上の図に実行結果のプロットを示しています。