今回は、あるpandasデータフレームから、MatplotlibとSeabornを使って円グラフを描画する方法を紹介する。

サンプルデータフレームの用意

100人の性別が格納されたアンケートの回答結果だ。
これを乱数生成により用意した。

import pandas as pd
import random

vals = ['male', 'female', 'unanswered']
arr = random.choices(vals, k=100)

df = pd.DataFrame(arr, columns=['gender'])
print(df.head())
#    gender
# 0    male
# 1    male
# 2    male
# 3  female
# 4    male

random.choicesは、引数に指定したリストの中からランダムで値を取得する関数だ。
複数の値を取得したい場合は、kオプションに任意の数を指定する。

ライブラリのインポート

次にグラフ描画用ライブラリをインポートする。

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

sns.set(font='AppleGothic')

5行目のsns.set関数でフォントを指定しているが、使えるフォントを確認するコードも合わせて紹介しておこう。

import matplotlib.font_manager
print([f.name for f in matplotlib.font_manager.fontManager.ttflist])

上記のコードを実行すれば、現在使えるフォントを確認できるので、その中から選んで指定すると良いだろう。

円グラフの描画

データを円グラフに変換するにあたって、各データの出現頻度の割合を算出しなければならない。

データの頻度はvalue_counts()メソッドを使う。

df['gender'].value_counts()
# male          37
# female        35
# unanswered    28
# Name: gender, dtype: int64

ここまで出来れば、あとはこのデータを使ってグラフを描画するだけだ。

以下のコードを実行すると、目的の円グラフが描画される。

label = ['男性', '女性', '未回答']

plt.pie(df['gender'].value_counts(),
       labels=label, counterclock=False, startangle=90,
       autopct='%1.1f%%', pctdistance=0.7)

plt.show()

円グラフの描画はpie関数を使う。

簡単に引数の説明をしておこう。

counterclockオプションにFalseを指定しているのは、データを時計回りに入れていくことを意味し、Trueの場合は反時計回りとなる。

startangleオプションは一番最初のデータの開始位置を意味し、90の場合は円の上から開始することを意味する。

autopctオプションに特定のフォーマットを指定すると、グラフ内に構成割合のラベルが表示される。
「%1.1f%%」とした場合は、小数点1桁まで出力する。

pctdistanceオプションは、autopctで指定した構成割合のラベルをどの位置に表示するかを指定している。
円の中心から円周まで、何パーセントの位置に表示するかを表し、0.7の場合は中心から70パーセントの位置に表示する。