如何更好地适应seaborn小提琴情节?

n10*_*000 12 python statistics plot seaborn

下面的代码给了我一个非常好的小提琴图(和内部的boxplot).

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

foo = np.random.rand(100)
sns.violinplot(foo)
plt.boxplot(foo)
plt.show()
Run Code Online (Sandbox Code Playgroud)

产量

到现在为止还挺好.但是,当我查看时foo,变量不包含任何负值.该seaborn地块似乎这里误导.正常的matplotlib箱图提供了更接近我期望的东西.

如何制作更合适的小提琴曲线(不显示假阴性值)?

mwa*_*kom 14

正如评论所指出的,这是高斯KDE背后假设的结果(我不确定我称之为"工件").正如已经提到的,这有点不可避免,如果您的数据不符合这些假设,您可能最好只使用箱图,它只显示实际数据中存在的点.

但是,在你的回答中,你会问它是否适合"更紧",这可能意味着一些事情.

一个答案可能是改变平滑内核的带宽.你用bw参数做到了,这实际上是一个比例因子; 将使用的带宽是bw * data.std():

data = np.random.rand(100)
sns.violinplot(y=data, bw=.1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

sns.violinplot(y=data, cut=0)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

顺便说一句,对于API violinplot不会改变的0.6,我在这里使用的开发版本,但无论是bwcut当前发布的版本中存在的参数和行为或多或少相同的方式.