【データ分析】PandasとMatplotlibで円グラフを描画する


投稿日 2021年1月28日 >> 更新日 2023年3月1日

今回はPython外部ライブラリのPandasとMatplotlibを使用して円グラフとドーナッツグラフを描画していきたいと思います。

データ分析ではよくカテゴリーデータを扱うことが多いので、各カテゴリーごとの総数を調べたり比率などを円グラフとして描画していきます。

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux
Python 3.6.9
pip 9.0.1
使用ライブラリ ライセンス
matplotlib==3.1.1 PSF
pandas==1.0.0 BSD

ライブラリのインストール

pipを使用してインストールします。

※ここでは「使用ライブラリ」のバージョンで実装します

$ pip install matplotlib pandas

カテゴリーデータの準備をしてvalue_countsで数を調べる

カテゴリカルなデータを準備したら、PandasのSeriesもしくわDataFrameにそれぞれ格納して各カテゴリー要素の数を調べていきます。

Series

Seriesに格納する場合はリストもしくわタプルで渡します。


import pandas as pd

data = ['cat', 'monkey', 'cat', 'dog', 'dog', 'monkey', 'human', 'cat', 'dog', 'cat', 'cat']

ser = pd.Series(data)
ser
0        cat
1     monkey
2        cat
3        dog
4        dog
5     monkey
6      human
7        cat
8        dog
9        cat
10       cat
dtype: object

value_countsを使用してカテゴリーごとの数を取得します。


ser.value_counts()
cat       5
dog       3
monkey    2
human     1
dtype: int64

カテゴリーネームとカテゴリーの値をそれぞれ取得します。

※リストにしているのは見やすくしているだけなので、無くても取得できます。


print(list(ser.value_counts().index))
print(list(ser.value_counts()))
# ['cat', 'dog', 'monkey', 'human']
# [5, 3, 2, 1]

DataFrame

次にDataFrameに格納した際の例ですが、ほぼ同じです。

先ほどSeriesに渡したリストのデータを、辞書型のCategoryキーに格納してDataFrameに渡します。


dict_data = {'Category': data}

df = pd.DataFrame(dict_data)
df
    Category
0   cat
1   monkey
2   cat
3   dog
4   dog
5   monkey
6   human
7   cat
8   dog
9   cat
10  cat

カテゴリー要素のカラム名を指定してvalue_countsで各要素を取得します。


df['Category'].value_counts()
cat       5
dog       3
monkey    2
human     1
Name: Category, dtype: int64

カテゴリーネームとその要素をそれぞれ取得します。

※リストにしているのは見やすくしているだけなので、無くても取得できます。


print(list(df['Category'].value_counts().index))
print(list(df['Category'].value_counts()))
# ['cat', 'dog', 'monkey', 'human']
# [5, 3, 2, 1]

それぞれ円グラフの描画に必要な要素を取得することができたので、さっそくMatplotlibを使用していきます。

Matplotlibで円グラフとドーナッツグラフを描画する

Matplotlibで円グラフを描画するには、「pie」オブジェクトに要素を渡します。

公式サイトでも幾つかサンプルコードがあるので参照してみてください。

ライブラリをインポートして、最初は基本的な円グラフを描いてみます。

カテゴリーデータは先ほど準備したDataFrameの方を使用します。


import matplotlib.pyplot as plt

sizes = df['Category'].value_counts() # まとまったカテゴリーの要素
labels = df['Category'].value_counts().index # カテゴリーネーム

plt.figure(figsize=(10, 8)) # グラフ自体のサイズ(幅、高さ)
plt.pie(
    sizes,
    labels=labels,
    counterclock=False, # 時計回りに比率が高い順の設定
    startangle=90, # 表示のアングルを調整
)
plt.title('Pie Chart', fontsize=25) # グラフタイトル
#plt.savefig('Circle_1.png') # グラフイメージを保存
plt.show() # グラフを表示

基本的な円グラフは描けたかと思います。

続いて、pieオブジェクトのパラメータを少し変更して、比率の表示、ラベル(テキスト)のサイズ、凡例枠、円の影、半径のサイズ等を設定してドーナッツ型のグラフを描画してみます。


plt.figure(figsize=(10, 8))
plt.pie(
    sizes,
    labels=labels,
    counterclock=False,
    startangle=90,
    autopct='%1.1f%%', # 比率の表示
    wedgeprops=dict(width=0.5, edgecolor='w'), # widthで半径のサイズ、edgecolorで境界線の色指定
    shadow=True, # 円の影
)
plt.rcParams['font.size'] = 25 # ラベルテキストのサイズ設定
plt.legend(fontsize=15) # 凡例枠の設定
plt.title('Pie Chart', fontsize=40)
#plt.savefig('Circle_2.png') # グラフイメージを保存
plt.show()

他にも様々な設定ができるので、公式ドキュメントをご参照してみて下さい。

今回はPandasのデータ構造からカテゴリーデータを取得し、円グラフを描画してみました。

それでは以上となります。

最後までご覧いただきありがとうございました。