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

时间:2015-01-23 17:42:12

标签: python plot statistics 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()

output

到目前为止一切顺利。但是,当我查看foo时,变量不包含任何负值。 seaborn情节在这里似乎有误导性。正常的matplotlib箱图提供了更接近我期望的东西。

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

1 个答案:

答案 0 :(得分:13)

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

然而,在你的回答中,你会问它是否适合"更严格",这可能意味着一些事情。

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

data = np.random.rand(100)
sns.violinplot(y=data, bw=.1)

enter image description here

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

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

enter image description here

顺便说一下,violinplot的API在{0.6}中为going to change,我在这里使用的是开发版本,但bwcut都是参数存在于当前发布的版本中,并且行为大致相同。