Самый простой способ - нарисовать диаграмму дважды, один раз для толстых клиньев, один раз для тонких. Цвета клиньев, которые не должны быть нарисованы, имеет значение «none». Установка явного радиуса создаст правильный размер для тонких клиньев.
При таком подходе круги не нужны, чтобы скрывать вещи. Вы все еще можете добавить круг, чтобы получить другой цвет в центре. Просто добавьте zorder=0
, чтобы убедиться, что круг находится за p ie.
Некоторый код для иллюстрации концепции:
import matplotlib.pyplot as plt
donut = [150, 10, 20, 20, 30, 40]
thin_indices = [0] # indices of all wedges that should be thin
colors = ['#CCCCCC', '#50E3C2', '#FF9100', '#002776', '#C94096', '#0071CD']
colors_thin = [c if i in thin_indices else 'none' for i, c in enumerate(colors)]
colors_thick = [c if i not in thin_indices else 'none' for i, c in enumerate(colors)]
radius = 1
thick_width = 0.1
thin_width = 0.05
radius_thin = radius - 0.5 * (thick_width - thin_width)
fig, ax = plt.subplots(figsize=(2, 2), subplot_kw=dict(aspect="equal"))
ax.pie(donut, radius=radius, colors=colors_thick, wedgeprops=dict(width=thick_width), startangle=90)
ax.pie(donut, radius=radius_thin, colors=colors_thin, wedgeprops=dict(width=thin_width), startangle=90)
centre_circle = plt.Circle((0, 0), radius - thick_width/2, fc='white', zorder=0)
ax.add_artist(centre_circle)
fig.set_facecolor('#F8F5EB')
plt.savefig('cirle.png', facecolor=fig.get_facecolor(), edgecolor='none', dpi=300)
plt.show()