Python 如何更好地适应seaborn violinplots?

Python 如何更好地适应seaborn violinplots?,python,plot,statistics,seaborn,Python,Plot,Statistics,Seaborn,下面的代码为我提供了一个非常好的violinplot(以及其中的boxplot) 到目前为止还不错。但是,当我查看foo时,该变量不包含任何负值。这里的seaborn情节似乎有误导性。正常的matplotlib箱线图提供了更接近我预期的内容 如何才能使violinplots更适合(不显示假负值)?如评论所述,这是基于高斯KDE假设的结果(我不确定我会称之为“人工制品”)。如前所述,这在某种程度上是不可避免的,如果您的数据不符合这些假设,您最好只使用箱线图,它只显示实际数据中存在的点 然而,在你

下面的代码为我提供了一个非常好的violinplot(以及其中的boxplot)

到目前为止还不错。但是,当我查看
foo
时,该变量不包含任何负值。这里的
seaborn
情节似乎有误导性。正常的matplotlib箱线图提供了更接近我预期的内容


如何才能使violinplots更适合(不显示假负值)?

如评论所述,这是基于高斯KDE假设的结果(我不确定我会称之为“人工制品”)。如前所述,这在某种程度上是不可避免的,如果您的数据不符合这些假设,您最好只使用箱线图,它只显示实际数据中存在的点

然而,在你的回答中,你会问它是否适合“更紧”,这可能意味着一些事情

一个答案可能是更改平滑内核的带宽。您可以使用
bw
参数来实现这一点,它实际上是一个比例因子;将使用的带宽是
bw*data.std()

另一个答案可能是在数据点的极端截断小提琴。KDE仍然适合超出数据边界的密度,但不会显示尾部。您可以使用
cut
参数来实现这一点,该参数指定应该绘制的超过密度极值的带宽单位。若要截断,请将其设置为0:

sns.violinplot(y=data, cut=0)


顺便说一句,
violinplot
的API是0.6版本,我在这里使用的是开发版本,但是
bw
cut
参数都存在于当前发布的版本中,它们的行为或多或少是相同的。

好吧,这可能不太容易。这是KDE的人工制品,它不知道在0处有一个硬边界。如果您对该问题感兴趣,请参阅:@cel谢谢。我就是这么想的。但它不能更紧密地拟合吗?有算法可以做到这一点。在这个答案中可以看到令人印象深刻的结果:。但是我还没有在python中看到它。我不喜欢使用
cut
的解决方案。它隐藏了这样一个事实,
KDE
不能正确地适应这样的密度。接近边界0的密度是误导性的,因为即使相应的直方图最大值为0,您也会得到这样的密度估计。请参阅处的功能请求(等待statsmodels中的上游更改)。
data = np.random.rand(100)
sns.violinplot(y=data, bw=.1)
sns.violinplot(y=data, cut=0)