今回はmatplotlibで円グラフを生成する方法を見ていきましょう。matplotlib.pyplotクラスには、pieが用意されており、誰でも簡単に円グラフを描画することができます。
今回は公式のドキュメントを参考に進めていきます。
参考 pyplot.pieMatplotlib 1.5.1 documentationもくじ
時間がない方のためのpieの主要な引数まとめ
x (必須) | 各要素の大きさを配列形式で指定 |
explode | 各要素を中心から話して表示する |
labels | 各要素のラベルを設定 |
colors | 各要素の色を指定 |
autopct | 構成の割合を%表記で表示 |
pctdistance | autopctの表示位置を指定(0.0=中心, 1.0=円周) |
shadow | 影を表示する(デフォルト値は False) |
labeldistance | ラベルの表示位置を指定(0.0=中心, 1.0=円周) |
startangle | 各要素の出力を開始する角度。(デフォルト値は None) |
radius | 円の半径(デフォルト値は 1) |
counterclock | 時計回りに出力(True)、反時計回りに出力(False) |
wedgeprops | 枠線の太さ等を変更 |
textprops | テキストに関するプロパティ |
円グラフ描画をpyplot.pieでマスターする
基本的な円グラフを描画する
まずは基本的な円グラフの作成方法を見ていきましょう。pyplot.pie()で円グラフを作ることができます。引数には、必須でxに出力する値を配列形式で指定します。Jupyter Notebookをお使いの方は、1行目の%matplotlib inlineを入力してください。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.array([100, 200, 300, 400, 500])
plt.pie(x)

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.array([100, 200, 300, 400, 500])
plt.pie(x)
# 最後の以下を追加する
plt.axis('equal')
ラベルを表示する
円グラフの各要素名を表示させましょう。ラベルの配列を作って引数にlabelsで指定しましょう。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
label = ['Japanese', 'mathematics', 'science', 'society', 'English']
x = np.array([100, 200, 300, 400, 500])
plt.pie(x, labels=label)
plt.axis('equal')

開始点を頂点において反時計回りに表示する
円グラフの始まりの位置を90度頂点に持ってきたい際は、startangleを90に指定します。また、反時計回りはcounterclockをFalseに指定します。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
label = ['Japanese', 'mathematics', 'science', 'society', 'English']
x = np.array([100, 200, 300, 400, 500])
# counterclockで反時計回り、startangleで開始位置を調整
plt.pie(x, labels=label, counterclock=False, startangle=90)
plt.axis('equal')

各要素をカスタマイズする
matplotlibのグラフは全体的に野暮ったさが目立ちます。できるだけカスタムして見やすくわかりやすい円グラフにしていきましょう。
要素を中心から離して強調する
引数にexplodeを指定すると要素ごとに円の中心からの距離を変更することができます。実際に見てみましょう。
plt.pie(x, labels=label, counterclock=False, startangle=90, explode=[0.2, 0, 0, 0, 0])
plt.axis('equal')

各要素の色を変更する
要素ごとの色を指定して調整しましょう。色を配列形式で作り、引数のcolorsで指定することで色を変更します。
colors = ["lightpink", "lightgreen", "gold", "lightblue", "lightcoral"]
x = np.array([100, 200, 300, 400, 500])
plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors)
plt.axis('equal')

各要素の色を濃淡表示に変更する
colors = ["0.1", "0.3", "0.5", "0.7", "0.9"]
x = np.array([100, 200, 300, 400, 500])
plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors)
plt.axis('equal')

グラフに影をつける
グラフに影をつけたい場合は、shadowを引数でTrue指定します。
plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors, shadow=True)
plt.axis('equal')

ラベルの位置を変更する
ラベルの位置を変更したい際には、labeldistanceを引数に加えます。labeldistanceを0.0にすると円の中心に配置され、1.0では円周上に配置されます。デフォルトでは1.5なので、外周に配置されます。
plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors, labeldistance=0.5)
plt.axis('equal')

枠線の太さと色を変更する
円グラフの枠線の太さと色を変更する方法を見ていきましょう。引数にwedgepropsを入れて、辞書型でlinewidthとedgecolorを指定すると修正することができます。枠線なしの場合には、linewidthを0にします。
plt.pie(x, labels=label, counterclock=False, startangle=90, wedgeprops={'linewidth': 3, 'edgecolor':"black"})
plt.axis('equal')

ラベルの色変更と太字に変更
ラベルの修飾をしていきます。色と文字を太くしてみましょう。こちらはtextpropsを引数に、colorとweightを辞書型でそれぞれ指定すると変更できます。
plt.pie(x, labels=label, counterclock=False, startangle=90, labeldistance=0.5, textprops={'color': "white", 'weight': "bold"})
plt.axis('equal')

値の割合を表示し、配置を調整する
あたいの割合を自動でグラフ上に出すこともできます。autopctで指定すると簡単に表示できます。また、pctdistanceでグラフの中心(0.0)から円周(1.0)を参考に値を指定することができます。
plt.pie(x, labels=label, counterclock=False, startangle=90, autopct="%1.1f%%", pctdistance=0.7)
plt.axis('equal')

ドーナツチャートを作成する方法
ドーナツチャートとは、真ん中に穴が空いていてドーナツ形のグラフのことです。matplotlibの円グラフではドーナツチャートを作成することができます。とはいえ、円グラフの真ん中に白い円を挿入するイメージに近いです。
基本的なドーナツチャートを作成する
ここでは、中心から70%の大きさの円を挿入してみましょう。
plt.pie(x, labels=label, counterclock=False, startangle=90)
plt.axis('equal')
# 中心(0,0)に70%の大きさで円を描画
centre_circle = plt.Circle((0, 0), 0.7, color='blue', fc='white', linewidth=1.25)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)

2重のドーナツチャートを作成する
2重のドーナツチャートは、円グラフの中に1つ円グラフを挿入し、さらに白い円を挿入すると作成できます。
# 円グラフ (外周)
x1 = np.array([100, 200, 300, 400, 500])
plt.pie(x1, labels=label, counterclock=False, startangle=90)
plt.axis('equal')
# 円グラフ (内周, 半径80%で描画)
x2 = np.array([150, 250, 300, 350, 450])
plt.pie(x2, counterclock=False, startangle=90, radius=0.8)
plt.axis('equal')
# 中心 (0,0) に 60% の大きさで円を描画
centre_circle = plt.Circle((0, 0), 0.6, color='blue', fc='white', linewidth=1.25)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)

まとめ
matplotlibのpieを用いて、棒グラフと積み上げ棒グラフの描き方を解説してきました。最後にこの記事のまとめを書いておきます。
- plt.pie()で描画できる
- 色、枠線の太さ、枠線の色などのデザイン変更が可能
- 円グラフの各要素の位置も変更可能
- 値の割合も表示可能
- ドーナツチャートは中心に白い円を挿入