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
withfloc=0
。