巢狀圓餅圖#

以下範例展示了在 Matplotlib 中建立巢狀圓餅圖的兩種方法。這類圖表通常稱為甜甜圈圖。

另請參閱左心室牛眼圖範例。

import matplotlib.pyplot as plt
import numpy as np

建立圓餅圖最直接的方法是使用pie方法。

在此範例中,pie 採用對應於群組中計數的值。我們首先產生一些偽造資料,對應於三個群組。在內圈中,我們將每個數字視為屬於其自身的群組。在外圈中,我們將它們繪製為其原始 3 個群組的成員。

甜甜圈形狀的效果是透過 wedgeprops 引數將 width 設定為圓餅圖的楔形來實現。

fig, ax = plt.subplots()

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

tab20c = plt.color_sequences["tab20c"]
outer_colors = [tab20c[i] for i in [0, 4, 8]]
inner_colors = [tab20c[i] for i in [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()
Pie plot with `ax.pie`

但是,您可以透過在具有極座標系統的軸上使用長條圖來完成相同的輸出。這可能會在圖表的確切設計上提供更大的彈性。

在此範例中,我們需要將長條圖的 x 值對應到圓的弧度。值的累計總和會用作長條的邊緣。

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

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
# Normalize vals to 2 pi
valsnorm = vals/np.sum(vals)*2*np.pi
# Obtain the ordinates of the bar edges
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()
Pie plot with `ax.bar` and polar coordinates

標籤:plot-type: pie level: beginner purpose: showcase

由 Sphinx-Gallery 產生的圖庫