Nota
Fare clic qui per scaricare il codice di esempio completo
Grafici a torta nidificati #
Gli esempi seguenti mostrano due modi per creare un grafico a torta nidificato in Matplotlib. Tali grafici sono spesso indicati come grafici a ciambella.
import matplotlib.pyplot as plt
import numpy as np
Il modo più semplice per costruire un grafico a torta è utilizzare il
pie
metodo.
In questo caso, pie assume valori corrispondenti ai conteggi in un gruppo. Per prima cosa genereremo alcuni dati falsi, corrispondenti a tre gruppi. Nel cerchio interno, tratteremo ogni numero come appartenente al proprio gruppo. Nel cerchio esterno, li tracceremo come membri dei loro 3 gruppi originali.
L'effetto della forma a ciambella si ottiene impostando width
a sulle fette della torta attraverso l' argomento 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()
Tuttavia, è possibile ottenere lo stesso output utilizzando un grafico a barre sugli assi con un sistema di coordinate polari. Questo può dare maggiore flessibilità sul design esatto della trama.
In questo caso, dobbiamo mappare i valori x del grafico a barre sui radianti di un cerchio. La somma cumulativa dei valori viene utilizzata come bordi delle barre.
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()
Riferimenti
L'uso delle seguenti funzioni, metodi, classi e moduli è mostrato in questo esempio: