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()
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()
上側の座標軸では、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 を設定します。コンソール出力は示していません。上の図に実行結果のプロットを示しています。