如何将异常值(来自箱线图与否)与小提琴图混合?

时间:2021-04-02 01:35:51

标签: python python-3.x matplotlib seaborn

图表。

like this boxplot and violin plot

my violin plot

第一个图是从 https://towardsdatascience.com/violin-plots-explained-fb1d115e023d 中捕获的。第二个是我自己做的。

我在做 python matplotlib 作业时发现了这个要求,因为教授要求我们在小提琴图上突出显示异常值是否存在。

对于我创建的小提琴图,没有 y 值,或者换句话说,即使我使用 python 指挥官而不是 jupyter notebook,y 值也是空的,因为当我在图表上暂停鼠标时,只有 x 值,但 y 值是“y = ”。如果我想绘制圆圈以突出显示异常值,我就没有办法,因为只有 x 值。

此外,我使用 seaborn 库创建了小提琴情节。

有什么解决办法吗?

1 个答案:

答案 0 :(得分:1)

有点不清楚您究竟是如何创建 violinplot。通常,非数字轴为 categorical,内部编号为 0, 1, 2, ...。因此,y 将是 0

Outliers 可以通过多种方式定义,对于标准的 boxplot,胡须在第一和第三四分位数之间距离的 1.5 倍处绘制。

请注意,箱线图“按原样”显示数据,而小提琴图则平滑数据。根据分布情况,它可能给人的印象是数据位于实际上不可能的地方(例如高度的负值)。在特定情况下选择哪一个取决于许多因素,但了解每个因素的局限性很重要。

Seaborn 也有一个 boxenplot,类似于箱线图,但显示了更多的分位数。还有 swarmplot,它绘制所有点,但将它们推开以避免重叠。如果点太多,您可能希望将 swarmplot 限制为一个子集。 swarmplot 也可以与例如结合使用显示额外信息的箱线图。或者代替散点图来显示异常值。

下图将默认箱线图与小提琴图进行比较,以红色和箱线图显示异常值:

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

np.random.seed(553)
data = np.random.randn(6, 500).cumsum(axis=1).ravel()
q1, q3 = np.percentile(data, [25, 75])
whisker_low = q1 - (q3 - q1) * 1.5
whisker_high = q3 + (q3 - q1) * 1.5
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 6), sharex=True)
sns.boxplot(x=data, color='CornflowerBlue', ax=ax1)
sns.violinplot(x=data, color='CornflowerBlue', ax=ax3)
outliers = data[(data > whisker_high) | (data < whisker_low)]
sns.scatterplot(x=outliers, y=0, marker='D', color='crimson', ax=ax3)
sns.boxenplot(x=data, color='CornflowerBlue', ax=ax2)
sns.swarmplot(x=data, color='CornflowerBlue', size=1.5, ax=ax4)
plt.setp((ax1, ax2, ax3, ax4), "yticks", [])
sns.despine(fig, top=True, left=True, right=True)
ax1.tick_params(labelbottom=True)
ax2.tick_params(labelbottom=True)
ax1.set_title('boxplot')
ax2.set_title('boxenplot')
ax3.set_title('violinplot with outliers')
ax4.set_title('swarmplot')
plt.tight_layout()
plt.show()

violinplot with outliers, boxplot, boxenplot, swarmplot