目次
概要
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%%’ のように指定すると、計算済みのパーセンテージをグラフ内に文字として埋め込むことができます。
注意点
- 楕円になってしまう問題plt.subplots() のサイズ指定やウィンドウサイズによっては、デフォルトだと円が潰れて楕円に見えることがあります。必ず ax.axis(“equal”) を呼び出して、アスペクト比を均等にしてください。
- ラベルの重なりデータに非常に小さな値が含まれている場合、ラベルやパーセンテージの文字が重なって読めなくなることがあります。その場合は、小さいデータを「その他」にまとめるか、凡例(ax.legend())の使用を検討します。
- 色の数データの要素数より 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”) で真円を保つことが、美しい円グラフを作るための基本テクニックです。
