我在一些数据上使用了seaborn的kdeplut。
import seaborn as sns import numpy as np sns.kdeplot(np.random.rand(100))
是否可以从创建的曲线返回fwhm?如果没有,有没有其他方法来计算?
hs1ihplo1#
您可以从轴中提取生成的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()
请注意,如果不需要打印的版本,也可以从scipy.stats.gaussian_kde计算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)
kulphzqa2#
我不相信有一种方法可以从随机数据图中返回fwhm,而不编写代码来计算它。考虑一些示例数据:
import numpy as np arr_x = np.linspace(norm.ppf(0.00001), norm.ppf(0.99999), 10000) arr_y = norm.pdf(arr_x)
找出最小值和最大值并计算差值。
difference = max(arr_y) - min(arr_y)
求半最大值(在本例中为半最小值)
HM = difference / 2
找到离HM最近的数据点:
nearest = (np.abs(arr_y - HM)).argmin()
计算最近和min之间的距离以获得HWHM,然后乘以2以获得FWHM。
2条答案
按热度按时间hs1ihplo1#
您可以从轴中提取生成的kde曲线。然后得到最大的y值,并搜索最接近半最大值的x位置:
请注意,如果不需要打印的版本,也可以从scipy.stats.gaussian_kde计算kde曲线。在这种情况下,代码可能看起来像:
kulphzqa2#
我不相信有一种方法可以从随机数据图中返回fwhm,而不编写代码来计算它。
考虑一些示例数据:
找出最小值和最大值并计算差值。
求半最大值(在本例中为半最小值)
找到离HM最近的数据点:
计算最近和min之间的距离以获得HWHM,然后乘以2以获得FWHM。