Функция плотности вероятности построения графика с частотой отсчетов - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу преобразовать установленное распределение в частоту.

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
%matplotlib notebook

# sample data generation
np.random.seed(42)
data = sorted(stats.lognorm.rvs(s=0.5, loc=1, scale=1000, size=1000))

# fit lognormal distribution
shape, loc, scale = stats.lognorm.fit(data, loc=0)
pdf_lognorm = stats.lognorm.pdf(data, shape, loc, scale)

fig, ax = plt.subplots(figsize=(8, 4))

ax.hist(data, bins='auto', density=True)
ax.plot(data, pdf_lognorm)
ax.set_ylabel('probability')
ax.set_title('Linear Scale')

Приведенный выше фрагмент кода сгенерирует следующий график:

enter image description here

Как видно, ось Yс точки зрения вероятности.Но я хочу, чтобы это было в терминах частот.

fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(data, bins='auto')
ax.set_ylabel('probability')
ax.set_title('Linear Scale')

Отключив density=True, гистограмма отображается в терминах частот.Но я не знаю, как подобрать распределение таким же образом, как на гистограммах. Посмотрите, как я не смог нарисовать оранжевую линию на этой гистограмме.

enter image description here

Как я могу это сделать?Я думаю, мне следует умножить подогнанное распределение на площадь под кривой гистограммы, но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 27 февраля 2019

С научной точки зрения, действительно ожидается, что, поскольку вы решите также построить график плотности, ось у будет в вероятности, а не в счетчиках ...

Тем не менее, вы можете использовать оба метода, используядвойные оси и twinx:

fig, ax = plt.subplots(figsize=(8, 4))
ax2 = ax.twinx()

ax.hist(data, bins='auto', density=True)
ax2.hist(data, bins='auto')
ax.plot(data, pdf_lognorm)
ax2.set_ylabel('frequency')
ax.set_ylabel('probability')
ax.set_title('Linear Scale')][1]][1]

enter image description here

, где я также использовал более подходящий термин «частота» для подсчетов.

Немного поэкспериментировав, вы можете даже вывести кривую плотности вперед или поменять оси:

fig, ax = plt.subplots(figsize=(8, 4))
ax2 = ax.twinx()

ax2.hist(data, bins='auto', density=True)
ax.hist(data, bins='auto')
ax2.plot(data, pdf_lognorm)
ax2.set_ylabel('probability')
ax.set_ylabel('frequency')
ax.set_title('Linear Scale')

enter image description here

...