微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 seaborn kdeplot (python)

如何解决在 seaborn kdeplot (python)

我正在使用 seaborn 核密度估计来绘制概率密度等高线,如下所示:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

x = np.random.normal(0,3,100)
y = np.random.normal(0,1,100)

fig,ax = plt.subplots()

ax.scatter(x,y,marker='.')

ax.set_aspect('equal')
ax.set(xlim=(-13,13))
ax.set(ylim=(-8,8))


divider = make_axes_locatable(ax)
cax = divider.append_axes("right",size="5%",pad=0.05)

sns.kdeplot(x,fill=True,shade_lowest=True,alpha=0.7,linewidths=3,\
            cmap='coolwarm',ax=ax,cbar=True,cbar_ax = cax)

colour = ax.collections[1].get_facecolor()

结果是:

enter image description here

我正在制作其中的许多作品,因此为了比较它们,我希望固定情节限制。如您所见,我的问题是当我更改情节的限制时,seaborn 不会填充背景。

代码最后一行中的变量 colour 包含我想要填充背景的内容。我需要帮助弄清楚如何做到这一点。我试过了

ax.set_facecolor(colour.reshape(4))

当然需要努力才能达到我想要的:

enter image description here

这个问题本质上与 this 6 年前的问题相同,后者建议只删除最后一个轮廓下方的填充。我相信一定有办法获得所需的行为。我真的很感激任何帮助!

作为奖励:sns.kdeplot() 的 linewidths 参数什么也不做。如何更改等高线的线宽?

解决方法

正如@mwaskom 在评论中所建议的,您可以使用 cut parameter

这可以通过 cut 参数部分避免,它指定 曲线应该超出极端数据点的范围。但 这仅影响绘制曲线的位置;密度估计 仍然会在没有数据存在的范围内平滑,导致它 在分布的极端情况下人为地降低:

我使用反复试验来获得正确的 cut 值,即 12。详情请参考以下代码。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

x = np.random.normal(0,3,100)
y = np.random.normal(0,1,100)

fig,ax = plt.subplots()

ax.scatter(x,y,marker='.')

ax.set_aspect('equal')
ax.set(xlim=(-13,13))
ax.set(ylim=(-8,8))


divider = make_axes_locatable(ax)
cax = divider.append_axes("right",size="5%",pad=0.05)

sns.kdeplot(x,fill=True,thresh=0,alpha=0.7,cmap='coolwarm',ax=ax,cbar=True,cbar_ax = cax,cut=12) # `shade_lowest` is now deprecated in favor of `thresh`
colour = ax.collections[1].get_facecolor()

输出图像:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。