本記事では、Python / matplotlibで実例を使って、基本から複数の円グラフを書く方法をご紹介します。
Pythonの実行環境
今回は、以下の実行環境でプログラムを実行しています。
・Python 3.7.6
・Jupyterlab 1.2.6
・Pandas:1.1.2
・matplotlib:3.3.2
本記事では、実例として、アンケート結果を想定した次のデータを用います。
ファイル名は「アンケート結果.xlsx」で、シート名は「Sheet1」です。
■アンケート結果
まずは、ライブラリをインポートし、テストデータをdfとして読み込んでおきます。
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
df = pd.read_excel('アンケート結果.xlsx', sheet_name = 'Sheet1')
※本記事では、Pythonのコードの下のコメントアウトは、出力結果を示しています。
Python / matplotlibで円グラフを書く方法【基本形】
まずは、円グラフを書く基本形を見ていきます。
円グラフは、pie()を使って書きます。第一引数に円グラフの元になる値、第二引数にその値のラベルを書きます。
ちなみに、pltはグラフを書くオブジェクトと思っておくだけで大丈夫です。
また、plt.show()でグラフを表示します。
今回は、「はい」が1/7、「いいえ」が4/7、「どちらでもない」が2/7を占める円グラフになります。
plt.pie([1, 4, 2], labels=['はい', 'いいえ', 'どちらでもない'])
plt.show()
円グラフの3つのラベルの割合は、なんとなく想定どおりになったと思います。
ただ、見づらいですよね。
次は、pie()の中で、追加で円グラフの設定を加えていきます。
pie()には、数多くの設定がありますが、最低限の見やすさ、分かりやすさのための設定となります。
円グラフの設定 | pie()での書き方 |
① 時計の12時の位置を基点にする | startangle=90 |
② 時計回りでラベルを並べる | counterclock=False |
③ グラフに割合を表示する | autopct="%1.1f %%" |
④ 円グラフの値の区間に若干の隙間を入れる | wedgeprops={'linewidth': 2, 'edgecolor':"white"} |
これらの書き方は、覚える必要はなく、このような設定があることだけ認識して、使う時はコピペでOKです。
実際にコードを書くと、次の通りとなります。
plt.pie([1, 4, 2], labels=['はい', 'いいえ', 'どちらでもない'],
startangle=90,
counterclock=False,
autopct="%1.1f %%",
wedgeprops={'linewidth': 2, 'edgecolor':"white"})
plt.show()
これで円グラフとして見やすくなりましたね。
Python / matplotlibで円グラフを書く方法【実例】
それでは次は、アンケート結果の円グラフを書いていきましょう。
まずは、Q1の円グラフを1つを作成していきます。
pie()の第一引数:値、と第二引数:ラベルをどう定義するかを考えます。
Q1の選択肢となっている「a. 利用したい」、「b. どちらともいえない」、「c. 利用したくない」の3つがそれぞれ何個あるかを見ればいいです。
これには、value_counts()を使うのでいいですね。
列を指定し、value_counts()を使ってみます。
今回、列はcolumns.values[1](左から2つ目の列)で指定します。
df[df.columns.values[1]].value_counts()
#a. 利用したい 4
#b. どちらともいえない 4
#c. 利用したくない 2
これの選択肢の部分は、pie()の第二引数に、数字の部分は、第一引数に設定すれば良いですね。
この2つを次の通りリスト化します。
#数字の部分 → 第一引数
df[df.columns.values[1]].value_counts().tolist()
#[4, 4, 2]
#選択肢の部分 → 第二引数
df[df.columns.values[1]].value_counts().index.tolist()
#['a. 利用したい', 'b. どちらともいえない', 'c. 利用したくない']
これらを使って、pie()で円グラフを書きます。
plt.pie(df[df.columns.values[1]].value_counts().tolist(),
labels=df[df.columns.values[1]].value_counts().index.tolist(),
startangle=90,
counterclock=False,
autopct="%1.1f %%",
wedgeprops={'linewidth': 2, 'edgecolor':"white"})
plt.title(df.columns.values[1])
plt.show()
title()では、グラフのタイトルを指定できます。今回は、df.columns.valuesを用いて、列の項目名としました。
ここでは、plt.title()でグラフのタイトルも書いています。
これで、アンケート結果のQ1をちゃんと円グラフで書けました。
Python / matplotlibで複数の円グラフを書く方法
最後に、一度に複数の円グラフを書く方法をみていきます。
ここでのポイントは2つです。
・pltをfigとaxesに置き換えて、グラフのオブジェクトを複数作る。
・forループで、グラフの数だけ繰り返し処理を行う。
pltをfigとaxesに置き換えて、グラフのオブジェクトを複数作る
まず1つ目については、pltをfigとaxesに置きかえると、次のように書けます。
最初のplt.subplots()で、figとaxesを作っています。
※figとaxesは他の文字列でもOKです。
fig, axes = plt.subplots()
axes.pie(df[df.columns.values[1]].value_counts().tolist(),
labels=df[df.columns.values[1]].value_counts().index.tolist(),
startangle=90,
counterclock=False,
autopct="%1.1f %%",
wedgeprops={'linewidth': 2, 'edgecolor':"white"})
axes.set_title(df.columns.values[1])
plt.show()
この結果は、上のQ1の円グラフと同じになります。
plt.subplots()での引数で、nrows=3と指定すると、axesのリストが3つ出来上がります。
このaxesのリストの要素で、axes[0].pie()のようにグラフを書けば良いのです。
あと、title()はaxesではset_title()になることに注意してください。
forループで、複数のグラフを書く繰り返し処理を行う
df.columns.values[1]となっていた箇所を、
df.columns.values[1] → df.columns.values[2] → df.columns.values[3]
とするためにforループを回します。
また、plt.subplots()の引数でfigsize=(25,20)として、グラフの大きさも指定します。
fig, axes = plt.subplots(nrows=3, figsize=(25,20))
for i in range(3):
axes[i].pie(df[df.columns.values[i+1]].value_counts().tolist(),
labels=df[df.columns.values[i+1]].value_counts().index.tolist(),
startangle=90,
counterclock=False,
autopct="%1.1f %%",
wedgeprops={'linewidth': 2, 'edgecolor':"white"})
axes[i].set_title(df.columns.values[i+1])
i += 1
plt.show()
これで、アンケート結果の複数の質問について、円グラフを作成することができました。
以上、Python / matplotlibで複数の円グラフを書く方法を実例を題材にして、説明してきました。
最後まで読んでいただき、ありがとうございました。