【问题标题】:Python Seaborn Boxplot: Overlay 95 percentile values on whiskerPython Seaborn Boxplot:在晶须上叠加 95 个百分位值
【发布时间】:2023-03-16 13:31:02
【问题描述】:

我想在 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])

【问题讨论】:

标签: python pandas matplotlib visualization seaborn


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2023-03-27
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多