DataScience

【Python】【matplotlib】割合データから円グラフを作成する

円グラフは全体に対する各要素の割合を可視化するのに向いている。

matplotlibの円グラフの場合、対象データから割合を自動で計算してくれるので、自分で割合を計算する必要はない。

しかし、割合がすでに計算されたデータから円グラフを表示することも可能。

データ作成

円グラフ作成用のデータを作成する。

data_items = ["家賃", "水道光熱費", "通信費", "食費", "交際費", "医療費"]
data_values = [10, 1.5, 1.3, 2.5, 3, 0.5]
data_rates = [0.6, 0.12, 0.1, 0.08, 0.03, 0.02]
df = pd.DataFrame(data={"項目名": data_items, "金額(万円)": data_values, "金額割合": data_rates})
print(df)
     項目名  金額(万円)  金額割合
0     家賃    10.0  0.60
1  水道光熱費     1.5  0.12
2    通信費     1.3  0.10
3     食費     2.5  0.08
4    交際費     3.0  0.03
5    医療費     0.5  0.02

なお、上記データの割合は適当な数値となっている。(合計して100%にならない場合の例示のため)

割合データから円グラフ作成

円グラフ作成時の引数にnormalizeにFalseを設定することで、割合の数値をそのまま円グラフに使用することが可能。

plt.figure(figsize=(8, 8), facecolor="w")
_df = df.sort_values("金額割合", ascending=True)
plt.pie(x=_df["金額割合"], labels=_df["項目名"],normalize=False, autopct="%.1f%%", startangle=90)
title = "Title"
plt.title(title)
plt.tight_layout()
plt.show()

「金額割合」列は合計しても1.0に足りないため、円グラフの一部が欠けた状態となる。

また、normalize=False設定時に、データの合計が1.0を超える場合、エラーとなる。

円グラフの合計値が1を超える場合

plt.figure(figsize=(8, 8), facecolor="w")
_df = df.sort_values("金額割合", ascending=True)
plt.pie(x=_df["金額(万円)"], labels=_df["項目名"],normalize=False, autopct="%.1f%%", startangle=90)
title = "Title"
plt.title(title)
plt.tight_layout()
plt.show()
ValueError: Cannot plot an unnormalized pie with sum(x) > 1

normalize=False時にデータの合計値が1を超えると、円グラフが1周を超えてしまうため、エラーとなる。

値データから割合を自動計算して円グラフ作成

normalizeはデフォルトでTrueになっているため、基本的にはわざわざFalseに設定してグラフ作成することはほとんどない。

割合を自動計算して円グラフを作成する方法は、以下の記事を参照。