Python Seaborn Boxplot:在胡须上叠加95百分位值

时间:2018-06-15 16:47:10

标签: python pandas matplotlib visualization seaborn

我想在seaborn boxplot上覆盖95百分位数值。我无法弄清楚覆盖文本的方法,或者是否有seaborn功能。如何修改以下代码以覆盖绘图上的95百分位值。

import pandas as pd
import numpy as np
import seaborn as sns
df = pd.DataFrame(np.random.randn(200, 4), columns=list('ABCD'))*100
alphabet = list('AB')
df['Gr'] = np.random.choice(np.array(alphabet, dtype="|S1"), df.shape[0])
df_long = pd.melt(df, id_vars=['Gr'], value_vars = ['A','B','C','D'])
sns.boxplot(x = "variable", y="value", hue = 'Gr',  data=df_long, whis = [5,95])

1 个答案:

答案 0 :(得分:1)

考虑seaborn的plot.text,借用@bernie's answer(也包括样本数据集的健康+1)。唯一的挑战是调整由于 hue 字段中的分组而导致的对齐,以使标签覆盖在每个boxplot系列上。甚至还有根据系列颜色编码的标签。

import pandas as pd
import numpy as np
import seaborn as sns

np.random.seed(61518)
# ... same as OP

# 95TH PERCENTILE SERIES
pctl95 = df_long.groupby(['variable', 'Gr'])['value'].quantile(0.95)
pctl95_labels = [str(np.round(s, 2)) for s in pctl95]

# GROUP INDEX TUPLES
grps = [(i, 2*i, 2*i+1) for i in range(4)]
# [(0,0,1), (1,2,3), (2,4,5), (3,6,7)]

pos = range(len(pctl95))

# ADJUST HORIZONTAL ALIGNMENT WITH MORE SERIES
for tick, label in zip(grps, hplot.get_xticklabels()):
    hplot.text(tick[0]-0.1, pctl95[tick[1]] + 0.95, pctl95_labels[tick[1]], 
               ha='center', size='x-small', color='b', weight='semibold')

    hplot.text(tick[0]+0.1, pctl95[tick[2]] + 0.95, pctl95_labels[tick[2]], 
               ha='center', size='x-small', color='g', weight='semibold')
sns.plt.show()

Plot Output