我正在使用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
中取出给我带来麻烦的观察结果,然后将其余部分分开绘制,但这会创建太多额外的代码,使其更难以阅读且编写时间更长,所以我问是否有一个我不知道的简单而优雅的解决方案。
屏蔽有效/无效数据似乎是可行的方法,而且很容易做到。
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)
输出: