是否可以使用非高斯核来处理seaborn关节图中的两个横向分布

时间:2016-04-29 08:30:16

标签: python matplotlib seaborn kernel-density

我的数据如下:

s1 = sns.jointplot(data.columns[i], 
data.columns[j], 
data=data, 
space=0, color="b", stat_func=None)

enter image description here

如果我使用kde而不是

s1 = sns.jointplot(data.columns[i], 
    data.columns[j], 
    data=data, kind = 'kde',
    space=0, color="b", stat_func=None)

我很满意二维kde插值,而不是横向插值。问题是如此紧密地放在一起实际上表明分布的最大值位于两个不同的点,这可能是非常误导的。

enter image description here

现在真正的问题是:是否有可能为两个横向分布指定与高斯不同的内核(蓝色)? (我知道高斯是2D中的唯一选择)。因为例如' biw' (绿色)可能在美学上看起来更好(我仍然不相信在数学上讲,将不同内核完成的插值放在一起使它们看起来是一样的好事......)。所以我的问题是我是否可以在sns.jointplot中的某处指定不同的内核,或者是在另一个时刻计算的另一个人覆盖横向分布的唯一方法。

ax1 = sns.distplot(data[data.columns[j]])
sns.kdeplot(data[data.columns[j]], kernel= 'biw', ax = ax1)

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以为边缘图设置不同的内核:

s1 = sns.jointplot(data.columns[i], 
                   data.columns[j], 
                   data=data, kind = 'kde',
                   space=0, color="b", stat_func=None,
                   marginal_kws={"kernel":"biw"})  # like this

或者,如果您只想更改一个边缘图,您可以重新绘制它们:

s1.ax_marg_y.cla() # clear axis
sns.kdeplot(data.y, ax=s1.ax_marg_y, # choose the ax
            kernel="biw", # choose your kernel
            legend=0, # remove the legend
            vertical=True) # swap axis

vertical=True允许您切换x和y轴,即如果更改上边距图则不需要。