matplotlib

【matplotlib】凡例の余白を少なくする【Python】

MAX

グラフの領域をなるべく広く取りたい時などは、凡例をなるべく省スペースにしたい。

凡例は表示位置の調整だけでなく、文字の大きさや列の間隔、余白の間隔など、色々設定できる。

スポンサーリンク

サンプルデータの読み込み

サンプルデータとして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()

こんな形のグラフだと、凡例のデフォルト設定だと完全にグラフに重なってしまい、グラフが見にくくなる。

凡例をグラフ外に出して、余白を無くしたり、凡例ハンドルを小さくしたりして、省スペース化する。

凡例を省スペース化する

1列で表示する例

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列表示にすると、凡例の枠に幅ができるため、凡例のタイトルも表示させてみる。

また、凡例を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

色々な凡例の設定

凡例の位置やフォントサイズなどの設定については、以下のまとめ記事から各設定の記事を参照。

【matplotlib】色々な凡例の設定まとめ【Python】
【matplotlib】色々な凡例の設定まとめ【Python】
スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました