如何在Python中用matplotlib绘制cdf?

时间:2012-02-21 13:25:56

标签: python matplotlib

我有一个名为d的无序列表,如下所示:

[0.0000, 123.9877,0.0000,9870.9876, ...]

我只想在Python中使用Matplotlib绘制基于此列表的cdf图。但不知道是否有任何我可以使用的功能

d = []
d_sorted = []
for line in fd.readlines():
    (addr, videoid, userag, usertp, timeinterval) = line.split()
    d.append(float(timeinterval))

d_sorted = sorted(d)

class discrete_cdf:
    def __init__(data):
        self._data = data # must be sorted
        self._data_len = float(len(data))

    def __call__(point):
        return (len(self._data[:bisect_left(self._data, point)]) / 
               self._data_len)

cdf = discrete_cdf(d_sorted)
xvalues = range(0, max(d_sorted))
yvalues = [cdf(point) for point in xvalues]
plt.plot(xvalues, yvalues)

现在我正在使用此代码,但错误消息是:

Traceback (most recent call last):
File "hitratioparea_0117.py", line 43, in <module>
cdf = discrete_cdf(d_sorted)
TypeError: __init__() takes exactly 1 argument (2 given)

6 个答案:

答案 0 :(得分:27)

如上所述,来自cumsum的{​​{1}}效果很好。确保您的数据是正确的PDF(即总和为1),否则CDF将不会以统一as it should结束。这是一个最小的工作示例:

numpy

enter image description here

答案 1 :(得分:19)

我知道我迟到了。但是,如果你只想要你的情节的cdf而不是将来的计算,那么有一种更简单的方法:

plt.hist(put_data_here, normed=True, cumulative=True, label='CDF',
         histtype='step', alpha=0.8, color='k')

例如,生成one of these graphs的相关代码是:

plt.hist(dataset, bins=bins, normed=True, cumulative=True, label='CDF DATA', 
         histtype='step', alpha=0.55, color='purple')
# bins and (lognormal / normal) datasets are pre-defined
编辑:来自matplotlib文档的This example可能会更有帮助。

答案 2 :(得分:8)

计算累积总和cumsum的numpy函数在这里很有用

In [1]: from numpy import cumsum
In [2]: cumsum([.2, .2, .2, .2, .2])
Out[2]: array([ 0.2,  0.4,  0.6,  0.8,  1. ])

答案 3 :(得分:0)

对于任意值集合,x:

def cdf(x, plot=True, *args, **kwargs):
    x, y = sorted(x), np.arange(len(x)) / len(x)
    return plt.plot(x, y, *args, **kwargs) if plot else (x, y)

(((如果您不熟悉python,则* args和** kwargs允许您传递参数和命名参数,而无需明确声明和管理它们)

答案 4 :(得分:0)

最适合我的是 pandas 的 quantile 函数。

假设我有 71 名参与者。每个参与者都有一定数量的中断。我想为参与者计算#interruptions 的 CDF 图。目标是能够知道有多少参与者至少进行了 30 次干预。

step=0.05
indices = np.arange(0,1+step,step)
num_interruptions_per_participant = [32,70,52,52,39,20,37,31,60,57,31,71,24,23,38,4,77,37,79,43,63,43,75,13
,45,31,57,28,61,29,30,52,65,11,76,37,65,28,33,73,65,43,50,33,45,40,50,44
,33,49,24,69,55,47,22,45,54,11,30,13,32,52,31,50,10,46,10,25,47,51,83]

CDF = pd.DataFrame({'dummy':num_interruptions_per_participant})['dummy'].quantile(indices)


plt.plot(CDF,indices,linewidth=9, label='#interventions', color='blue')

enter image description here

根据图表,几乎 25% 的参与者的干预次数少于 30。

您可以使用此统计数据进行进一步分析。例如,在我的情况下,我需要对每个参与者至少进行 30 次干预,以满足留一科目评估所需的最低样本要求。 CDF 告诉我,我对 25% 的参与者有问题。

答案 5 :(得分:-4)

import matplotlib.pyplot as plt
X=sorted(data)
Y=[]
l=len(X)
Y.append(float(1)/l)
for i in range(2,l+1):
    Y.append(float(1)/l+Y[i-2])
plt.plot(X,Y,color=c,marker='o',label='xyz')

我想这样做,程序参考http://www.youtube.com/watch?v=vcoCVVs0fRI