Python: 从 seaborn kdeplot 获取 FWHM
Python: Get FWHM from seaborn kdeplot
我在一些数据上使用了 seaborn 的 kdeplot。
import seaborn as sns
import numpy as np
sns.kdeplot(np.random.rand(100))
是否可以从创建的曲线中 return fwhm?
如果不是,还有其他计算方法吗?
我不相信有办法 return 从随机数据图中得到 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()
计算nearest和min之间的距离得到HWHM,然后乘以2得到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()
请注意,如果不需要绘制版本,也可以从 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)
我在一些数据上使用了 seaborn 的 kdeplot。
import seaborn as sns
import numpy as np
sns.kdeplot(np.random.rand(100))
是否可以从创建的曲线中 return fwhm? 如果不是,还有其他计算方法吗?
我不相信有办法 return 从随机数据图中得到 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()
计算nearest和min之间的距离得到HWHM,然后乘以2得到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()
请注意,如果不需要绘制版本,也可以从 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)