Как построить 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