Matplotlib を使ったネストされた円グラフ

Beginner

This tutorial is from open-source community. Access the source code

はじめに

円グラフは、円形でデータを表すために使用される人気のあるデータ可視化ツールです。ただし、円グラフのネストされたバージョンであるドーナツチャートを作成したい場合もあります。このチュートリアルでは、Python の人気のあるデータ可視化ライブラリである Matplotlib を使用してネストされた円グラフを作成する方法を説明します。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使用して練習します。

場合によっては、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートする

まず、必要なライブラリをインポートする必要があります。この場合、Matplotlibnumpy が必要です。

import matplotlib.pyplot as plt
import numpy as np

ax.pie を使ってネストされた円グラフを作成する

ax.pie メソッドを使ってネストされた円グラフを作成することができます。まず、3 つのグループに対応するいくつかの疑似データを生成します。内側の円では、それぞれの数字を独自のグループに属するものとして扱います。外側の円では、それらを元の 3 つのグループのメンバーとしてプロットします。

fig, ax = plt.subplots()

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()

ax.bar を使ってネストされた円グラフを作成する

極座標系の軸に対して ax.bar メソッドを使っても、ネストされた円グラフを作成することができます。これにより、グラフの正確なデザインに関してより多くの柔軟性が得られる場合があります。

fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
## vals を 2π に正規化する
valsnorm = vals/np.sum(vals)*2*np.pi
## 棒の端の縦座標を取得する
valsleft = np.cumsum(np.append(0, valsnorm.flatten()[:-1])).reshape(vals.shape)

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

ax.bar(x=valsleft[:, 0],
       width=valsnorm.sum(axis=1), bottom=1-size, height=size,
       color=outer_colors, edgecolor='w', linewidth=1, align="edge")

ax.bar(x=valsleft.flatten(),
       width=valsnorm.flatten(), bottom=1-2*size, height=size,
       color=inner_colors, edgecolor='w', linewidth=1, align="edge")

ax.set(title="Pie plot with `ax.bar` and polar coordinates")
ax.set_axis_off()
plt.show()

ネストされた円グラフをカスタマイズする

色を変更したり、凡例を追加したり、サイズを調整することで、ネストされた円グラフをカスタマイズすることができます。

fig, ax = plt.subplots()

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

## 凡例を追加する
labels = ['Group 1', 'Group 2', 'Group 3']
ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'), labels=labels, labeldistance=0.7)

ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

## タイトルを設定する
ax.set(aspect="equal", title='Nested Pie Chart')

plt.show()

ネストされた円グラフを保存する

ネストされた円グラフを png、pdf、または svg 形式の画像として保存することができます。

fig.savefig('nested_pie_chart.png', dpi=300, bbox_inches='tight')

まとめ

このチュートリアルでは、Matplotlib を使って 2 つの方法(ax.pieax.bar)でネストされた円グラフを作成する方法を学びました。また、凡例を追加したり、色を変更したり、サイズを調整することでネストされた円グラフをカスタマイズする方法も学びました。最後に、ネストされた円グラフを png、pdf、または svg 形式の画像として保存する方法を見てきました。