2011-05-29 65 views
30

我想創建一個matplotlib餅圖,其中每個楔形的值都寫在楔形的頂部。如何使用matplotlib autopct?

documentation建議我應該使用autopct來做到這一點。

autopct:[無|格式字符串| 格式化功能] 如果不是無,則是一個字符串或函數,用於標記其數值爲 的楔形。標籤將被放置在楔形內部的 。如果它是一個 格式字符串,標籤將是 fmt%pct。如果是功能,則會調用 。

不幸的是,我不確定這個格式字符串或格式函數應該是什麼。

使用下面這個基本的例子,我怎樣才能顯示每個數值在它的楔子之上?

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

回答

68

autopct使您能夠使用Python字符串格式顯示百分比值。例如,如果爲autopct='%.2f',則對於每個餅形楔,格式字符串爲'%.2f',並且該楔的數值百分比值爲pct,因此楔形標籤設置爲字符串'%.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() 

產生 Simple pie chart with percentages

可以通過提供一個可以調用到autopct做票友的事情。同時顯示百分比值和原始值,你可以這樣做:

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.

同樣,每個餡餅楔形,matplotlib提供的百分比值pct作爲參數,不過這一次卻是作爲參數發送給函數my_autopct。楔形標籤設置爲my_autopct(pct)

+0

太好了。現在已經很清楚了。非常感謝你的回答。 – Kim 2011-05-29 21:11:05

+0

如何爲定製autopct函數提供參數?即,如果您想將變量'values'發送到'my_autopct'。 – cosmosa 2015-07-13 22:40:10

+2

@ cosmos1990:'plt.pie'預計'autopct'函數是一個 變量的函數,百分比值'pct'。但是,您可以[關閉](http://effbot.org/zone/closure.htm) - 「可以引用不再活動的環境的函數」。我已經編輯了上面的帖子來展示如何。現在'values'被傳遞給'make_autopct','make_autopct(values)'返回閉包*'my_autopct'。當調用my_autopct時,它會在'make_autopct'的[封閉範圍](http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules)中查找'values'。 – unutbu 2015-07-13 23:45:57

8
val=int(pct*total/100.0) 

應該

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

防止舍入誤差。