построение дискретной эмпирической функции распределения (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)

получите такую картинку:

введите сюда описание изображения

→ Ссылка