温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - range of x-axis of kdeplot in seaborn is different than in data
matplotlib python seaborn

python - Seaborn中kdeplot的x轴范围与数据中的不同

发布于 2021-04-18 15:06:13

我正在计划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()3500分别。

但是情节看起来像这样

在此处输入图片说明

我不明白为什么X轴范围与数据不一致。

查看更多

提问者
quant
被浏览
165
JohanC 2020-07-04 05:01

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()

结果图