如何在 matplotlib 饼图中显示实际值(Python)?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41088236/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to have actual values in matplotlib Pie Chart displayed (Python)?
提问by AnthonyJ
I have a pie chart drawing the values extracted from a CSV file. The proportion of the values are currently displayed with the percentage displayed "autopct='%1.1f%%'". Is there a way to display the actual values which are represented in the dataset for each slice.
我有一个饼图,绘制了从 CSV 文件中提取的值。当前显示值的比例,百分比显示为“autopct='%1.1f%%'”。有没有办法显示每个切片的数据集中表示的实际值。
#Pie for Life Expectancy in Boroughs
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
# show plots inline
%matplotlib inline
# use ggplot style
matplotlib.style.use('ggplot')
#read data
lifeEx = pd.read_csv('LEpie.csv')
#Select columns
df = pd.DataFrame()
df['LB'] = lifeEx[['Regions']]
df['LifeEx'] = lifeEx[['MinLF']]
colorz = ['#B5DF00','#AD1FFF', '#BF1B00','#5FB1FF','#FFC93F']
exploda = (0, 0, 0, 0.1, 0)
#plotting
plt.pie(df['LifeEx'], labels=df['LB'], colors=colorz, autopct='%1.1f%%', explode = exploda, shadow = True,startangle=90)
#labeling
plt.title('Min Life expectancy across London Regions', fontsize=12)
回答by ImportanceOfBeingErnest
Using the autopct
keyword
使用autopct
关键字
As we know that the percentage shown times the sum of all actual values must be the actual value, we can define this as a function and supply this function to plt.pie
using the autopct
keyword.
正如我们所知,显示的百分比乘以所有实际值的总和必须是实际值,我们可以将其定义为一个函数,并将该函数提供给plt.pie
使用autopct
关键字。
import matplotlib.pyplot as plt
import numpy
labels = 'Frogs', 'Hogs', 'Dogs'
sizes = numpy.array([5860, 677, 3200])
colors = ['yellowgreen', 'gold', 'lightskyblue']
def absolute_value(val):
a = numpy.round(val/100.*sizes.sum(), 0)
return a
plt.pie(sizes, labels=labels, colors=colors,
autopct=absolute_value, shadow=True)
plt.axis('equal')
plt.show()
Care must be taken since the calculation involves some error, so the supplied value is only accurate to some decimal places.
必须小心,因为计算涉及一些错误,因此提供的值仅精确到一些小数位。
A little bit more advanced may be the following function, that tries to get the original value from the input array back by comparing the difference between the calculated value and the input array. This method does not have the problem of inaccuracy but relies on input values which are sufficiently distinct from one another.
更高级的可能是以下函数,它尝试通过比较计算值和输入数组之间的差异来从输入数组中取回原始值。这种方法不存在不准确的问题,而是依赖于彼此足够不同的输入值。
def absolute_value2(val):
a = sizes[ numpy.abs(sizes - val/100.*sizes.sum()).argmin() ]
return a
Changing text after pie creation
创建饼图后更改文本
The other option is to first let the pie being drawn with the percentage values and replace them afterwards. To this end, one would store the autopct labels returned by plt.pie()
and loop over them to replace the text with the values from the original array. Attention, plt.pie()
only returns three arguments, the last one being the labels of interest, when autopct
keyword is provided so we set it to an empty string here.
另一种选择是先用百分比值绘制饼图,然后再替换它们。为此,可以存储由返回的 autopct 标签plt.pie()
并遍历它们以用原始数组中的值替换文本。注意,plt.pie()
当autopct
提供关键字时,只返回三个参数,最后一个是感兴趣的标签,因此我们在这里将其设置为空字符串。
labels = 'Frogs', 'Hogs', 'Dogs'
sizes = numpy.array([5860, 677, 3200])
colors = ['yellowgreen', 'gold', 'lightskyblue']
p, tx, autotexts = plt.pie(sizes, labels=labels, colors=colors,
autopct="", shadow=True)
for i, a in enumerate(autotexts):
a.set_text("{}".format(sizes[i]))
plt.axis('equal')
plt.show()