我正在计划kdeplot
使用
import seaborn as sns
colors = ['r','g','b']
i = 0
for v in dt.var.unique():
p1 = sns.kdeplot(dt.query('var == @v')['val'], shade=True, color=colors[i], legend=None).get_figure()
i += 1
该dt.val.max()
和dt.val.min()
是350
和0
分别。
但是情节看起来像这样
我不明白为什么X轴范围与数据不一致。
kde将高斯钟形放在每个数据点上,并对所有这些形状求和。形状的宽度取决于点的数量(或可以作为参数给出)和数据的方差。当采样点较少时,钟形会变宽。你的红色曲线可能没有几个采样点,并且大多数都接近0或350。
目前,seabornscipy.statsmodels.nonparametric.kde.KDEUnivariate
与高斯法线宽度的公式 一起使用1.059 * std(samples) * len(samples) ** (-1/5)
。
通常,kdeplot用于具有足够采样点的连续分布,并且假设概率密度函数相当平滑。
以下代码想说明如何从简化的采样点分布开始,将kde曲线作为各个高斯曲线的总和来计算。这些样本点会产生类似于示例红色曲线的kde曲线。
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns
import scipy.stats as stats
values = [0, 200, 300, 350]
repeats = [100, 25, 35, 40]
samples = np.repeat(values, repeats)
sns.kdeplot(samples, shade=False, color='crimson', label='kdeplot')
sigma = 1.059 * samples.std() * len(samples) ** (-1/5.)
x = np.linspace(-150, 500, 500)
for val, rep in zip(values, repeats):
f = stats.norm.pdf(x, val, sigma)
plt.plot(x, f * rep / len(samples), ls=':', label=f'value: {val} freq: {rep}')
plt.ylim(ymin=0)
plt.legend()
plt.show()