Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python Matplotlibで円グラフの一部を強調表示して描画する方法

はじめに

あなたが最も好きなグラフの種類は何ですか?経営層やビジネスアナリストにこの質問をすると、即座に「円グラフ(パイチャート)!」と答えられるほど、円グラフは割合を視覚的に表現するための最も一般的な手法のひとつです。

この記事では、PythonのMatplotlibを使って基本的な円グラフを描く方法から、explodeパラメータで特定のセクターを強調表示するテクニック、さらにパーセンテージではなく実際の値をラベルとして表示するカスタム関数の実装まで、段階的に解説します。

基本的な円グラフの作成手順

ステップ1:Matplotlibのインストール

まず、以下のコマンドでMatplotlibをインストールします。

pip install matplotlib

ステップ2:Matplotlibのインポート

import matplotlib.pyplot as plt

ステップ3:サンプルデータの準備

ここでは、テニス選手のグランドスラム優勝回数を題材にしたタプル形式のデータを用意します。

tennis_stats = (('Federer', 20), ('Nadal', 20), ('Djokovic', 17), ('Murray', 3))

ステップ4:プロット用データへの変換

次に、タプルから優勝回数と選手名をそれぞれリストとして取り出します。

titles = [title for player, title in tennis_stats]
players = [player for player, title in tennis_stats]

ステップ5:円グラフの作成

値(優勝回数)をデータとして、選手名をラベルとして円グラフを作成します。ここで使う主なパラメータは以下の通りです。

  • autopct:数値を小数点以下1桁のパーセンテージとして表示するためのフォーマット指定です。
  • axis('equal'):円グラフが正真円に見えるよう、縦横比を揃えます。
  • .show():描画結果を画面に表示します。
plt.pie(titles, labels=players, autopct='%1.1f%%')
plt.gca().axis('equal')

実行すると、次のような戻り値が得られます。

(-1.1000000175619362,
 1.1000000072592333,
 -1.1090350248729983,
 1.100430247887797)

Python Matplotlibで円グラフの一部を強調表示して描画する方法

注意: .show()を実行するとプログラムの処理がそこでブロックされます。表示されたウィンドウを閉じると、プログラムは再開されます。

ステップ6:グラフの表示

plt.show()

見た目を調整する便利なパラメータ

円グラフの見た目をカスタマイズできる興味深いパラメータがいくつかあります。

  • startangle:セクター(扇形)の描画開始位置を回転させます。
  • counterclock:セクターを並べる方向を指定します。デフォルトはTrue(反時計回り)です。
plt.pie(titles, labels=players, startangle=60, counterclock=False, autopct='%1.1f%%')
plt.show()

Python Matplotlibで円グラフの一部を強調表示して描画する方法

パーセンテージではなく実際の値を表示する

人によっては、パーセンテージだけではピンとこないこともあるでしょう。完成したグラフは、コードの中身を知らない相手に送ることになります。円の分割比率からおおよその割合は読み取れますが、実際の数値(ここでは優勝回数)を直接表示できたほうが親切です。

これを実現するには少し工夫が必要で、カスタム関数を書く必要があります。以下のコードを見てみましょう。

ここでは、format_valuesというカスタム関数を作成します。あらかじめ「パーセンテージをキー、実際の値をバリュー」とする辞書を作っておき、autopctから渡されるパーセント値をキーとして対応する値を取り出して表示します。

from matplotlib.ticker import FuncFormatter

total = sum(title for player, title in tennis_stats)
print(total)

values = {int(100 * title / total): title for player, title in tennis_stats}
print(values)

def format_values(percent, **kwargs):
    value = values[int(percent)]
    return '{}'.format(value)

# explodeでセクターを分離・強調表示する
explode = (0, 0, 0.1, 0.0)
plt.pie(titles, labels=players, explode=explode, autopct=format_values)

plt.show()

# 指定する値が大きいほど、そのセクターは遠くまで分離される
explode = (0.3, 0.2, 0.0, 0.0)
plt.pie(titles, labels=players, explode=explode, autopct=format_values)

