【问题标题】:How can I plot a CDF in Matplotlib without binning my data? [duplicate]如何在 Matplotlib 中绘制 CDF 而无需对我的数据进行分箱? [复制]
【发布时间】:2021-11-29 20:45:33
【问题描述】:

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

data = np.linspace(0, 100, num=10000)
plt.hist(data, cumulative=True, density=1)

结果是这样的:

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

plt.hist(data, bins=50, cumulative=True, density=1)

现在结果是:

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

有没有办法绘制一个不会让我失去一些精度的 CDF?像无 bin 直方图或其他什么?

【问题讨论】:

标签: python matplotlib cdf


【解决方案1】:

您说的是从样本中导出的 ECDF(经验累积分布函数),而累积直方图并不是通常的做法。通常所做的就是对样本进行排序,找出唯一值,然后找出样本中小于或等于那些唯一值的比例;无需调整 bin 宽度。

ECDF 在每个唯一值处都有不连续的跳跃,因此为了绘图,您需要每次跳跃有 2 个值。以下代码将为您提供 xyplot 一个 ECDF:

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)))

【讨论】:

    最近更新 更多