построение дискретной эмпирической функции распределения (cdf)
каким образом можно убрать вертикальные линии при построении дискретной функции распределения?
import matplotlib.pyplot as plt
def plot_empirical_cdf(sample):
plt.hist(sample, histtype='step', cumulative=True, bins=len(sample))
plt.show()
sample = [123.0, 119.5, 120.5, 118.1, 117.5, 118.2, 124.5, 115.9, 121.0, 126.0, 121.3, 121.0, 118.2, 120.2, 124.3, 118.5, 117.2, 125.5, 115.0, 119.5, 126.0, 120.0, 126.5, 121.0, 125.0, 123.0, 122.7, 120.5, 122.5, 122.0, 122.5, 122.5, 122.5, 117.2, 123.0, 128.5, 120.5, 118.9, 116.2, 125.0, 125.1, 121.8, 122.0, 120.5, 123.0, 115.0, 120.5, 118.0, 125.0, 115.0, 117.0, 125.9, 122.0, 120.5, 121.1, 123.5, 120.7, 125.8, 120.5, 119.0, 120.5, 120.2, 123.0, 120.0, 117.2, 122.6, 120.2, 120.5, 123.0, 121.5, 120.0, 119.5, 115.0, 122.9, 123.3, 121.0, 122.5, 119.0, 124.0, 120.5, 121.9, 124.2, 121.5, 118.2, 122.2, 121.5, 120.0, 123.0, 119.5, 117.8, 119.2, 116.0, 123.0]
plot_empirical_cdf(sample)
Ответы (2 шт):
Автор решения: passant
→ Ссылка
Любая эмпирическая функция распределения, построенная по конечному числу объектов будет иметь вертикальные ступеньки. Если вам очень нужно - ну примените ее сглаживание, только вот зачем?
Кстати, самому строить CDF функцию вовсе не обязательно, с этим прекрасно справляется функция distributions.ECDF(sample) из statsmodels.api
Но если вам все же надо именно гладенькая функция, то это можно сделать вот так:
import seaborn as sns
sample = [123.0, 119.5, 120.5, 118.1, 117.5, 118.2, 124.5, 115.9, 121.0, 126.0, 121.3, 121.0, 118.2, 120.2, 124.3, 118.5, 117.2, 125.5, 115.0, 119.5, 126.0, 120.0, 126.5, 121.0, 125.0, 123.0, 122.7, 120.5, 122.5, 122.0, 122.5, 122.5, 122.5, 117.2, 123.0, 128.5, 120.5, 118.9, 116.2, 125.0, 125.1, 121.8, 122.0, 120.5, 123.0, 115.0, 120.5, 118.0, 125.0, 115.0, 117.0, 125.9, 122.0, 120.5, 121.1, 123.5, 120.7, 125.8, 120.5, 119.0, 120.5, 120.2, 123.0, 120.0, 117.2, 122.6, 120.2, 120.5, 123.0, 121.5, 120.0, 119.5, 115.0, 122.9, 123.3, 121.0, 122.5, 119.0, 124.0, 120.5, 121.9, 124.2, 121.5, 118.2, 122.2, 121.5, 120.0, 123.0, 119.5, 117.8, 119.2, 116.0, 123.0]
sns.kdeplot(sample, cumulative=True)
Автор решения: strawdog
→ Ссылка
Могу предложить вам такое решение:
import matplotlib.pyplot as plt
import numpy as np
def plot_empirical_cdf(sample):
hist, edges = np.histogram(sample, bins=len(sample))
Y = hist.cumsum()
for i in range(len(Y)):
plt.plot([edges[i], edges[i+1]],[Y[i], Y[i]], c="blue")
plt.show()
sample = [123.0, 119.5, 120.5, 118.1, 117.5, 118.2, 124.5, 115.9, 121.0, 126.0, 121.3,
121.0, 118.2, 120.2, 124.3, 118.5, 117.2, 125.5, 115.0, 119.5, 126.0, 120.0,
126.5, 121.0, 125.0, 123.0, 122.7, 120.5, 122.5, 122.0, 122.5, 122.5, 122.5,
117.2, 123.0, 128.5, 120.5, 118.9, 116.2, 125.0, 125.1, 121.8, 122.0, 120.5,
123.0, 115.0, 120.5, 118.0, 125.0, 115.0, 117.0, 125.9, 122.0, 120.5, 121.1,
123.5, 120.7, 125.8, 120.5, 119.0, 120.5, 120.2, 123.0, 120.0, 117.2, 122.6,
120.2, 120.5, 123.0, 121.5, 120.0, 119.5, 115.0, 122.9, 123.3, 121.0, 122.5,
119.0, 124.0, 120.5, 121.9, 124.2, 121.5, 118.2, 122.2, 121.5, 120.0, 123.0,
119.5, 117.8, 119.2, 116.0, 123.0]
plot_empirical_cdf(sample)
получите такую картинку:


