Python中StatsModels核密度图:横轴实际测量的是什么?
核密度图横轴异常的问题解析
嘿,我一眼就看出问题大概率出在你的代码没跑完——你写的dens.f...应该是要调用dens.fit()吧?这一步可是statsmodels里核密度估计的关键步骤,漏掉它的话,后续绘图肯定会出问题!
先给你理清楚:你生成的100个观测值是标准正态分布,范围在-2.157到2.830之间,正常拟合后的核密度图横轴确实应该围绕-3到3这个区间。但你看到的0到500横轴,根本不是你的数据对应的变量值,而是matplotlib在没有有效绘图数据时默认生成的空轴范围。
为什么会这样?因为你没有调用dens.fit()来让模型计算核密度估计的结果。没拟合的话,dens对象里根本没存储对应的数据点和密度值,此时调用plot(),matplotlib只能给你一个空画布,用默认的0-500作为横轴范围充数。
给你贴一段完整的正确代码,照着跑就能得到你预期的图:
import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt np.random.seed(1234567) k = np.random.normal(0, 1, 100) dens = sm.nonparametric.KDEUnivariate(k) dens.fit() # 这一步绝对不能省! plt.figure(figsize=(8, 4)) dens.plot() # 手动设置横轴范围,和你预期的-3到3匹配 plt.xlim(-3, 3) plt.title('Kernel Density Estimate of Your Normal Data') plt.xlabel('Observed Value') plt.ylabel('Density') plt.show()
补充说下:当你调用dens.fit()后,dens.support会存储核密度估计对应的横轴点(默认会稍微扩展数据的范围),dens.density是对应的密度值,此时绘图就会基于这些真实数据来生成横轴了。如果之后你还是遇到横轴范围不对的情况,检查下是不是手动设置了plt.xlim(0, 500)这类代码,不小心覆盖了默认的轴范围。
内容的提问来源于stack exchange,提问作者Spring




