この記事ではmatplotlibライブラリを使った円グラフの描画方法をわかりやすく解説します。
基本的な円グラフの描画方法から細かいオプション設定の方法を網羅的に紹介していきます。
サンプルコードをコピペしながらサクサク処理を試せますので、 ぜひ活用してみてくださいね。
matplotlib.pyplot.pie の引数
matplotlib.pyplot.pie
の引数は以下の通りです。(引用:matplotlib.pyplot.pie 公式ドキュメント)
引数名 | 意味 | デフォルト |
---|---|---|
x | 各要素の大きさの配列 | |
startangle | 各要素の出力の開始角度[deg] | 0 |
counterclock | 各要素の出力順序 時計回り: True 反時計回り: False | True |
explode | 要素を円の中心から離して強調 | |
labels | 各要素のラベル名 | |
rotatelabels | 各要素に対応するスライスの角度を回転するか 回転する: True 回転しない: False | False |
labeldistance | 表示ラベルの中心からの距離 円の中心 0,0 〜円周上1.0 を目安に指定 | 1.1 |
colors | 各要素の色 | |
autopct | 各要素の対全体比率を表示 | None |
pctdistance | ※ 引数autopct利用時のみ 表示する比率ラベルの円の中心からの距離 円の中心 0,0 〜円周上1.0 を目安に指定 | 0.6 |
shadow | 影の有無 影あり: True 影なし: False | False |
radius | 円の半径 | 1 |
noramalize | 各要素の合計を1として規格化するか 規格化する: True 規格化しない: False | True |
frame | 座標軸表示の有無 表示する: True 表示なし: False | False |
center | 円グラフの中心座標(0,0) などのタプル型で指定 | (0,0) |
基本的な円グラフ
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
plt.pie(x)
plt.show()

引数を特に指定しない場合、基本的な円グラフはこのように描画されます。
各要素の出力の開始角度[deg] (startangle
)
基本的な円グラフでは下図のように水平方向0[deg]が出力の開始角度となっています。
また、後述の引数 counterclockの通り、出力順序は反時計回り方向となっています。

円グラフ描画のデフォルトは、
水平方向0[deg]から反時計回りで順に出力
であることを覚えておきましょう。
それでは、試しに出力の開始角度を変更してみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
plt.pie(x, startangle=90)
plt.show()


上図のように、円グラフの出力開始角が反時計回り方向に90[deg]移動しています。
時計回り、反時計回りに出力(counterclock
)
続いて、出力順序の方向を変更してみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
plt.pie(x, startangle=90, counterclock=False)
plt.show()


上図のように、出力順序が時計回りになっていることがわかります。
要素を円の中心から離して強調(explode
)
要素を強調するため、円の中心から離して描画してみます。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
point = [0, 0.3, 0, 0, 0]
plt.pie(x, explode=point, startangle=90, counterclock=False)
plt.show()

二つ目の要素が円から離れて強調されていることがわかりますね。
引数explode
で各要素を中心から離す距離を指定しています。
同時に複数の要素を強調することも可能です。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
point = [0, 0.3, 0, 0.5, 0]
plt.pie(x, explode=point, startangle=90, counterclock=False)
plt.show()

各要素にラベルを指定(labels
)
円グラフの各要素にラベルを指定してみます。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
label = ["A", "B", "C", "D", "E"]
plt.pie(x, labels=label, startangle=90, counterclock=False)
plt.show()

円グラフのそれぞれの要素ラベルが付与されていることがわかります。
ラベルの角度(rotatelabels
)
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
label = ["A", "B", "C", "D", "E"]
plt.pie(x, rotatelabels=True, labels=label, startangle=90, counterclock=False)
plt.show()

表示されるラベルが円に沿って傾いていることがわかります。
ラベルの表示位置(labeldistance
)
円グラフに表示するラベルの中心からの距離を変更してみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
label = ["A", "B", "C", "D", "E"]
plt.pie(x, labels=label, labeldistance=0.75, startangle=90, counterclock=False)
plt.show()

引数labeldistance
を0.75としたことで、ラベルの表示が中心に寄ったことがわかります。
labeldistance
を0
とすると円の中心に、1
とすると円周上にラベルが表示されます。
これを目安に適切な数値を設定してみてください。
各要素の色(color
)
円グラフの各要素の色を変更してみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
label = ["A", "B", "C", "D", "E"]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, colors=colors_list, labels=label, startangle=90, counterclock=False)
plt.show()

各要素の色が変わっていることがわかりますね。
matplotlibライブラリで指定できるカラーはこちらが参考になります。

全体に占める割合を表示(autopct
)
円グラフの各要素の全体に占める割合(パーセンテージ)を表示させてみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
label = ["A", "B", "C", "D", "E"]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, autopct="%.1f%%", colors=colors_list, labels=label, startangle=90, counterclock=False)
plt.show()

各要素の全体に占める割合が「%」表記で出力されていますね。
引数autopct
に指定する値の表記方法は「%フォーマット」という書式で指定するのが一般的です。
「%フォーマット」について詳しく知りたい方はこちらが参考になると思います。

割合の表示位置(pctdistance
)
円グラフに表示されるパーセンテージの、中心からの距離を変更してみます。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
label = ["A", "B", "C", "D", "E"]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, pctdistance=1.3, autopct="%.1f%%", colors=colors_list, labels=label, startangle=90, counterclock=False)
plt.show()

パーセンテージ表示が円の中心から離れていることがわかります。
影を描画(shadow
)
円グラフに影を描画してみます。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, shadow=True, colors=colors_list, startangle=90, counterclock=False)
plt.show()

円グラフの左下に影が描画されていることがわかります。
円の半径(radius
)
円グラフの半径を変更してみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, radius=0.5, colors=colors_list, startangle=90, counterclock=False)
plt.show()

円グラフの半径を0.5
と、デフォルトの半分にした結果です。
円グラフの規格化(normalize
)
円グラフはすべての要素の合計を1となるよう規格化して描画されています。
円グラフの規格化を行わずに描画することもできます。
import matplotlib.pyplot as plt
x = [0.05, 0.1, 0.25, 0.3]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, normalize=False, colors=colors_list, startangle=90, counterclock=False)
plt.show()

円グラフの規格化を行わない場合、上図のように部分的な円グラフを描画することもできます。
しかし、規格化を行わずに円グラフを描画する際には注意点があります。
すべての要素の合計値が1未満でなければなりません
サンプルコードからもわかるように、x = [0.05, 0.1, 0.25, 0.3]
となっており合計値は0.7
です。
すべての要素の合計値が1以上である場合は、エラーが出てしまいますので注意して下さい。
座標軸を表示(frame
)
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, frame=True, colors=colors_list, startangle=90, counterclock=False)
plt.show()

円グラフを描画する座標軸が表示されることがわかります。
中心座標の移動(center
)
円グラフの中心座標を移動させてみましょう。
import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50]
colors_list = ["#97BFB4", "#F5EEDC", "#DD4A48", "#4F091D", "#2E4C6D"]
plt.pie(x, center=(5,5), frame=True, colors=colors_list, startangle=90, counterclock=False)
plt.show()

円グラフの中心座標が(5,5)
に移動していることがわかります。
まとめ
今回はmatplotlibライブラリを使った円グラフの描画方法をサンプルコードとともに紹介してきました。
ぜひ円グラフの描画の参考にしてみてください。


