【matplotlib】円グラフのラベル位置を変更する【Python】
matplotlibの円グラフのラベルを円グラフ内に表示する方法。
円グラフは1次元配列しか扱えないため、seabornには存在しないので、matplotlibで描くしかない。
デフォルトで円グラフを書くと、グラフの周りのスペースが無駄に思えたりする時もあるので、スペースを有効に使いたい時などにラベルの位置を変更できると良い。
また、ラベルの位置だけでなく円グラフの大きさも変更する。
データ準備
円グラフ作成用に以下のようなデータを作成。
1import pandas as pd
2import matplotlib.pyplot as plt
3import japanize_matplotlib
4
5data_items = ["家賃", "水道光熱費", "通信費", "食費", "交際費", "医療費"]
6data_values = [10, 1.5, 1.3, 2.5, 3, 0.5]
7df = pd.DataFrame(data={"項目名": data_items, "金額(万円)": data_values})
8print(df)
9# 項目名 金額(万円)
10# 0 家賃 10.0
11# 1 水道光熱費 1.5
12# 2 通信費 1.3
13# 3 食費 2.5
14# 4 交際費 3.0
15# 5 医療費 0.5
家計簿のようなイメージ。
シンプルな円グラフの作成
グラフ開始位置はデフォルトだと水平位置なので、90度回転させて垂直位置から始まるようにする。
また、数値から割合を自動計算してくれるので、割合を小数点第一位まで表示する。
1# グラフの大きさと背景色設定
2plt.figure(figsize=(5, 5), facecolor="w")
3# 金額の昇順で並び替え
4_df = df.sort_values("金額(万円)", ascending=True)
5# 円グラフの設定
6plt.pie(x=_df["金額(万円)"], labels=_df["項目名"],
7 startangle=90, # グラフの開始位置を0時にする
8 autopct="%.1f%%", # 数値の表示を小数点第一位までにする
9 )
10title = "pie_simple"
11plt.title(title)
12plt.tight_layout()
13plt.show()
このグラフでも十分だが、余白が大きく無駄に感じることもある。
ラベルを円グラフの上に表示すれば、もっと省スペースで円グラフを表示できる。
ラベルを円グラフ上に表示する
ラベルの表示位置はlabeldistance
で設定可能。大体0.7〜0.8ぐらいに設定すると、円グラフ上に表示される。
ラベルを内側にすることで、割合表示と重なってしまうこともある。そのため、pctdistance
で割合の表示位置も調整する。ただし、小さくしすぎると中心に集まって重なってしまうため、0.4〜0.5ぐらいにしておいた方が良い。
ラベルと割合の表示位置を変えると、ラベルは円グラフ上に表示されるようになるが、これだけだと、元々ラベルが表示されていた余白部分は残ったままになる。
そこを円グラフで埋めるために、円グラフの半径も変更する。
円グラフの半径はradius
で変更可能。大体1.2ぐらいでグラフの領域内にいい感じに広がって描画される。
1# グラフの大きさと背景色設定
2plt.figure(figsize=(5, 5), facecolor="w")
3# 金額の昇順で並び替え
4_df = df.sort_values("金額(万円)", ascending=True)
5# 円グラフの設定
6plt.pie(x=_df["金額(万円)"], labels=_df["項目名"],
7 startangle=90, # グラフの開始位置を0時にする
8 autopct="%.1f%%", # 数値の表示を小数点第一位までにする
9 pctdistance=0.5, # 割合の表示位置。デフォルトは0.6。
10 labeldistance=0.8, # ラベルの表示位置。デフォルトは1.1。
11 radius=1.2, # 円グラフの半径。デフォルトは1.0
12 )
13title = "pie_inner_label"
14plt.title(title)
15plt.tight_layout()
16plt.show()
グラフのスペースを有効活用できるようになった。
ラベルを回転表示する
rotatelabels
にTrueを設定すると、ラベルを回転させて表示できる。
1# グラフの大きさと背景色設定
2plt.figure(figsize=(5, 5), facecolor="w")
3# 金額の昇順で並び替え
4_df = df.sort_values("金額(万円)", ascending=True)
5# 円グラフの設定
6plt.pie(x=_df["金額(万円)"], labels=_df["項目名"],
7 startangle=90, # グラフの開始位置を0時にする
8 autopct="%.1f%%", # 数値の表示を小数点第一位までにする
9 pctdistance=0.5, # 割合の表示位置。デフォルトは0.6。
10 labeldistance=0.7, # ラベルの表示位置。デフォルトは1.1。
11 radius=1.2, # 円グラフの半径。デフォルトは1.0
12 rotatelabels=True, # ラベル表示の回転有無。デフォルトはFalse
13 )
14title = "pie_inner_label_rotate"
15plt.title(title)
16plt.tight_layout()
17plt.show()
ラベルの重なり具合によっては、ラベルを回転させた方が見やすい場合もある。
まとめ
1# 円グラフの設定
2plt.pie(x=_df["金額(万円)"], labels=_df["項目名"],
3 startangle=90, # グラフの開始位置を0時にする
4 autopct="%.1f%%", # 数値の表示を小数点第一位までにする
5 pctdistance=0.5, # 割合の表示位置。デフォルトは0.6。
6 labeldistance=0.7, # ラベルの表示位置。デフォルトは1.1。
7 radius=1.2, # 円グラフの半径。デフォルトは1.0
8 rotatelabels=True, # ラベル表示の回転有無。デフォルトはFalse
9 )
10