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
相关产品推荐
相关产品推荐

