データの割合を表示する際に,円グラフがよく使われています
本記事ではMatplotlibで凡例付きの円グラフを描画する方法について解説します
円グラフの凡例やラベル,パーセント表示,要素の座標変更,色,カラーマップ,太さ,テキストなどのカスタマイズ方法も詳細に解説しています
ドーナツグラフに関しては下記記事を参考にしてください
円グラフのオプション一覧
Matplotlibでは,円グラフはAxes.pie関数を使って描画します
Axes.pie関数に引数を入力することで,凡例やラベル,パーセント表示などのカスタマイズができます
- 引数
-
- x (配列):1次元配列で指定する円グラフの各要素
- explode (配列):グラフの中心からの各要素の距離の割合
- labels (リスト):各要素のラベル
- colors (配列):グラフの色
- autopct (文字列, 関数):ラベルを数値割合で表示
- pctdistance (float):グラフの中心とautopct が生成するテキスト位置との比率
- shadow (bool):グラフの影
- labeldistance (float):ラベルの距離
- counterclock (bool):要素の方向.時計回りか反時計回りか
- startangle (float):グラフの始点のx軸から反時計回りの回転角度
- radius (float):グラフの半径
- wedgeprops (dict):各要素(wedge)を辞書形式でカスタマイズ
- textprops (dict):テキスト要素を辞書形式でカスタマイズ
- center ((float, float)):グラフの中心の座標
- frame (bool):グラフの軸
- rotatelabels (bool):各ラベルの回転
- normalize (bool):グラフの数値の正規化
- 返値
-
- patches (リスト):matplotlib.patches.Wedgeの配列
- texts (リスト):ラベルTextのリスト
- autotexts (リスト):数値ラベル用のTextリスト.autopct が Noneでない場合にのみ
- 公式ドキュメント
基本的な円グラフ
Axes.pie関数を使って,凡例付きの基本的な円グラフを描画します
下記のタブにコードとフローチャートの解説をしています
import matplotlib.pyplot as plt
import numpy as np
# step1 ラベルとデータの作成
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 円グラフの描画
ax.pie(sizes, labels=labels, autopct='%.1f%%', startangle=90)
ax.set_title('Basic pie chart')
ax.legend(loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.show()
円グラフの要素の回転方向,位置 (counterclock, explode, startangle)
円グラフの要素の回転方向,直径方向の位置,円周方向の位置をカスタマイズします
回転方向を時計回りにする (counterclock)
Axes.pie関数の引数counterclockをFalseとすることで,円グラフの回転方向を時計回りにできます
# step3 円グラフの描画
# counterclock=False
ax.pie(sizes, labels=labels, autopct='%.1f%%', startangle=90, counterclock=False)
直径方向の位置を変えて目立たせる (explode)
Axes.pie関数の引数explodeに数値の配列を指定することで,要素の直径方向の位置を変えて,目立たせることができます
# step3 円グラフの描画
explode = (0, 0.1, 0, 0)
ax.pie(sizes, labels=labels, autopct='%.1f%%', startangle=90, counterclock=False, explode=explode)
円の開始位置を変える (startangle)
Axes.pie関数の引数startangleに角度を指定することで,要素の円周方向の位置を自由に変えることができます
基本開始位置は(x, y)=(1, 0)の位置です
# step3 円グラフの描画
# startangle=0
ax.pie(sizes, labels=labels, autopct='%.1f%%', startangle=0, counterclock=False)
割合を表す数値ラベルの調整 (autopct, pctdistance, normalize)
Axes.pieの引数にautopctを指定することで数値ラベルが表示できます
また,pctdistanceで数値ラベルの位置を変更できます
フォーマット文字列で数値ラベルを表示する (autopct)
autopctとフォーマット文字列を使うことで,データの数値を表示できます
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='%.1f')
好きな位置に文字列を表示する (pctdistance)
autopctに文字列を使うことで,文字列を表示できます
また,ラベルの位置をpctdistanceを数値で指定できます
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='autopct', pctdistance=0.9)
表示するラベルに関数を使う
autopctに関数を指定することも可能です
10を足し算する関数を作ってみました
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct=add_ten)
# 10が足し算される関数
def add_ten(x):
return round(x + 10, 1)
数値ラベルを100%になるように正規化する (normalize)
normalizeで正規化すると,合計が100%となるように計算されます
sizes = [100, 30, 45, 10]として表示させてみます
# データの変更
sizes = [100, 30, 45, 10]
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='%.1f%%', normalize=True)
グループごとの文字列ラベル (labeldistance, rotatelabels)
円グラフのグループごとのラベルのカスタマイズでは,labeldistance, rotatelabelsがあり,それぞれラベルの位置,回転有無を指定できます
ラベルの位置 (labeldistance)
labeldistance=数値とすると,ラベルの円グラフ中心からの距離を指定できます
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='%.1f', labeldistance=1.3)
ラベルの回転 (rotatelabels)
rotatelabels=Trueとすると,ラベルを円グラフに沿って回転できます
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='%.1f', rotatelabels=True)
円グラフの色やテキスト,線のカスタマイズ (colors, wedgeprops, textprops)
円グラフで細かいカスタマイズを行う場合,円の色はcolors, 要素はwedgeprops,テキストはtextpropsを使います
要素ごとに色を設定する (colors)
円グラフの色はAxes.pieの引数にcolorを指定することで色のカスタマイズができます
データ配列の要素数と同じ要素数を持つ配列を指定します
import matplotlib.pyplot as plt
import numpy as np
# step1 ラベルとデータの作成
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 円グラフの描画
# colors = [赤, 青, 緑, 黄色]
ax.pie(sizes, labels=labels, autopct='%.1f', startangle=90, colors=['r', 'b', 'g', 'y'], counterclock=False)
ax.legend(loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.show()
カラーマップで要素の色を指定する (Colormap)
カラーマップはデータ数値に合わせて色を変化させることができます
この関数はデータの最小値から最大値にかけてのRGBAの配列を生成します
- 引数
-
- name (文字列) : カラーマップの名前
- N (int) : RGBの量子化レベルの数
- 返値
-
- データがスカラー:RGBAの配列 (tuple)
- データが配列:RGBAの配列 (データ配列+4行)
- 公式ドキュメント
カラーマップでRGBAの色配列を取得する手順を下記に示します
- plt.colormapsでカラーマップを指定
- データと同じ要素数の配列を0~1の数値で作成(np.linspace使う)
- colors = 1の変数(2の配列)
# GnBuというカラーマップを0.25~0.7の範囲で使用
# 0~1の範囲内で使用できます
cmap = plt.colormaps['GnBu']
colors = cmap((np.linspace(0.25, 0.7, len(sizes))))
# step3 円グラフの描画
ax.pie(sizes, labels=labels, autopct='%.1f', startangle=90, colors=colors, counterclock=False)
ax.legend(loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.show()
枠の太さと色を変更する (wedgeprops)
円グラフの枠はAxes.pieの引数にwedgepropsを指定することでカスタマイズができます
枠の色を赤色,枠の太さを3としました
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='%.1f', colors=colors, counterclock=False,
wedgeprops = {'edgecolor': 'red', 'linewidth': 3}
)
ax.legend(loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.show()
テキストの大きさと色を変更する (textprops)
円グラフのテキストはAxes.pieの引数にtextpropsを指定することでカスタマイズができます
テキストの色を白色,フォントサイズを20としました
また,カラーマップをGreysに変更して白黒風にしました
# Greysというカラーマップを0.4~0.9の範囲で使用
cmap = plt.colormaps['Greys']
colors = cmap((np.linspace(0.4, 0.9, len(sizes))))
# step3 円グラフの描画
ax.pie(sizes, labels=labels, startangle=90, autopct='%.1f', colors=colors, counterclock=False,
textprops={'color': 'white', 'fontsize':20}
)
ax.legend(loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.show()
論文用の美しい円グラフ
これまでの様々な引数を活かして,論文用の美しい円グラフを作成します
これをコピペして持ち帰っていただければと思います
下記のタブにコードとフローチャートの解説をしています
import matplotlib.pyplot as plt
import numpy as np
# step1 ラベルとデータの作成
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 カラーマップの指定
cmap = plt.colormaps['viridis']
colors = cmap((np.linspace(0.2, 0.8, len(sizes))))
# step4 円グラフの描画
ax.pie(sizes, labels=labels, autopct='%.0f%%', startangle=90, counterclock=False, normalize=True,
colors=colors,
wedgeprops = {'edgecolor': 'white', 'linewidth': 1.2},
textprops={'fontsize': 17, 'fontweight': 'bold', 'family': 'Times new roman'}
)
ax.set_title('circle plot for a thesis')
ax.legend(loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.show()
参考文献
Axes.pie関数
基本的な円グラフ
円グラフのラベル
お疲れ様でした
コメント