我想将拟合分布转换为频率。
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')
上面的代码片段将生成以下图:
如您所见,y轴是概率。但我希望它是在频率方面。
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(data, bins='auto')
ax.set_ylabel('probability')
ax.set_title('Linear Scale')
通过取消设置density=True
,可以根据频率显示直方图。但是我不知道如何像直方图中那样拟合分布-请观察我如何无法在此直方图中绘制橙色拟合线。
我该怎么做?我想我应该将拟合分布乘以直方图曲线下的面积,但是我不知道该怎么做。
答案 0 :(得分:1)
从科学上讲,确实可以预期,因为您决定还绘制密度图,因此y轴将是概率,而不是计数...
尽管如此,您可以同时使用双轴和\.jpg
:
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]
答案 1 :(得分:0)
我遇到了同样的问题,发现我需要将拟合的分布乘以新的直方图的面积,就像您提到的那样。假设所有bin的宽度相同,则直方图的面积将为=一个bin的bin宽度*样本数(len(data))