如何停止小提琴图截断异常值或极端值

4
我左边有一张Seaborn小提琴图,右边是Matplotlib。
如您所见,即使showextrema设置为True或False,Matplotlib仍会移除某些值/数据,没有任何效果。我该如何使用Matplotlib的小提琴图来保留这些值?
import matplotlib.pyplot as plt
import seaborn as sns

a = [195.0, 245.0, 142.0, 237.0, 153.0, 238.0, 168.0, 145.0, 229.0, 138.0, 176.0, 116.0, 252.0, 148.0, 199.0, 162.0, 134.0, 163.0, 130.0, 339.0, 152.0, 208.0, 152.0, 192.0, 163.0, 249.0, 113.0, 176.0, 123.0, 189.0, 150.0, 207.0, 184.0, 153.0, 228.0, 153.0, 170.0, 118.0, 302.0, 197.0, 211.0, 159.0, 228.0, 147.0, 166.0, 156.0, 167.0, 147.0, 126.0, 155.0, 138.0, 159.0, 139.0, 111.0, 133.0, 134.0, 131.0, 156.0, 240.0, 207.0, 150.0, 207.0, 265.0, 151.0, 173.0, 157.0, 261.0, 186.0, 195.0, 158.0, 272.0, 134.0, 221.0, 131.0, 252.0, 148.0, 178.0, 206.0, 146.0, 217.0, 159.0, 190.0, 156.0, 172.0, 159.0, 141.0, 167.0, 168.0, 218.0, 191.0, 207.0, 164.0]

fig, axes = plt.subplots()

# Seaborn violin plot
sns.violinplot(data=a, width=0.6, color="w" )

# Matplotlib violin plot
axes.violinplot(a, showmeans=True, showmedians=False, showextrema=False, widths = 0.6)
axes.set_xticks([y+1 for y in range(2)])
plt.show()

enter image description here


列表中的最小值为111。你为什么期望图表下降到比这更低的位置?或者你为什么声称数据已被删除? - ImportanceOfBeingErnest
@ImportanceOfBeingErnest 是的,没错。我应该澄清一下为什么核密度估计被截断了。我怎样才能让它外推呢? - Anderson
1个回答

6
在matplotlib的小提琴图中,KDE绘制的范围是输入值的范围。这在代码中定义得很深,因此没有简单的选项可以更改它。
相比之下,seaborn的小提琴图允许对KDE范围进行良好的控制。默认情况下,它会将显示的KDE曲线沿绘图的每一侧扩展两倍的KDE带宽。这由的cut参数控制,默认为2。如果你设置cut=0,你将获得与matplotlib小提琴图相同的效果。结合手动选择浮点数作为KDE带宽的选项,sns.violinplot(..., bw = 0.2, cut=2),你可以非常好地控制小提琴图的显示方式。
总之,如果你需要对KDE曲线的范围进行精细的控制,请使用seaborn小提琴图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接