如何将seaborn boxplot胡须基于百分位数?

时间:2018-05-27 16:30:23

标签: python matplotlib seaborn boxplot

我正在使用箱线图来显示组之间值的分布差异。较低(25)和较高(75)百分位数和中位数表示群体之间的分布和主要差异。然而,胡须不太清楚。默认情况下,在matlibplot或seaborn中,boxplot的胡须表示内部四分位数(IQR)的倍数(默认值:1.5),它是内部框所覆盖的值的范围。超出此范围的点将被识别为异常值。 seaborn和matlibplot都有相同的命令来改变胡须的位置:

whis : float, 
Proportion of the IQR past the low and high quartiles to extend the plot whiskers.Points outside this range will be identified as outliers.

例如:

boxplots = ax.boxplot(myData, whis=1.5)

或者,matlibplot还允许将胡须基于百分位数。这对我试图用我的数据讲述的故事更有效。例如:

boxplots = ax.boxplot(myData, whis=[5, 95])

与matlibplot相比,whis=[5, 95]在Seaborn中不起作用。现在我正在寻找基于百分位数来定义Seaborn中胡须的方法。

我的第一个想法是根据百分位数从matlibplot获取晶须的值,并找到相应的比例IQR晶须值。这就是我所做的:

for w in np.arange(0.00,2.00, 0.01):    
        fig, ax = plt.subplots(ncols=2, nrows=1,figsize=(8, 6))
        bp = ax[0].boxplot(myData, whis=[5, 95])
        ax[0].set_xlabel('bp')
        ap = ax[1].boxplot(myData, whis=w)
        ax[1].set_xlabel('ap')

        r = 3

        alo =  (np.round(bp['whiskers'][0].get_ydata(), r))
        blo =  (np.round(ap['whiskers'][0].get_ydata(), r))
        ahi =  (np.round(bp['whiskers'][1].get_ydata(), r))
        bhi =  (np.round(ap['whiskers'][1].get_ydata(), r))

        plt.close()

        if [alo == blo] == [True, True]:
            if [ahi == bhi] == [True, True]:
                print w, "|", alo[1], "=", blo[1], '&', ahi[1], "=", bhi[1]

但问题是,这仅适用于我的数据不符合的完全正态分布。因此,我真的想找到一种方法,在Seaborn箱图中使用百分位数作为胡须。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:5)

在这方面,Seaborn似乎和matplotlib一样:

tips = sns.load_dataset("tips")
ax = sns.boxplot(x=tips["total_bill"], whis=[5, 95])
plt.grid(True)

Seaborn boxplot

plt.boxplot(tips["total_bill"], whis=[5, 95], vert=False)
plt.grid(True)

enter image description here

我猜seaborn只是将whis传递给了matplotlib方法。 docstring可能是从早期版本的matplotlib中复制的。