当seaborn箱线图的观察次数太少时,如何避免绘制箱线?

问题描述 投票:0回答:1

我正在使用seaborn箱线图来绘制一堆框,这些框表示当改变范围从0到30的变量时的一些错误。当该变量较低时,例如0、1或2,我有很多观察结果来制作框,但对于 17 到 29 之间的值,我的观测值少于 4 个,因此我认为绘制一个框是不合适的,这在第 29 个框中更为臭名昭著,它只有一个观测值,使得该框变得异常薄,或者在某些情况下在只有两个观察结果的情况下,画胡须似乎简直是荒谬的。

我希望seaborn将这些情况下的观察结果绘制成传单。 也就是说:如果观察数量低于某个阈值,请将其绘制为传单而不是方框。

我只会包含一小部分代码以使其可读,因为我下面显示的绘图的代码相当长。

sns.boxplot(data=data, x=days, y=error, ax=ax[1, 1], color='powderblue', width=0.7)

哪里

data
看起来像这样:

错误
-1 2
1 0
1 0
8 2
-1 2
-15 24
-1 19
-21 24
1 2
-2 1
8 0
-15 1
2 0
-8 1
3 0

因此,我们希望绘制第 0、1 和 2 天的箱线图,其中有两个以上的观测值,但对于只有 1 和 2 个观测值的 19 和 24 天,将它们绘制为传单。

剧情是 这个。 顶部的条形图显示了每个箱中的观测值数量,如前所述。

我可以尝试将它们分开绘制,例如从

data
中取出给我带来麻烦的观察结果,然后将其余部分分开绘制,但这会创建太多额外的代码,使其更难以阅读且编写时间更长,所以我问是否有一个我不知道的简单而优雅的解决方案。

python charts seaborn boxplot
1个回答
0
投票

屏蔽有效/无效数据似乎是可行的方法,而且很容易做到。

您可以组合

boxplot
stripplot
:

def semi_boxplot(data, x, y, thresh=3, **kwargs):
    m = data.groupby(x).transform('size').ge(thresh)
    ax = sns.boxplot(x=data[x], y=data[y].where(m), **kwargs)
    sns.stripplot(x=data[x], y=data[y].mask(m), edgecolor='grey', color='none', linewidth=1, size=6, ax=ax)
    return ax

semi_boxplot(data, x='days', y='error', zorder=2, color='powderblue', width=0.7)

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.