Проблема с наложением дополнительных процентильных маркеров на боксерский участок сиборна - PullRequest
1 голос
/ 27 мая 2019

Я хочу нанести дополнительные маркеры на коробочный график, чтобы показать 95-й и 5-й процентили.Я хочу, чтобы усы показывали 90-й и 10-й процентили, которые, как я полагаю, я могу сделать с whis = [10,95]

Чтобы проверить, что это работает правильно, я установил и мои маркеры, и мои усы на 5 и 95.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

assay=pd.read_csv('df.csv')

#obtain percentiles of interest
pcntls=assay.groupby(['STRAT']).describe(percentiles=[0.05,0.95])
sumry= pcntls['Total'].T



#plot boxplot (with whiskers set to 5 and 95 as well to check)
ax=sns.boxplot(x=assay['STRAT'],y=assay["Total"], whis=[5,95],data=assay, showfliers=False,color='lightblue', 
            showmeans=True,meanprops={"marker":"s","markersize":10,"markerfacecolor":"white", "markeredgecolor":"grey"})
plt.axhline(0.30, color='green',linestyle='dashed', label="0.3% S")
#ax.set_yscale('log')
leg= plt.legend()
plt.title("Assay data")


#overlay additional percentile points ( same as whiskers to check)
ax.scatter(x=list(sumry.columns.values),y=sumry.loc['5%'])
ax.scatter(x=list(sumry.columns.values),y=sumry.loc['95%'])

Что дает мне:

Маркеры, расположенные дальше всего вправо, имеют неправильно нанесенные маркеры (маркеры должны бытьпри тех же значениях y, что и усы), порядок рядов данных, по-видимому, имеет обратный характер;но, с другой стороны, процентили не совпадают, усы и маркеры не совпадают, даже если применяется правильная последовательность.Есть идеи что не так и как это исправить?

Данные ниже.

From    To  Interval (m)    Class   STRAT   Total
308 309 1   PAF CBC 4.15
309 310 1   PAF CBC 3.76
320 321 1   PAF-LC  CBC 0.85
330 331 1   PAF-LC  CBC 0.698
342 343 1   NAF LBB 0.259
376 377 1   NAF LBB 0.395
412 413 1   PAF-LC  LBB 1.19
51  52  1   PAF UBB 0.1
420 420.5   0.5 PAF-LC  UAB 1
189 190 1   PAF LBB 1.52
520 521 1   NAF UAB 3
632 633 1   NAF UAB 0.0615
644 645 1   NAF-AC  UAB 0.178
308 309 1   PAF CBC 4.15
309 310 1   PAF CBC 3.76
320 321 1   PAF-LC  CBC 0.85
330 331 1   PAF-LC  CBC 0.698
342 343 1   NAF-AC  LBB 0.259
376 377 1   NAF-AC  LBB 0.395
412 413 1   PAF-LC  LBB 1.19
51  52  1   PAF UBB 2.27
420 420.5   0.5 PAF-LC  UAB 1
189 190 1   PAF LBB 1.52
520 521 1   NAF-AC  UAB 1
632 633 1   NAF-AC  UAB 0.0615
644 645 1   NAF-AC  UAB 0.178
308 309 1   PAF CBC 4.15
309 310 1   PAF CBC 3.76
320 321 1   PAF-LC  CBC 0.85
330 331 1   PAF-LC  CBC 0.698
342 343 1   NAF-AC  LBB 0.259
376 377 1   NAF-AC  LBB 0.395
412 413 1   PAF-LC  LBB 1.19
51  52  1   PAF UBB 2.27
420 420.5   0.5 PAF-LC  UAB 0.002
189 190 1   PAF LBB 1.52
520 521 1   NAF-HS  UAB 1.45
632 633 1   NAF-HS  UAB 0.0615
644 645 1   NAF-HS  UAB 0.178
308 309 1   PAF CBC 4.15
309 310 1   PAF CBC 3.76
320 321 1   PAF-LC  CBC 0.85
330 331 1   PAF-LC  CBC 0.698
342 343 1   NAF-HS  LBB 0.259
376 377 1   NAF-HS  LBB 0.395
412 413 1   PAF-LC  LBB 1.19
51  52  1   PAF UBB 3
420 420.5   0.5 PAF-LC  UAB 1
189 190 1   PAF LBB 1.52
520 521 1   NAF-HS  UAB 1.45
632 633 1   NAF-HS  UAB 0.0615
644 645 1   NAF-HS  UAB 0.178
51  52  1   PAF UBB 0.1
51  52  1   PAF UBB 0.2
51  52  1   PAF UBB 2.27
51  52  1   PAF UBB 3

1 Ответ

1 голос
/ 27 мая 2019

Просто отсортируйте данные по коробочному графику, используя:

ordered=sorted(assay['STRAT'].unique())

и сделайте то же самое для данных процентили:

ax.scatter(x=sorted(list(sumry.columns.values)),y=sumry.loc['5%'])
ax.scatter(x=sorted(list(sumry.columns.values)),y=sumry.loc['95%'])

плюс некоторые линии сетки, получив:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

assay=pd.read_csv('df.csv')

#obtain percentiles of interest
pcntls=assay.groupby(['STRAT']).describe(percentiles=[0.05,0.95])
sumry= pcntls['Total'].T

ordered=sorted(assay['STRAT'].unique())

#plot boxplot (with whiskers set to 5 and 95 as well to check)
ax=sns.boxplot(x=assay['STRAT'],y=assay["Total"], order=ordered,whis=[5,95],data=assay, showfliers=False,color='lightblue', 
            showmeans=True,meanprops={"marker":"s","markersize":10,"markerfacecolor":"white", "markeredgecolor":"grey"})
plt.axhline(0.30, color='green',linestyle='dashed', label="0.3% S")
#ax.set_yscale('log')
leg= plt.legend()
plt.title("Assay data")

plt.grid(True, which='both')

#overlay additional percentile points ( same as whiskers to check)
ax.scatter(x=sorted(list(sumry.columns.values)),y=sumry.loc['5%'])
ax.scatter(x=sorted(list(sumry.columns.values)),y=sumry.loc['95%'])

приводит к правильному порядку вывода, но существует расхождение с вычислением 95-го процентиля для UAB, вероятно, из-за нескольких методов и небольшого набора данных.например, здесь enter image description here

...