Python 使用seaborn绘制scipy拟合后的对数正态分布拟合

Python 使用seaborn绘制scipy拟合后的对数正态分布拟合,python,scipy,probability,seaborn,Python,Scipy,Probability,Seaborn,我已经使用scipy.stats.lognormal为数据拟合了一个分布,现在我正在尝试绘制分布图。我已使用seaborn生成与我的数据的拟合: ax = sns.distplot(1 - clint_unique_cov_filter['Identity'], kde=False, hist=True, norm_hist=True, fit=lognorm, bins=np.linspace(0, 1, 500)) ax.set_xlim(0, 0.1)

我已经使用
scipy.stats.lognormal
为数据拟合了一个分布,现在我正在尝试绘制分布图。我已使用seaborn生成与我的数据的拟合:

ax = sns.distplot(1 - clint_unique_cov_filter['Identity'], kde=False, hist=True, 
                  norm_hist=True, fit=lognorm, bins=np.linspace(0, 1, 500))
ax.set_xlim(0, 0.1)
这让我得到了我期望的健康:

我需要使用此分布的参数进行进一步分析,但首先我想验证我是否理解这些术语。显示我想要执行以下转换来转换
lognorm.fit的输出,以获得lognormal的标准mu和sigma参数:

shape, loc, scale = lognorm.fit(1 - clint_unique_cov_filter['Identity'])
mu = np.log(scale)
sigma = shape
但是,当我试图绘制此图时,我没有得到我期望的分布。为了再次检查,我尝试将原始值粘贴回绘图中,但分布明显不同:

s, l, sc = lognorm.fit(1 - clint_unique_cov_filter['Identity'])
rv = lognorm(s, l, sc)
plt.plot(np.linspace(0, 0.1), rv.pdf(np.exp(np.linspace(0, 0.1))))

为什么这种分布与seaborn生产的分布不同

编辑:

阅读seaborn密码让我找到了答案:

params = lognorm.fit(1 - clint_unique_cov_filter['Identity'])
xvals = np.linspace(0, 0.1)
pdf = lambda x: lognorm.pdf(xvals, *params)
yvals = pdf(xvals)
plt.plot(xvals, yvals)
这提供了正确的绘图:


通常您希望在
scipy.stats.lognorm.fit()中使用
floc=0
;例如,如果您搜索
[scipy]lognorm
,请参见、,可能还有一些其他内容。
seaborn
是否使用floc=0?我尝试了两种方法,都没有提供seaborn制作的发行版。我想没有,但是从中看,您可以使用参数
fit\u kws=dict(floc=0)
。(我没有试过。)您确定
distplot
生成的绘图是您所期望的吗?这张图看起来像是在y轴上被切断的,这表明它将在达到0之前继续进入负x范围。看起来
distplot
的拟合导致了
loc
参数的负值。我明白了。因此,要使用
floc=0
,必须使用
fit
方法创建一个对象,该方法调用
lognorm.fit
with
floc=0