実行結果は以下の通りです。

60
{33: 20, 28: 17, 5: 3}

Python Matplotlibで円グラフの一部を強調表示して描画する方法

2つ目のexplode設定での出力オブジェクトは次のようになります。

([<matplotlib.patches.Wedge at 0x2279cf8dd00>,
  <matplotlib.patches.Wedge at 0x2279cf9b1f0>,
  <matplotlib.patches.Wedge at 0x2279cf9b8b0>,
  <matplotlib.patches.Wedge at 0x2279cf9bf70>],
 [Text(0.6999999621611965, 1.2124355871444568, 'Federer'),
  Text(-1.2999999999999945, -1.2171478395895002e-07, 'Nadal'),
  Text(0.39420486628845763, -1.0269384223966398, 'Djokovic'),
  Text(1.086457194390738, -0.17207778693546258, 'Murray')],
 [Text(0.44999997567505484, 0.7794228774500078, '20'),
  Text(-0.7999999999999966, -7.490140551320001e-08, '20'),
  Text(0.2150208361573405, -0.5601482303981671, '17'),
  Text(0.5926130151222206, -0.09386061105570685, '3')])

Python Matplotlibで円グラフの一部を強調表示して描画する方法

補足: 辞書のキーは整数化したパーセンテージのため、複数のデータが同じパーセントに丸められるとキーが衝突します。この例ではFedererとNadalがどちらも33%となり片方のエントリーが上書きされますが、両者の実際の値が同じ20であるため、表示上は問題なく動作します。

コード全体のまとめ

最後に、これまでの内容をすべてまとめた完全なコードを紹介します。

# インポート
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

# データの準備
tennis_stats = (('Federer', 20), ('Nadal', 20), ('Djokovic', 17), ('Murray', 3))

titles = [title for player, title in tennis_stats]
players = [player for player, title in tennis_stats]

total = sum(title for player, title in tennis_stats)
values = {int(100 * title / total): title for player, title in tennis_stats}

# カスタム関数:パーセンテージから実際の値へ変換
def format_values(percent, **kwargs):
    value = values[int(percent)]
    return '{}'.format(value)

# explodeでセクターを分離・強調表示する
explode = (0, 0, 0.1, 0.0)
plt.pie(titles, labels=players, explode=explode, autopct=format_values)

plt.show()

Python Matplotlibで円グラフの一部を強調表示して描画する方法

このように、explodeautopctにカスタム関数を組み合わせることで、注目したいセクターを視覚的に強調しながら、具体的な数値を伝えるわかりやすい円グラフを作成できます。ぜひ自分のデータに応用してみてください。

  1. PythonのMatplotlibで円グラフを作成・表示する方法【初心者向け解説】

    Matplotlibは、データ可視化のために広く利用されている人気のPythonライブラリです。データの可視化は分析において非常に重要なステップであり、複雑な数値計算の結果を目で見て理解しやすくしてくれます。数値を一つひとつ確認しなくても、データ全体の傾向や構成を直感的に把握できるため、定量的な洞察を効果的に伝える手段として活用されています。Matplotlibは主に2次元のグラフやプロットを作成するために使用され、オブジェクト指向のAPIを備えているため、Pythonアプリケーションへの組み込みも容易です。IPythonシェル、Jupyter Notebook、Spyderなどの開発環境と組

  2. Pythonのmatplotlibで1つのグラフに3つの異なるデータセットをプロットする方法

    Matplotlibは、Pythonで最も広く利用されているデータ可視化ライブラリのひとつです。データを可視化することは、数値を一つひとつ確認したり複雑な計算を行ったりしなくても、データ全体の傾向や特徴を直感的に把握できるようにする重要なステップです。また、定量的な洞察を読者や聴衆に効果的に伝えるための手段としても非常に有効です。 Matplotlibは、データをもとに2次元のグラフやプロットを作成するために使用されます。オブジェクト指向のAPIを備えており、作成したグラフをPythonアプリケーションに簡単に組み込むことができます。IPythonシェル、Jupyter Notebook、Sp