Как построить cdf в matplotlib в Python?

У меня есть неупорядоченный список с именем d, который выглядит так:

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

Я просто хочу построить график cdf на основе этого списка, используя Matplotlib в Python. Но не знаю, есть ли какая-либо функция, которую я могу использовать

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)

Ответ 1

Как уже упоминалось, cumsum из numpy работает хорошо. Убедитесь, что ваши данные являются надлежащим PDF (т.е. Суммами к одному), иначе CDF не будет заканчиваться на уровне как это должно быть. Вот минимальный рабочий пример:

import numpy as np
from pylab import *

# Create some test data
dx = .01
X  = np.arange(-2,2,dx)
Y  = exp(-X**2)

# Normalize the data to a proper PDF
Y /= (dx*Y).sum()

# Compute the CDF
CY = np.cumsum(Y*dx)

# Plot both
plot(X,Y)
plot(X,CY,'r--')

show()

enter image description here

Ответ 2

Функция numpy для вычисления суммарных сумм cumsum может быть здесь полезной.

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

Я знаю, что опаздываю на вечеринку. Но есть более простой способ, если вы просто хотите использовать cdf для своего сюжета, а не для будущих вычислений:

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

В качестве примера соответствующий код для создания одного из этих графиков:

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

EDIT: Этот пример из документов matplotlib может быть более полезным.

Ответ 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