【matplotlib】凡例のハンドラーのサイズを変更する【Python】
MAX
MAX999blog
グラフの領域をなるべく広く取りたい時などは、凡例をなるべく省スペースにしたい。
凡例は表示位置の調整だけでなく、文字の大きさや列の間隔、余白の間隔など、色々設定できる。
サンプルデータとしてseabornからtitanicを読み込む。
1import numpy as np
2import pandas as pd
3
4import matplotlib.pyplot as plt
5import japanize_matplotlib
6import seaborn as sns
7
8%matplotlib inline
9
10df_titanic = sns.load_dataset("titanic")
1# グラフのサイズ、背景色設定
2plt.figure(figsize=(6, 4), facecolor="w")
3# 棒グラフ作成
4sns.barplot(data=df_titanic, x="pclass", y="survived", hue="deck")
5# 凡例の設定
6plt.legend()
7# グラフタイトル設定
8plt.title(f"legend_normal")
9plt.tight_layout()
10plt.show()
こんな形のグラフだと、凡例のデフォルト設定だと完全にグラフに重なってしまい、グラフが見にくくなる。
凡例をグラフ外に出して、余白を無くしたり、凡例ハンドルを小さくしたりして、省スペース化する。
legendに以下の設定を行う。
1# グラフのサイズ、背景色設定
2plt.figure(figsize=(6, 4), facecolor="w")
3# 棒グラフ作成
4sns.barplot(data=df_titanic, x="pclass", y="survived", hue="deck")
5# 凡例の設定
6plt.legend(loc="upper left", bbox_to_anchor=(1, 1), # 凡例をグラフ外の右上に表示させる
7 ncol=1, # 凡例を1列で表示させる。
8 handlelength=0.8, # 凡例ハンドルの長さを短くする。デフォルトは2.0em
9 handletextpad=0.2, # 凡例ハンドルと文字の間隔を狭くする。デフォルトは0.8em。
10 borderaxespad=0.2, # 凡例とグラフの軸の間隔を狭くする。デフォルトは0.5em。
11 borderpad=0.2 # 凡例枠の余白を狭くする。デフォルトは0.5em。
12 )
13# グラフタイトル設定
14plt.title(f"legend_space_saving1")
15plt.tight_layout()
16plt.show()
実際にはここまでやると逆に見にくくなったりすることもあるが、省スペース化の方法はいくつかあることを知っておけば、状況に応じて必要なものを使える。
2列表示にすると、凡例の枠に幅ができるため、凡例のタイトルも表示させてみる。
また、凡例を2列表示にすると、デフォルトでは列の間隔が広いため、狭くする。
1# グラフのサイズ、背景色設定
2plt.figure(figsize=(6, 4), facecolor="w")
3# 棒グラフ作成
4sns.barplot(data=df_titanic, x="pclass", y="survived", hue="deck")
5# 凡例の設定
6plt.legend(loc="upper left", bbox_to_anchor=(1, 1), # 凡例をグラフ外の右上に表示させる
7 ncol=2, # 凡例を1列で表示させる。
8 handlelength=0.8, # 凡例ハンドルの長さを短くする。デフォルトは2.0em
9 handletextpad=0.2, # 凡例ハンドルと文字の間隔を狭くする。デフォルトは0.8em。
10 borderaxespad=0.2, # 凡例とグラフの軸の間隔を狭くする。デフォルトは0.5em。
11 borderpad=0.2, # 凡例枠の余白を狭くする。デフォルトは0.5em。
12 columnspacing=0.2, # 凡例の列の間隔を狭くする。デフォルトは2.0em。
13 title="deck", # 凡例のタイトル設定
14 )
15# グラフタイトル設定
16plt.title(f"legend_space_saving2")
17plt.tight_layout()
18plt.show()
1# 凡例の設定
2plt.legend(loc="upper left", bbox_to_anchor=(1, 1), # 凡例をグラフ外の右上に表示させる
3 ncol=2, # 凡例を1列で表示させる。
4 handlelength=0.8, # 凡例ハンドルの長さを短くする。デフォルトは2.0em
5 handletextpad=0.2, # 凡例ハンドルと文字の間隔を狭くする。デフォルトは0.8em。
6 borderaxespad=0.2, # 凡例とグラフの軸の間隔を狭くする。デフォルトは0.5em。
7 borderpad=0.2, # 凡例枠の余白を狭くする。デフォルトは0.5em。
8 columnspacing=0.2, # 凡例の列の間隔を狭くする。デフォルトは2.0em。
9 title="deck", # 凡例のタイトル設定
10 )
11
(参考)matplotlib.legend
https://matplotlib.org/3.5.0/api/legend_api.html?highlight=Other%20Parameters
凡例の位置やフォントサイズなどの設定については、以下のまとめ記事から各設定の記事を参照。