【Matplotlib】円グラフを徹底解説!凡例,割合%,ラベル (pie)

データの割合を表示する際に,円グラフがよく使われています

本記事ではMatplotlibで凡例付きの円グラフを描画する方法について解説します

円グラフの凡例やラベル,パーセント表示,要素の座標変更,色,カラーマップ,太さ,テキストなどのカスタマイズ方法も詳細に解説しています

ドーナツグラフに関しては下記記事を参考にしてください

目次

円グラフのオプション一覧

Matplotlibでは,円グラフはAxes.pie関数を使って描画します

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の配列を生成します

colors.Colormap
引数
  • 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関数

基本的な円グラフ

円グラフのラベル

お疲れ様でした

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次