首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何在Matplotlib中绘制CDF而不将我的数据放入库中?

我如何在Matplotlib中绘制CDF而不将我的数据放入库中?
EN

Stack Overflow用户
提问于 2021-10-11 02:40:05
回答 1查看 67关注 0票数 0

我可以通过使用累积直方图在Matplotlib中轻松创建CDF:

代码语言:javascript
复制
data = np.linspace(0, 100, num=10000)
plt.hist(data, cumulative=True, density=1)

结果是这样的:

我可以增加仓位计数以获得更好的近似值:

代码语言:javascript
复制
plt.hist(data, bins=50, cumulative=True, density=1)

现在的结果是:

这仍然不是很好。我知道我可以让bin计数更高,但这对我来说是一个非常令人不满意的解决方案。

有没有一种方法可以绘制CDF,而不会使我失去一些精度?就像无箱直方图之类的?

EN

回答 1

Stack Overflow用户

发布于 2021-10-11 02:58:43

您谈论的是从样本导出的ECDF (经验累积分布函数),而累积直方图通常不是这样做的。通常要做的是对样本进行排序,找到唯一的值,并找到小于或等于这些唯一值的样本的比例;不需要调整bin宽度。

ECDF在每个唯一的值处都有不连续的跳跃,因此为了绘图,您可能需要为每个跳跃提供两个值。以下代码将为您提供用于plot ECDF的xy

代码语言:javascript
复制
def ecdf4plot(seq, assumeSorted = False):
    """
    In:
    seq - sorted-able object containing values
    assumeSorted - specifies whether seq is sorted or not
    Out:
    0. values of support at both points of jump discontinuities
    1. values of ECDF at both points of jump discontinuities
       ECDF's true value at a jump discontinuity is the higher one    """
    if not assumeSorted:
        seq = sorted(seq)
    prev = seq[0]
    n = len(seq)
    support = [prev]
    ECDF = [0.]
    for i in range(1, n):
        seqi = seq[i]
        if seqi != prev:
            preP = i/n
            support.append(prev)
            ECDF.append(preP)
            support.append(seqi)
            ECDF.append(preP)
            prev = seqi
    support.append(prev)
    ECDF.append(1.)
    return support, ECDF

# example usage
import numpy as np
from matplotlib import pyplot as plt

plt.plot(*ecdf4plot(np.random.randn(100)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69520456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档