Gráficos de pizza aninhados #

Os exemplos a seguir mostram duas maneiras de criar um gráfico de pizza aninhado no Matplotlib. Esses gráficos geralmente são chamados de gráficos de rosquinha.

import matplotlib.pyplot as plt
import numpy as np

A maneira mais direta de criar um gráfico de pizza é usar o piemétodo.

Nesse caso, pizza assume valores correspondentes a contagens em um grupo. Primeiro vamos gerar alguns dados falsos, correspondentes a três grupos. No círculo interno, trataremos cada número como pertencente ao seu próprio grupo. No círculo externo, vamos plotá-los como membros de seus 3 grupos originais.

O efeito da forma de rosquinha é obtido definindo a widthpara as fatias da torta por meio do argumento wedgeprops .

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()
Gráfico de pizza com `ax.pie`

No entanto, você pode obter a mesma saída usando um gráfico de barras em eixos com um sistema de coordenadas polares. Isso pode dar mais flexibilidade no design exato do enredo.

Nesse caso, precisamos mapear os valores x do gráfico de barras em radianos de um círculo. A soma cumulativa dos valores é usada como borda das barras.

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()
Gráfico de pizza com `ax.bar` e coordenadas polares

Galeria gerada por Sphinx-Gallery