本ページでは、Python のグラフ作成パッケージ、Matplotlib を用いて円グラフ (pie chart) を描く方法について紹介します。
matplotlib.pyplot.pie の概要
matplotlib には円グラフを描画するメソッドとして、matplotlib.pyplot.pie
が用意されています。
matplotlib.pyplot.pie の使い方
1 2 3 4 5 |
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None) |
matplotlib.pyplot.pie の主要な引数
x (必須) | 各要素の大きさを配列で指定。 |
---|---|
explode | 各要素を中心から離して目立つように表示。 |
labels | 各要素のラベル。 |
colors | 各要素の色を指定。 |
autopct | 構成割合をパーセンテージで表示。 (デフォルト値: None) |
pctdistance | 上記のパーセンテージを出力する位置。円の中心 (0.0) から円周 (1.0) を目安に指定。autopct を指定した場合のみ有効。 (デフォルト値: 0.6) |
shadow | True に設定すると影を表示。 (デフォルト値: False) |
labeldistance | ラベルを表示する位置。円の中心 (0.0) から円周 (1.0) を目安に指定。 (デフォルト値: 1.1) |
startangle | 各要素の出力を開始する角度。 (デフォルト値: None) |
radius | 円の半径。 (デフォルト値: 1) |
counterclock | True に設定すると時計回りで出力。False に設定すると反時計回りで出力。 (デフォルト値: True) |
wedgeprops | ウェッジ (くさび形の部分) に関する指定。枠線の太さなどを設定可能。 (デフォルト値: None) |
textprops | テキストに関するプロパティ。 (デフォルト値: None) |
グラフの出力例
1 2 3 4 5 6 |
import numpy as np import matplotlib.pyplot as plt # 円グラフを描画 x = np.array([100, 200, 300, 400, 500]) plt.pie(x) |
スタイルに関するカスタマイズ
ラベルを表示
1 2 |
label = ["Apple", "Banana", "Orange", "Grape", "Strawberry"] plt.pie(x, labels=label) |
開始角度を 90 度, 時計回りに設定
1 |
plt.pie(x, labels=label, counterclock=False, startangle=90) |
環境によっては必要なカスタマイズ
真円になるようにアスペクト比を固定
plt.axis('equal')
を指定することで、Jupyter 等の環境で楕円のようなつぶれた形で出力されることを防ぐことができます。
1 2 |
plt.pie(x, labels=label, counterclock=False, startangle=90) plt.axis('equal') |
背景を白に設定
PyCharm など一部の環境では、背景がグレーで出力されるため、以下の方法で背景色を設定します。
1 2 3 |
fig = plt.figure() fig.patch.set_facecolor('white') plt.pie(x, labels=label, counterclock=False, startangle=90) |
各要素のスタイルのカスタマイズ
1 つめの要素を 20% ずらして目立たせて表示
1 2 |
plt.pie(x, labels=label, counterclock=False, startangle=90, explode=[0.2, 0, 0, 0, 0]) |
各要素の色を指定
1 2 |
colors = ["lightpink", "yellow", "gold", "slateblue", "lightcoral"] plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors) |
各要素の色を濃淡で指定
1 2 3 4 |
fig = plt.figure() fig.patch.set_facecolor('white') # 背景を白に設定 colors2 = ["0.1", "0.3", "0.5", "0.7", "0.9"] plt.pie(x, labels=label, counterclock=False, startangle=90, colors=colors2) |
影を設定
1 |
plt.pie(x, labels=label, counterclock=False, startangle=90, shadow=True) |
ラベルを中心から円周の間の 50% の位置に表示
1 |
plt.pie(x, labels=label, counterclock=False, startangle=90, labeldistance=0.5) |
各要素のスタイルに関する設定
枠線の太さを 3, 線の色を白に指定
1 2 |
plt.pie(x, labels=label, counterclock=False, startangle=90, wedgeprops={'linewidth': 3, 'edgecolor':"white"}) |
枠線の太さを 0 (枠線なし) に指定
1 2 |
plt.pie(x, labels=label, counterclock=False, startangle=90, wedgeprops={'linewidth': 0}) |
ラベル・テキストに関する設定
テキストの色を白色、太字に設定
1 2 |
plt.pie(x, labels=label, counterclock=False, startangle=90, labeldistance=0.5, textprops={'color': "white", 'weight': "bold"}) |
構成割合をプロット。小数点以下 1 桁まで出力
1 |
plt.pie(x, labels=label, counterclock=False, startangle=90, autopct="%1.1f%%") |
構成割合をプロット。小数点以下 1 桁まで、中心から円周の間の 70% の位置に出力
1 2 |
plt.pie(x, labels=label, counterclock=False, startangle=90, autopct="%.1f%%", pctdistance=0.7) |
より高度なパラメータの設定
ラベルの横位置を各要素の中央に合わせる
1 2 3 4 5 |
patches, texts = plt.pie(x, labels=label, counterclock=False, startangle=90, labeldistance=0.5, textprops={'color': "white", 'weight': "bold"}) for t in texts: t.set_horizontalalignment('center') |
ラベルの横位置を各要素の中央に合わせ、サイズを 18 に指定
1 2 3 4 5 6 |
patches, texts = plt.pie(x, labels=label, counterclock=False, startangle=90, labeldistance=0.6, textprops={'color': "white", 'weight': "bold"}) for t in texts: t.set_horizontalalignment('center') t.set_size(18) |
ドーナツチャート (ドーナツグラフ)
内側に白色で円を描画することで、ドーナツグラフを作成できます。(参考)
1 2 3 4 5 6 |
plt.pie(x, labels=label, counterclock=False, startangle=90) # 中心 (0,0) に 60% の大きさで円を描画 centre_circle = plt.Circle((0,0),0.6,color='black', fc='white',linewidth=1.25) fig = plt.gcf() fig.gca().add_artist(centre_circle) |
2 重ドーナツチャート (2 重ドーナツグラフ)
円グラフの中に円グラフを出力することで、2 重ドーナツチャートを出力できます。
radius
パラメータで、内側の円グラフの大きさを調整しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 円グラフ (外側) x1 = np.array([100, 200, 300, 400, 500]) plt.pie(x1, labels=label, counterclock=False, startangle=90) # 円グラフ (内側, 半径 70% で描画) x2 = np.array([150, 250, 300, 350, 450]) plt.pie(x2, counterclock=False, startangle=90, radius=0.7) # 中心 (0,0) に 40% の大きさで円を描画 centre_circle = plt.Circle((0,0),0.4,color='black', fc='white',linewidth=1.25) fig = plt.gcf() fig.gca().add_artist(centre_circle) |
参考: pyplot — Matplotlib 1.5.1 documentation