Matplotlib饼图浮点数文本显示异常:整数转换未正确四舍五入问题
问题原因分析
你遇到的问题核心在于Python的int()函数行为——它不是四舍五入,而是直接截断小数部分,只保留整数部分。比如:
int(22.9)的结果是22int(23.999)的结果还是23
不管小数部分多么接近下一个整数,int()都会直接砍掉小数,只取前面的整数。
为什么会出现22.9这类数值?因为浮点数计算存在精度误差:实际总用户数是44(23+21),23/44的百分比≈52.2727%,用这个百分比乘以总用户数44时,理论上应该得到23,但由于浮点数的二进制存储精度限制,实际计算结果可能是22.999999999999996这种接近23但略小一点的数,这时候用int()转换就会得到22,而非你预期的23。
解决方案
有两种靠谱的解决思路,你可以按需选择:
1. 用四舍五入代替截断
把int()换成round()函数,它会按照四舍五入规则处理小数:
def func(pct, allvals): absolute = round(pct/100.*np.sum(allvals)) return "{:.0f}%\n({:d} users)".format(pct, absolute)
这样即使计算出的数值是22.999999999999996,round()也会把它转为23,完美匹配你的实际用户数。
2. 直接使用已知的用户数(更精准)
既然你已经知道每个集群的用户数(就是data列表里的数值),完全不需要通过百分比反推,直接在标签里引用真实数值,彻底避免浮点数误差:
# 提前准备好每个切片的百分比和用户数标签 total_users = np.sum(data) labels = [f"{round(d/total_users*100):.0f}%\n({int(d)} users)" for d in data] # 绘制饼图时直接使用这些标签 wedges, texts, autotexts = ax.pie(data, labels=labels, textprops=dict(color="w"))
这种方法更直接,也不会有任何计算误差,因为我们直接使用了原始的用户数数据。
内容的提问来源于stack exchange,提问作者P H
相关产品推荐
相关产品推荐

