【发布时间】: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