【问题标题】:Major Difference in 2D kernel Density Plots: Seaborn and R2D 核密度图的主要区别:Seaborn 和 R
【发布时间】:2015-12-01 02:42:42
【问题描述】:

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

我为每个使用相同的确切数据和相同的确切带宽(获取 KDEMultivariant 给出的带宽并将其传递给 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()

Seaborn 绘图的 Img:

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

R 绘图的 Img:

【问题讨论】:

  • 使用简单的正态分布随机数据,在指定带宽时,我无法重现 jointplot 的任何令人惊讶的行为。我认为您需要发布您的数据集或找到一种方法来生成一些随机数据来重现您的问题。
  • 话虽如此,我不确定高斯 KDE 是否是您数据的最佳模型。它看起来很明显不是高斯的。
  • @mwaskom 添加了 input.csv 文件以使结果可重现。
  • 奇怪,与 API 相比,您的 seaborn 输出似乎错误。
  • 感谢这些 sn-ps;我一直在寻找 2d KDE 库,他们来了!

标签: python r seaborn kernel-density


【解决方案1】:

查看您的 Seaborn/Python 图,许多点沿着您空间的 (0,n) 区域和 (1,1) 区域聚集,正如 R 图的 KDE 所示。这表明 Seaborn 和 R 正在查看相同的数据;我们只需要在 Seaborn 中重新定义对 kde 的调用,以便可视化 KDE 梯度。

如果您修改您的 Python 调用以匹配 Seaborn 中的 Kernel Density Estimationdocumentation,您将从 Python 中获得正确的 2d-kdf:

import matplotlib.pyplot as plt
import statsmodels.api as sm
import pandas as pd
import seaborn as sns

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

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

sns.plt.show()

这与 R 图一致(尽管核估计量似乎略有不同,这将解释图之间梯度的变化):

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2013-12-05
    • 2018-06-30
    • 2019-07-10
    • 1970-01-01
    • 2015-09-12
    • 2019-06-15
    • 2017-03-06
    相关资源
    最近更新 更多