2D核密度图的主要差异:Seaborn和R

时间:2015-09-04 21:01:29

标签: python r seaborn kernel-density

我正在尝试使用Seaborn联合绘图功能的2D核密度图绘制数据(使用statsmodels&KDEM多变量函数来计算数据驱动的带宽)。我使用相同的数据在R中绘制了2D内核密度,结果非常好(使用' ks'包),而Seaborn图看起来非常不同。

我使用相同的精确数据和相同的精确带宽(采用KDEM多变量给出的带宽并将其传递给R方法)。

以下是使用的input.csv数据:https://app.box.com/s/ot7d36t44wrr85pusp5657pc1w2kf5hj

下面是每个代码中使用的代码以及每个代码的输出图像。

Python / Seaborn:

import matplotlib.pyplot as plt
import statsmodels.api as sm
data = pd.read_csv("input.csv", dtype={'x': float, 'y': float}, skiprows=0)
bw_ml_x = sm.nonparametric.KDEMultivariate(data=data['x'], var_type='c', bw='cv_ml')
bw_ml_y = sm.nonparametric.KDEMultivariate(data=data['y'], var_type='c', bw='cv_ml')        

g = sns.jointplot(x='x', y='y', data=data, kind="kde", stat_func=None, bw=[bw_ml_x.bw, bw_ml_y.bw])

g.plot_joint(plt.scatter, c="w")
g.ax_joint.collections[0].set_alpha(0)

sns.plt.show()

Img for Seaborn plot:

bw_ml_x.bw和bw_ml_y.bw给出的带宽放在2 x 2 R矩阵H中,其中H [1,1] = bw_ml_x.bw,H [2,2] = bw_ml.y.bw,和其他值设置为零。

R:

library(ks)
fhat <- kde(x=as.data.frame(data[1], data[2]), H=H)
plot(fhat, display="filled.contour2", cont=seq(10,90,by=10))

Img for R plot:

1 个答案:

答案 0 :(得分:1)

查看您的Seaborn / Python图,许多点沿着您的空间的(0,n)区域和(1,1)区域聚类,就像R图的KDE所示。这表明Seaborn和R正在查看相同的数据;我们只需要重新调整Seaborn中addNumber()的调用,以便可视化KDE渐变。

如果您修改Python调用以匹配Seaborn中kde的{​​{1}},您将从Python中获得正确的2d-kdf:

Kernel Density Estimation

documentation

这符合R图(虽然核估计量似乎略有不同,这可以解释图之间梯度的变化):

enter image description here