matplotlib

【matplotlib】円グラフのラベル位置を変更する【Python】

MAX

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
あわせて読みたい
【Python】【matplotlib】円グラフを作成する
【Python】【matplotlib】円グラフを作成する
あわせて読みたい
【Python】【matplotlib】割合データから円グラフを作成する
【Python】【matplotlib】割合データから円グラフを作成する
スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました