matplotlibで様々なデザインの円グラフを描画する

今回は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を入力してください。

python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.array([100, 200, 300, 400, 500])
plt.pie(x)

注意
Jupyter Notebookで円グラフを作成する際に、表示が潰れてしまうケースがあります。その際は、以下のようにplt.axis(‘equal’)を加えてみてください。
python
%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で指定しましょう。

python
%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に指定します。また、反時計回りはcounterclockFalseに指定します。

python
%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を指定すると要素ごとに円の中心からの距離を変更することができます。実際に見てみましょう。

python
plt.pie(x, labels=label, counterclock=False, startangle=90, explode=[0.2, 0, 0, 0, 0])
plt.axis('equal')


各要素の色を変更する

要素ごとの色を指定して調整しましょう。色を配列形式で作り、引数のcolorsで指定することで色を変更します。

python
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')


各要素の色を濃淡表示に変更する

python
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指定します。

python
plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors, shadow=True)
plt.axis('equal')


ラベルの位置を変更する

ラベルの位置を変更したい際には、labeldistanceを引数に加えます。labeldistanceを0.0にすると円の中心に配置され、1.0では円周上に配置されます。デフォルトでは1.5なので、外周に配置されます。

python
plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors, labeldistance=0.5)
plt.axis('equal')


枠線の太さと色を変更する

円グラフの枠線の太さと色を変更する方法を見ていきましょう。引数にwedgepropsを入れて、辞書型でlinewidthedgecolorを指定すると修正することができます。枠線なしの場合には、linewidthを0にします。

python
plt.pie(x, labels=label, counterclock=False, startangle=90, wedgeprops={'linewidth': 3, 'edgecolor':"black"})
plt.axis('equal')


ラベルの色変更と太字に変更

ラベルの修飾をしていきます。色と文字を太くしてみましょう。こちらはtextpropsを引数に、colorweightを辞書型でそれぞれ指定すると変更できます。

python
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)を参考に値を指定することができます。

python
plt.pie(x, labels=label, counterclock=False, startangle=90, autopct="%1.1f%%", pctdistance=0.7)
plt.axis('equal')


ドーナツチャートを作成する方法

ドーナツチャートとは、真ん中に穴が空いていてドーナツ形のグラフのことです。matplotlibの円グラフではドーナツチャートを作成することができます。とはいえ、円グラフの真ん中に白い円を挿入するイメージに近いです。

基本的なドーナツチャートを作成する

ここでは、中心から70%の大きさの円を挿入してみましょう。

python
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つ円グラフを挿入し、さらに白い円を挿入すると作成できます。

python
# 円グラフ (外周)
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()で描画できる
  • 色、枠線の太さ、枠線の色などのデザイン変更が可能
  • 円グラフの各要素の位置も変更可能
  • 値の割合も表示可能
  • ドーナツチャートは中心に白い円を挿入