はじめに
matplotlib では通常、plot
したラインに label
を付けて ax.legend()
を呼ぶだけで凡例が作れます。しかし、実際のプロットとは別に「手動で凡例を作りたい」ケースもあります。
例えば、色や線種の組み合わせを明示したいけど、プロットの中には出したくない場合などです。そんなときは matplotlib.lines.Line2D
を使って、凡例のハンドル(見た目だけの線オブジェクト)を作成できます。
サンプルコード
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
fig, ax = plt.subplots(figsize=(6, 4))
# ダミーのプロット(凡例には使わない)
ax.plot([0, 1], [0, 1], color='gray', linestyle=':')
# 凡例用のハンドルを手動で作成
legend_handles = [
Line2D([0], [0], color='r', linestyle='-', label='RP1'),
Line2D([0], [0], color='r', linestyle='--', label='Target1'),
Line2D([0], [0], color='g', linestyle='-', label='RP2'),
Line2D([0], [0], color='g', linestyle='--', label='Target2'),
Line2D([0], [0], color='b', linestyle='-', label='RP3'),
Line2D([0], [0], color='b', linestyle='--', label='Target3'),
Line2D([0], [0], color='y', linestyle='-', label='RP4'),
Line2D([0], [0], color='y', linestyle='--', label='Target4'),
]
# 凡例を追加
ax.legend(
handles=legend_handles,
loc='upper center',
bbox_to_anchor=(0.5, 1), # プロットの外に出す
ncol=4,
fontsize=8,
frameon=True
)
plt.show()
出力イメージ
plot
でlabel
を指定していなくてもこのように凡例を手動で作ることができる.
ポイント
-
Line2D
を使うと、実際に描画しなくても凡例用の線を作れる -
label
をLine2D
側で設定すれば、ax.legend(labels=...)
は不要 -
bbox_to_anchor
を調整すれば凡例の位置を細かくコントロール可能 -
ncol
で列数を揃えると横並びに整理できる
まとめ
matplotlib で凡例を「完全に手動でコントロール」したいときは、Line2D
を使って凡例用ハンドルを作成しましょう。これにより、プロット内容に依存しない柔軟な凡例の作成が可能になります。