matplotlibで凡例(Legend)のみを出力しようとした際の調査・実施内容の備忘録です。
基本的な凡例出力の実装例
とりあえずデータ無しで図に凡例のみを表示しようとすると実装コードは大体こんな感じになる。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# 色ラベル情報のみプロット(データなし)
colors = ["red", "blue", "green", "yellow", "magenta", "olive"]
for color in colors:
ax.plot([], [], marker="s", color=color, label=color, linestyle="none")
# 凡例設定
legend = ax.legend(frameon=False, handletextpad=0, ncol=2, columnspacing=1)
# 図出力
fig.savefig("legend.png", dpi=300)
このままでは、1. 枠線・XY軸ラベルが邪魔、2. 凡例以外の余白が大きい、という2つの問題点がある上記の図が出力される。
凡例領域のみの図出力実装例
前項の凡例出力の問題点はそれぞれ以下のように解決することができる。
- 枠線・XY軸ラベルが邪魔
それぞれ対応するオブジェクトのset_visible
関数により非表示化 - 凡例以外の余白が大きい
凡例のバウンディングボックス座標を取得し、fig.savefig
で図保存時にbbox_inches
を設定することで、凡例領域のみを保存するように対応
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# 枠線(Spines)・XY軸(Axis)ラベル非表示
for spine in ax.spines.values():
spine.set_visible(False)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
# 色ラベル情報のみプロット(データなし)
colors = ["red", "blue", "green", "yellow", "magenta", "olive"]
for color in colors:
ax.plot([], [], marker="s", color=color, label=color, linestyle="none")
# 凡例設定
legend = ax.legend(frameon=False, handletextpad=0, ncol=2, columnspacing=1)
# 凡例のバウンディングボックス座標(bbox)を取得
legend_fig = legend.figure
legend_fig.canvas.draw()
bbox = legend.get_window_extent().transformed(legend_fig.dpi_scale_trans.inverted())
# 凡例領域のみの図出力
fig.savefig("legend.png", bbox_inches=bbox, dpi=300)
コードを実行すると、凡例領域のみを切り取った上記の図を出力することが確認できた。
参考