DataScience

【Python】【matplotlib】円グラフを作成する

Pythonのmatplotlibで円グラフを作成する。

seabornには円グラフがないため、matplotlibから作成する。

円グラフは、その特徴として、データ全体に対する各要素の割合を可視化するのに向いている。

データ作成

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

import pandas as pd

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

家計簿の項目的な何か。

なお、割合は円グラフ作成時に自動で計算してくれる。

割合を自動計算して円グラフ作成

autopctに表示形式を指定することで、割合を自動計算して表示してくれる。

# figsizeを設定。グラフの背景色を白に設定。
plt.figure(figsize=(8, 8), facecolor="w")
# データを昇順で並び替え
_df = df.sort_values("金額(万円)", ascending=True)
# 円グラフ作成。値と項目名を設定
# autopctに表示形式を指定することで割合を自動計算してくれる
plt.pie(x=_df["金額(万円)"], labels=_df["項目名"], autopct="%.1f%%")
title = "Title"
plt.title(title)
plt.tight_layout()
plt.show()

autopctの「%.1f%%」は「%.1f」が割合を計算する桁数の指定。後半の「%%」は「%」という単位を表示するための指定。1個目の%はエスケープ文字なので、%を2個重ねることとなる。

「%.2f」にすると小数点第2位まで計算してくれる。

見ての通り、グラフが0時の位置から始まっていないため、なんとなく気持ち悪い。

0時の位置から始まる円グラフ作成

startangleを指定することで、円グラフの開始位置を調整することが可能。

plt.figure(figsize=(8, 8), facecolor="w")
_df = df.sort_values("金額(万円)", ascending=True)
# startangleに90を指定
plt.pie(x=_df["金額(万円)"], labels=_df["項目名"], autopct="%.1f%%", startangle=90)
title = "Title"
plt.title(title)
plt.tight_layout()
plt.show()

startangleに90を指定することで0時の位置からグラフを作成することが可能。

デフォルトでは0に設定されており、3時の位置からグラフが開始されることになる。

時計周りに円グラフを作成

デフォルトでは開始位置から反時計回りに円グラフが作成されるが、時計回りに円グラフを作成することも可能。

plt.figure(figsize=(8, 8), facecolor="w")
_df = df.sort_values("金額(万円)", ascending=True)
# counterclockにFalseを指定することで時計回りになる
plt.pie(x=_df["金額(万円)"], labels=_df["項目名"], autopct="%.1f%%", startangle=90, counterclock=False)
title = "Title"
plt.title(title)
plt.tight_layout()
plt.show()

デフォルトではcounterclockがTrueになっているため、反時計周りに円グラフが作成されるが、Falseにすることで時計周りに円グラフが作成される。

startangleに90を指定している場合、左右反転した状態となる。

通常はグラフ作成前にデータを昇順でソートするため、時計周りに大きな値のデータから表示されることになるが、なんらかの理由で降順でソートされたデータを表示する時などに使えるかもしれない。

その他にも、ラベルの位置やグラフ自体の位置なども調整可能。

円グラフの色々な設定

割合表記やラベルの表示位置、ラベルの回転表示、グラフの半径、位置、などの設定が可能。

plt.figure(figsize=(8, 8), facecolor="w")
_df = df.sort_values("金額(万円)", ascending=True)

plt.pie(x=_df["金額(万円)"], labels=_df["項目名"], startangle=90, autopct="%.1f%%",
        pctdistance=0.3, # 割合の表示位置。デフォルトは0.6。
        labeldistance=0.8, # ラベルの表示位置。デフォルトは1.1。
        rotatelabels=True, # ラベル表示の回転有無。デフォルトはFalse
        radius=0.8, # 円グラフの半径。デフォルトは1.0
        center=(1.,-1), # 円グラフの中心の位置。デフォルトは(0, 0)
        frame=True # 座標軸表示の有無。デフォルトはFalse
       )
title = "Title"
plt.title(title)
plt.tight_layout()
plt.show()
  • pctdistance:割合の中心からの表示位置。デフォルトは0.6。設定値は半径に対する割合となる。0.3の場合、中心から半径×0.3の位置に表示される。
パラメータ内容
pctdistance割合の中心からの表示位置。デフォルトは0.6。
設定値は半径に対する割合となる。
0.3の場合、中心から半径×0.3の位置に表示される。
labeldistanceラベルの中心からの表示位置。デフォルトは1.1。
設定値は半径に対する割合となる。
0.8の場合、中心から半径×0.8の位置に表示される。
rotatelabelsラベル表示の回転有無。デフォルトはFalse。
Trueにすると、ラベルの位置(角度)に合わせて文字が回転する。
radius円グラフの半径。デフォルトは1。
center円グラフの中心位置。デフォルトは(0, 0)。
円グラフ単体の場合、変更しても特に表示は変わらない。
frame座標軸表示の有無。デフォルトはFalse。

半径や中心位置を変更しても、円グラフ単体だと何も変わらない。

rotatelabelsもTrueにすると、上下逆に表示されるラベルも出てきたりする。

必要に応じて使えれば十分。

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

自分で割合を計算して円グラフを作成したい場合は、以下の記事を参照。