HOWTO · Matplotlib
Matplotlib で凡例をプロットの外側に配置する方法
Matplotlib で凡例を座標軸の外側に配置し、保存した図でも凡例が表示されるようにする方法を解説します。
このページの内容
Matplotlib の凡例を座標軸の外側に置くには、bbox_to_anchor と loc を指定します。たとえば ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) とすると、凡例の左上が座標軸の右上端より少し外側に配置されます。既定の座標系では、座標軸の左下が (0, 0)、右上が (1, 1) です。
bbox_to_anchor の例
2つの値を指定する bbox_to_anchor を使うと、凡例を座標軸のすぐ外側に配置できます。Axes.legend では、この2つの値は座標軸座標系でのアンカーポイントです。loc は、凡例の対応する角をその点に合わせます。次の例では2本の曲線にラベルを付け、凡例用の余白を図に確保しています。
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)
より細かく位置を調整する場合、bbox_to_anchor には (x0, y0, width, height) の4つの値も指定できます。これは凡例のサイズではなく、アンカーボックスを定義します。(x0, y0) はボックスの左下の座標で、width と height は座標軸座標系でのボックスの幅と高さです。loc は、凡例上のどの点をボックス上の対応する点に合わせるかを選びます。たとえば loc="upper left" なら、凡例の左上をボックスの左上に合わせます。文字列では "upper right"、"lower left"、"center"、"best" などが使えます。数値コードも指定でき、"best" が 0、"center" が 10 です。
tight_layout() は、ラベルやタイトルなどの座標軸まわりの要素が収まるようにサブプロットのパラメーターを調整します。ただし、どのレイアウトでも外側の凡例用の余白を確実に確保できるわけではありません。ウィンドウ上で凡例が見えるようにするには、fig.subplots_adjust(right=...) で余白を設けるか、座標軸と凡例の両方が収まるレイアウトを選びます。例の画像では凡例が外側に配置されています。トリミングされた画像は、図に余白がない場合に起こり得る状態を示しています。
凡例ボックスがトリミングされないようにするための bbox_extra_artists および bbox_inches
図を保存するときは、外側に置いた凡例を bbox_extra_artists に渡し、bbox_inches="tight" を指定します。これにより、保存時に図のタイトな境界ボックスを計算する際、凡例も考慮されるため、出力画像に凡例が含まれます。この例は正常に実行され、一時ディレクトリに PNG ファイルを保存します。標準出力と標準エラー出力はありません。
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
with TemporaryDirectory() as directory:
output_path = Path(directory) / "example.png"
fig.savefig(
output_path,
dpi=300,
format="png",
bbox_extra_artists=(legend,),
bbox_inches="tight",
)
plt.close(fig)
bbox_extra_artists には、Matplotlib がタイトな境界ボックスを計算するときに含める Artist を指定します。bbox_inches="tight" を指定すると、savefig はその計算結果を保存画像の範囲として使います。これらのオプションは保存時のトリミングに対処するもので、座標軸内で凡例の位置やサイズを変えるものではありません。
保存例は終了コード 0 で完了し、標準出力と標準エラー出力はいずれも空でした。そのため、表示される出力はありません。