如何在Matplotlib中无需分箱绘制高精度CDF(累积分布函数)
无分箱绘制CDF的实现方案
你可以通过计算**经验累积分布函数(ECDF)**实现完全无分箱的CDF绘制,彻底避免分箱带来的精度损失,原理是:CDF在任意取值x处的结果等于样本中小于等于x的数值占总样本量的比例,直接对原始数据排序后计算对应累计比例即可,不需要任何分箱操作。
手动实现方案(无需额外依赖)
仅需要numpy和matplotlib即可完成,代码如下:
import numpy as np import matplotlib.pyplot as plt # 你的原始数据 data = np.linspace(0, 100, num=10000) # 排序数据 sorted_data = np.sort(data) # 计算每个排序点对应的累计概率 cdf = np.arange(1, len(sorted_data) + 1) / len(sorted_data) # 绘图 plt.plot(sorted_data, cdf) plt.xlabel('数值') plt.ylabel('累计概率') plt.show()
该方案和分箱方案的对比如下:
- 完全无精度损失,保留所有原始数据的分布特征
- 计算效率更高,不需要执行分箱统计的逻辑
- 绘制结果为连续折线,不会出现分箱导致的阶梯状误差
调用现成ECDF工具的方案
如果你不想手动实现排序逻辑,可以直接使用statsmodels库内置的ECDF实现:
- 首先安装依赖(若未安装):
pip install statsmodels - 示例代码:
import numpy as np import matplotlib.pyplot as plt from statsmodels.distributions.empirical_distribution import ECDF data = np.linspace(0, 100, num=10000) # 直接生成ECDF对象 ecdf = ECDF(data) # 绘图 plt.plot(ecdf.x, ecdf.y) plt.xlabel('数值') plt.ylabel('累计概率') plt.show()
该方案的计算结果和手动实现完全一致,同时支持更多扩展的统计操作。
内容的提问来源于stack exchange,提问作者jrpear
相关产品推荐
相关产品推荐

