为何seaborn的kdeplot未归一化?y轴显示实际计数而非0-1范围
问题原因与解决方法
首先澄清一个误解:核密度估计(KDE)的y轴代表概率密度,而非概率。概率的取值范围是0-1,但概率密度可以大于1——只要曲线下方的总面积等于1(代表总概率为1)就符合理论。比如当你的数据高度集中在一个很小的区间时,密度值就会超过1,这是完全正常的。
如果你的需求是让y轴显示范围固定在0-1,或者把密度值缩放到0-1区间,有两种处理方式:
方式1:强制设置y轴范围
直接用matplotlib的ylim函数固定y轴上下限,不管实际密度值:
import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 读取数据部分保持不变 inp1 = open('1BVN_g.txt', 'r') val = [] for line in inp1: a = line.rstrip() val.append(float(a)) val2 = np.array(val) sns.kdeplot(val2, shade=True) plt.ylim(0, 1) # 新增这一行,强制y轴范围0-1 plt.show()
方式2:将密度值归一化到0-1区间
如果需要把密度值本身缩放到0-1(即最大值为1),可以先手动计算KDE的结果,再进行归一化后绘图:
import matplotlib.pyplot as plt import seaborn as sns import numpy as np from scipy.stats import gaussian_kde inp1 = open('1BVN_g.txt', 'r') val = [] for line in inp1: a = line.rstrip() val.append(float(a)) val2 = np.array(val) # 计算KDE kde = gaussian_kde(val2) x = np.linspace(val2.min(), val2.max(), 1000) y = kde(x) # 归一化到0-1 y_normalized = y / y.max() # 绘图 plt.fill_between(x, y_normalized, alpha=0.5) # 对应shade=True的效果 plt.plot(x, y_normalized) plt.show()
注意:第二种方式会改变KDE的原始含义(不再是概率密度),仅适用于需要相对密度对比的场景。
内容的提问来源于stack exchange,提问作者Gargi Biswas
相关产品推荐
相关产品推荐

