我想在seaborn箱图上覆盖95%的值。我无法弄清楚叠加文字的方式,或者是否具备这种能力。我将如何修改以下代码以覆盖图上的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])

最佳答案

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

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()


python - Python Seaborn Boxplot:在晶须上覆盖95%的值-LMLPHP

10-06 00:01
查看更多