You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib饼图数值与Pandas DataFrame中数值不符的原因排查

饼图标注数值与原始数据不一致的原因解析

你遇到的饼图标注和DataFrame原始数值不符的问题,主要有两个核心原因:

1. 浮点数精度误差

计算机以二进制存储浮点数,部分十进制小数(比如15.04、12.82这类)无法被精确表示,会存在微小的精度损失。当Matplotlib计算饼图的占比、角度并转换回百分比标注时,这些累积的微小误差会导致最终四舍五入到两位小数后,和原始数值出现细微差异(比如52.75变成52.76)。

2. Matplotlib饼图的默认计算逻辑

pie函数的autopct参数默认显示的是每个数值占所有输入数值总和的百分比,而非直接显示你传入的原始数值。如果你的原始数据总和不是严格的100%(比如你提供的数据总和是96.88%),那标注的百分比会是该数值在总和中的占比,而非原始的百分比数值。

解决方法

如果你想让标注严格显示原始的百分比数值,可以自定义autopct函数:

import matplotlib.pyplot as plt
import pandas as pd

data = {
    'Região': ['NORTE', 'SUDESTE', 'NORDESTE', 'CENTRO OESTE', 'SUL'],
    'PNT "Real" sobre mercado BT (%)': [52.75, 15.04, 12.82, 8.23, 8.04]
}
data = pd.DataFrame(data)
data.set_index('Região', inplace=True)

# 自定义标注函数
def show_original_value(values):
    def formatter(pct):
        # 根据占比找到对应的原始数值
        idx = int(pct / 100 * len(values))
        return f'{values[idx]:.2f}%'
    return formatter

plt.rcParams["figure.autolayout"] = True
fig, ax = plt.subplots()
ax.patch.set_edgecolor('black')  
ax.patch.set_linewidth(1) 
ax.pie(
    data['PNT "Real" sobre mercado BT (%)'].values, 
    textprops={'size': 'smaller'}, 
    labels=data.index, 
    autopct=show_original_value(data['PNT "Real" sobre mercado BT (%)'].values),
    wedgeprops={'edgecolor':'black'}
)
ax.axis('equal')
plt.show()

如果你的目标是让饼图占比严格对应原始百分比,需要确保原始数据总和为100%,或者在Matplotlib 3.3及以上版本中设置normalize=False(关闭自动归一化)。

内容的提问来源于stack exchange,提问作者Murilo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:42:02