【Python】Matplotlibで円グラフを作成し開始位置や並び順を調整する

目次

概要

Matplotlibを使って円グラフ(パイチャート)を描画するレシピです。

デフォルトの円グラフは見づらいことが多いですが、データの並び順を時計回りにしたり、開始位置を12時の方向に合わせたり、配色を指定したりすることで、プレゼンテーションに適した整ったグラフを作成する方法を解説します。

仕様(入出力)

  • 入力: 各項目の数値データ、ラベル、色指定などのスタイル設定
  • 出力: 調整された円グラフの描画
  • 要件: matplotlib ライブラリがインストールされていること

基本の使い方

import matplotlib.pyplot as plt

# データ定義
labels = ['Product A', 'Product B', 'Product C']
values = [50, 30, 20]

fig, ax = plt.subplots()

# 最小限の円グラフ
ax.pie(values, labels=labels)

# アスペクト比を保持して真円にする(重要)
ax.axis('equal') 

plt.show()

コード全文

入力コードの意図を汲み、時計回り(counterclock=False)かつ12時開始(startangle=90)に設定し、視認性の良い色を指定した完全なコードです。

import matplotlib.pyplot as plt

def main():
    # 1. データの準備(例:ブラウザの市場シェア)
    browsers = ["Chrome", "Edge", "Firefox", "Safari", "Others"]
    shares = [45, 25, 15, 10, 5]
    
    # 配色の定義(Hexコードや色名)
    # リストの順序通りに各パイに割り当てられます
    colors = ['#4285F4', '#0078D7', '#FF7139', '#000000', '#999999']

    # 2. 描画領域の作成
    fig, ax = plt.subplots(figsize=(6, 6))

    # 3. 円グラフの描画設定
    ax.pie(
        x=shares,               # 数値データ
        labels=browsers,        # ラベル
        colors=colors,          # 色のリスト
        counterclock=False,     # 時計回り(False)にする
        startangle=90,          # 開始位置を90度(12時の方向)にする
        autopct='%1.1f%%',      # 割合を%表示(小数点1桁まで)
        wedgeprops={'edgecolor': 'white'} # 境界線を白くして区切りを明確に
    )

    # 4. スタイル調整
    ax.set_title("Browser Market Share")
    
    # グラフを楕円ではなく真円として表示する設定
    ax.axis("equal")

    # 5. 表示
    plt.show()

if __name__ == "__main__":
    main()

カスタムポイント

ax.pie() メソッドで使用できる主要なパラメータの説明です。これらを調整することで、グラフの回転や色を自由に制御できます。

パラメータ名説明設定例
xグラフにする数値データのリスト(配列)。合計が100でなくても自動で正規化されます。[40, 30, 20, 10]
labels各データの名称(ラベル)のリスト。['A', 'B', 'C']
colors各領域の色を指定するリスト。Noneの場合、デフォルト色がループします。['red', 'blue']
counterclockデータを配置する方向。Trueで反時計回り、Falseで時計回り。False (一般的)
startangleデータの開始角度(度数法)。0度は3時の方向(右)。90度は12時の方向(上)。90
  • counterclock=False と startangle=90 の組み合わせ:ビジネス資料などでよく見られる「12時から始まって時計回りに大きい順」のレイアウトを作るための定番設定です。
  • autopct:’%1.1f%%’ のように指定すると、計算済みのパーセンテージをグラフ内に文字として埋め込むことができます。

注意点

  1. 楕円になってしまう問題plt.subplots() のサイズ指定やウィンドウサイズによっては、デフォルトだと円が潰れて楕円に見えることがあります。必ず ax.axis(“equal”) を呼び出して、アスペクト比を均等にしてください。
  2. ラベルの重なりデータに非常に小さな値が含まれている場合、ラベルやパーセンテージの文字が重なって読めなくなることがあります。その場合は、小さいデータを「その他」にまとめるか、凡例(ax.legend())の使用を検討します。
  3. 色の数データの要素数より colors リストの要素数が少ない場合、色がループ(繰り返し)します。要素数と同じ数の色を用意するのが確実です。

バリエーション(任意)

ドーナツグラフ

wedgeprops 引数を使って中心に穴を開けることで、モダンなドーナツグラフを作成できます。

import matplotlib.pyplot as plt

def create_donut_chart():
    labels = ["A", "B", "C", "D"]
    sizes = [30, 25, 25, 20]
    
    fig, ax = plt.subplots()

    # wedgeprops で幅を指定し、中央を空洞にする
    ax.pie(
        sizes, 
        labels=labels, 
        startangle=90, 
        counterclock=False,
        wedgeprops={'width': 0.4, 'edgecolor': 'white'} # 幅0.4のリング状にする
    )

    # 中央にテキストを追加することも可能
    ax.text(0, 0, 'Total\n100', ha='center', va='center', fontsize=12)

    ax.axis('equal')
    plt.show()

if __name__ == "__main__":
    create_donut_chart()

まとめ

Matplotlibの円グラフは、デフォルト設定のままでは「右から始まって反時計回り」という数学的な配置になり、直感的ではありません。

startangle=90 と counterclock=False をセットで使用し、さらに ax.axis(“equal”) で真円を保つことが、美しい円グラフを作るための基本テクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次