2011-05-29 292 views
30

Me gustaría crear un gráfico circular matplotlib que tenga el valor de cada cuña escrito en la parte superior de la cuña.¿Cómo uso matplotlib autopct?

El documentation sugiere que debo usar autopct para hacer esto.

autopct: [Ninguna | formato de cadena | función de formato] Si no es None, es una cadena o función utilizada para etiquetar las cuñas con su valor numérico. La etiqueta será colocada dentro de la cuña. Si es una cadena de formato , la etiqueta será fmt% pct. Si es una función, se llamará a .

Lamentablemente, no estoy seguro de qué se supone que es esta cadena de formato o función de formato.

Usando este ejemplo básico a continuación, ¿cómo puedo mostrar cada valor numérico en la parte superior de su cuña?

plt.figure() 
values = [3, 12, 5, 8] 
labels = ['a', 'b', 'c', 'd'] 
plt.pie(values, labels=labels) #autopct?? 
plt.show() 

Respuesta

68

autopct le permite mostrar el valor del porcentaje usando el formato de cadenas de Python. Por ejemplo, si es autopct='%.2f', entonces para cada sector, la cadena de formato es '%.2f' y el porcentaje numérico de esa cuña es pct, por lo que la etiqueta de cuña se establece en la cadena '%.2f'%pct.

import matplotlib.pyplot as plt 
plt.figure() 
values = [3, 12, 5, 8] 
labels = ['a', 'b', 'c', 'd'] 
plt.pie(values, labels=labels, autopct='%.2f') 
plt.show() 

produce Simple pie chart with percentages

se pueden hacer cosas más elegante mediante el suministro de un exigible a autopct. Para mostrar tanto el valor del porcentaje y el valor original, usted puede hacer esto:

import matplotlib.pyplot as plt 

# make the pie circular by setting the aspect ratio to 1 
plt.figure(figsize=plt.figaspect(1)) 
values = [3, 12, 5, 8] 
labels = ['a', 'b', 'c', 'd'] 

def make_autopct(values): 
    def my_autopct(pct): 
     total = sum(values) 
     val = int(round(pct*total/100.0)) 
     return '{p:.2f}% ({v:d})'.format(p=pct,v=val) 
    return my_autopct 

plt.pie(values, labels=labels, autopct=make_autopct(values)) 
plt.show() 

Pie chart with both percentages and absolute numbers.

Una vez más, para cada cuña de pastel, matplotlib suministra el valor del porcentaje pct como el argumento, aunque esta vez se trata enviado como argumento a la función my_autopct. La etiqueta de cuña se establece en my_autopct(pct).

+0

Genial. Esto está claro ahora. Muchas gracias por su respuesta. – Kim

+0

¿Cómo se puede suministrar un parámetro a la función autopct personalizada? Es decir, si desea enviar la variable 'values' a' my_autopct'. – cosmosa

+2

@ cosmos1990: 'plt.pie' espera que la función' autopct' sea una función de una variable , el valor porcentual, 'pct'. Sin embargo, puede hacer [a closure] (http://effbot.org/zone/closure.htm) - "una función que puede referirse a entornos que ya no están activos". He editado la publicación anterior para mostrar cómo. Ahora 'values' se pasa a' make_autopct', y 'make_autopct (values)' devuelve * el cierre * 'my_autopct'. Cuando se invoca 'my_autopct', buscará' values' en [el alcance adjunto] (http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules) de 'make_autopct'. – unutbu

8
val=int(pct*total/100.0) 

debería ser

val=int((pct*total/100.0)+0.5) 

para evitar errores de redondeo.