Как основать усы морского ежа на процентилях? - PullRequest
0 голосов
/ 27 мая 2018

Я использую коробочную диаграмму, чтобы показать различия в распределении значений между группами.Более низкий (25) и более высокий (75) процентили и медиана указывают на распределение и основные различия между группами.Усы, однако, менее ясны.По умолчанию в matlibplot или seaborn усы боксплота представляют собой кратное (по умолчанию: 1.5) диапазон внутренней четверти (IQR), который представляет собой диапазон значений, охватываемых внутренним блоком.Точки за пределами этого диапазона будут определены как выбросы.И 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.Сейчас я ищу способ определения усов в Сиборне на основе процентилей.

Моей первой идеей было получить значения усов из 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 голосов
/ 28 мая 2018

В этом отношении 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

Я полагаю, что морская волна просто передаст whis методу matplotlibСтрока документации могла быть скопирована из более ранней версии matplotlib.

...