pie
Matplotlib no tiene una función específica para gráficos donut: se crea con la función pie habitual y se reduce el ancho de las porciones con el argumento wedgeprops, lo que convierte el círculo en un anillo.
import matplotlib.pyplot as plt
# Datos
labels = ["G1", "G2", "G3", "G4", "G5"]
value = [12, 22, 16, 38, 12]
# Gráfico donut
fig, ax = plt.subplots()
ax.pie(value, labels = labels, wedgeprops = {"width": 0.4})
# plt.show()

Tamaño del agujero
La clave width de wedgeprops fija el ancho del anillo como una fracción del radio (que por defecto es 1), así que valores más pequeños generan un agujero más grande.
import matplotlib.pyplot as plt
# Datos
labels = ["G1", "G2", "G3", "G4", "G5"]
value = [12, 22, 16, 38, 12]
# Gráfico donut
fig, ax = plt.subplots()
ax.pie(value, labels = labels, wedgeprops = {"width": 0.2})
# plt.show()

Colores
Igual que en un gráfico de sectores normal, el color de relleno de cada porción se personaliza con el argumento colors.
import matplotlib.pyplot as plt
# Datos
labels = ["G1", "G2", "G3", "G4", "G5"]
value = [12, 22, 16, 38, 12]
colors = ["#B9DDF1", "#9FCAE6", "#73A4CA", "#497AA7", "#2E5B88"]
# Gráfico donut
fig, ax = plt.subplots()
ax.pie(value, labels = labels, colors = colors, wedgeprops = {"width": 0.4})
# plt.show()

Color del borde
Añade un borde entre porciones pasando también linewidth y edgecolor a wedgeprops.
import matplotlib.pyplot as plt
# Datos
labels = ["G1", "G2", "G3", "G4", "G5"]
value = [12, 22, 16, 38, 12]
colors = ["#B9DDF1", "#9FCAE6", "#73A4CA", "#497AA7", "#2E5B88"]
# Gráfico donut
fig, ax = plt.subplots()
ax.pie(value, labels = labels, colors = colors,
wedgeprops = {"width": 0.4, "linewidth": 1, "edgecolor": "white"})
# plt.show()

Porcentajes
Igual que en un gráfico de sectores normal, pasa una cadena de formato a autopct para mostrar el porcentaje de cada porción, y pctdistance para controlar a qué distancia del borde se sitúa.
import matplotlib.pyplot as plt
# Datos
labels = ["G1", "G2", "G3", "G4", "G5"]
value = [12, 22, 16, 38, 12]
# Gráfico donut
fig, ax = plt.subplots()
ax.pie(value, labels = labels, wedgeprops = {"width": 0.4},
autopct = '%1.1f%%', pctdistance = 0.8)
# plt.show()

Un patrón habitual en los gráficos donut es mostrar un valor resumen en el hueco central, como el total. Como el agujero es simplemente espacio vacío, puedes colocar cualquier texto ahí con ax.text.
import matplotlib.pyplot as plt
# Datos
labels = ["G1", "G2", "G3", "G4", "G5"]
value = [12, 22, 16, 38, 12]
# Gráfico donut
fig, ax = plt.subplots()
ax.pie(value, labels = labels, wedgeprops = {"width": 0.4})
ax.text(0, 0, f"Total\n{sum(value)}", ha = "center", va = "center", fontsize = 14)
# plt.show()

También te puede interesar