如何基于百分位数设置seaborn箱线图的须?

11

我正在使用箱线图展示不同组之间值的分布差异。下四分位数(25)和上四分位数(75)以及中位数表明了分布情况和各组之间的主要差异。然而,连线长度就不那么清晰了。在matlibplot或seaborn中,默认情况下,箱线图的连线长度是内部箱子所覆盖的内四分位距(IQR)的倍数(默认为1.5),其范围内的点将被视为异常值。 Seaborn和Matplotlib都有相同的命令来更改连线的位置:

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.
例如:

For example:

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

此外,matlibplot还允许基于百分位数确定箱线图的须。这对我试图通过数据讲述自己的故事更为有效。例如:

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

与matlibplot不同,whis=[5, 95]在Seaborn中不起作用。现在我正在寻找一种基于百分位数定义Seaborn中whiskers的方法。

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

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个回答

17

在这方面,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方法。文档字符串可能是从较早版本的matplotlib复制而来的。


2
非常感谢您为我尝试!起初,我在Seaborn中尝试了whis = [5, 95],但它对我没有起作用。事实上,它对您起作用的事实促使我更新了我的anaconda,因为我可能正在运行旧版本的软件包。之后,Seaborn基于百分位数的箱线图须也对我起作用了。 - Hauzero
有没有办法以更多的百分位数(如whis=[1,5,10,25,75,90,95,99])标记箱线图上的须部分?我想通过箱线图在可视化上标记这些点。这些是我选择的百分位数,而不仅仅是5和95。如果这种特定的方式不可行,是否还有其他方法?我听说过箱线图的改进版本,但它能否使用百分位数,而不是每次减半? - undefined

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