6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

matplotlibで凡例(Legend)のみを出力する方法

Posted at

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)

legend.png
このままでは、1. 枠線・XY軸ラベルが邪魔、2. 凡例以外の余白が大きい、という2つの問題点がある上記の図が出力される。

凡例領域のみの図出力実装例

前項の凡例出力の問題点はそれぞれ以下のように解決することができる。

  1. 枠線・XY軸ラベルが邪魔
    それぞれ対応するオブジェクトのset_visible関数により非表示化
  2. 凡例以外の余白が大きい
    凡例のバウンディングボックス座標を取得し、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)

legend.png
コードを実行すると、凡例領域のみを切り取った上記の図を出力することが確認できた。

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?