如何从 kdeplot 获取半高全宽 (FWHM)

2023-12-01

我在一些数据上使用了seaborn的kdeplot。

import seaborn as sns
import numpy as np
sns.kdeplot(np.random.rand(100))

是否可以从创建的曲线返回 fwhm? 如果不是,还有其他方法可以计算吗?


您可以从 ax 中提取生成的 kde 曲线。然后获取最大 y 值并搜索最接近半最大值的 x 位置:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

ax = sns.kdeplot(np.random.rand(100))
kde_curve = ax.lines[0]
x = kde_curve.get_xdata()
y = kde_curve.get_ydata()
halfmax = y.max() / 2
maxpos = y.argmax()
leftpos = (np.abs(y[:maxpos] - halfmax)).argmin()
rightpos = (np.abs(y[maxpos:] - halfmax)).argmin() + maxpos
fullwidthathalfmax = x[rightpos] - x[leftpos]
ax.hlines(halfmax, x[leftpos], x[rightpos], color='crimson', ls=':')
ax.text(x[maxpos], halfmax, f'{fullwidthathalfmax:.3f}\n', color='crimson', ha='center', va='center')
ax.set_ylim(ymin=0)
plt.show()

example plot

请注意,您还可以计算 kde 曲线scipy.stats.gaussian_kde如果您不需要绘制的版本。在这种情况下,代码可能如下所示:

import numpy as np
from scipy.stats import gaussian_kde

data = np.random.rand(100)
kde = gaussian_kde(data)
x = np.linspace(data.min(), data.max(), 1000)
y = kde(x)
halfmax = y.max() / 2
maxpos = y.argmax()
leftpos = (np.abs(y[:maxpos] - halfmax)).argmin()
rightpos = (np.abs(y[maxpos:] - halfmax)).argmin() + maxpos
fullwidthathalfmax = x[rightpos] - x[leftpos]
print(fullwidthathalfmax)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 kdeplot 获取半高全宽 (FWHM) 的相关文章

随机推荐