Trazar un gráfico circular en matplotlib en un ángulo específico con las fracturas en las cuñas

Estoy trazando un piechart con matplotlib usando el siguiente código:

ax = axes([0.1, 0.1, 0.6, 0.6]) labels = 'Twice Daily', 'Daily', '3-4 times per week', 'Once per week','Occasionally' fracs = [20,50,10,10,10] explode=(0, 0, 0, 0,0.1) patches, texts, autotexts = ax.pie(fracs, labels=labels, explode = explode, autopct='%1.1f%%', shadow =True) proptease = fm.FontProperties() proptease.set_size('xx-small') setp(autotexts, fontproperties=proptease) setp(texts, fontproperties=proptease) rcParams['legend.fontsize'] = 7.0 savefig("pie1") 

Esto produce el siguiente piechart. PieChart 1

Sin embargo, quiero comenzar el gráfico circular con la primera cuña en la parte superior, la única solución que pude encontrar para esto fue usar este código

Sin embargo, al usar esto como abajo,

 from pylab import * from matplotlib import font_manager as fm from matplotlib.transforms import Affine2D from matplotlib.patches import Circle, Wedge, Polygon import numpy as np fig = plt.figure() ax = fig.add_subplot(111) labels = 'Twice Daily', 'Daily', '3-4 times per week', 'Once per week','Occasionally' fracs = [20,50,10,10,10] wedges, plt_labels = ax.pie(fracs, labels=labels) ax.axis('equal') starting_angle = 90 rotation = Affine2D().rotate(np.radians(starting_angle)) for wedge, label in zip(wedges, plt_labels): label.set_position(rotation.transform(label.get_position())) if label._x > 0: label.set_horizontalalignment('left') else: label.set_horizontalalignment('right') wedge._path = wedge._path.transformed(rotation) plt.savefig("pie2") 

Esto produce el siguiente gráfico circular

introduzca la descripción de la imagen aquí

Sin embargo, esto no imprime las fracciones en las cuñas como en el gráfico circular anterior. He intentado algunas cosas diferentes, pero no puedo conservar las fracciones. ¿Cómo puedo iniciar la primera cuña al mediodía y mostrar las fracciones en las cuñas también?

Por lo general, no recomendaría cambiar la fuente de una herramienta, pero es difícil arreglar esto por fuera y por dentro. Así que esto es lo que haría si necesitaras que esto funcione ahora ™, y algunas veces lo haces …

En el archivo matplotlib/axes.py , cambie la statement de la función pie a

 def pie(self, x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, start_angle=None): 

es decir, simplemente agregue start_angle=None al final de los argumentos.

A continuación, agregue las cinco líneas entre corchetes por “# sum”.

  for frac, label, expl in cbook.safezip(x,labels, explode): x, y = center theta2 = theta1 + frac thetam = 2*math.pi*0.5*(theta1+theta2) # addition begins here if start_angle is not None and i == 0: dtheta = (thetam - start_angle)/(2*math.pi) theta1 -= dtheta theta2 -= dtheta thetam = start_angle # addition ends here x += expl*math.cos(thetam) y += expl*math.sin(thetam) 

Entonces, si start_angle es None, no pasa nada, pero si start_angle tiene un valor, entonces esa es la ubicación en la que se centra la primera porción (en este caso el 20%). Por ejemplo,

 patches, texts, autotexts = ax.pie(fracs, labels=labels, explode = explode, autopct='%1.1f%%', shadow =True, start_angle=0.75*pi) 

produce

introduzca la descripción de la imagen aquí

Tenga en cuenta que, en general, debe evitar hacer esto, parcheando la fuente, quiero decir, pero hay veces en el pasado en las que estuve en la fecha límite y simplemente quería algo Ahora ™, así que ahí va …