Seaborn, как добавить количество образцов на HUE в sns.catplot - PullRequest
0 голосов
/ 21 января 2020

У меня есть чертеж с использованием:

s = sns.catplot(x="type", y="val", hue="Condition", kind='box', data=df)

enter image description here

Однако размер "Condition" для оттенка не равен: синий имеет n = 8 выборок, а зеленый имеет n = 11 выборок.

Каков наилучший способ добавить эту информацию в график?

1 Ответ

0 голосов
/ 22 января 2020

По сути, это то же решение, что и мой более ранний ответ , который я немного упростил, поскольку:

df = sns.load_dataset('tips')
x_col='day'
y_col='total_bill'
order=['Thur','Fri','Sat','Sun']
hue_col='smoker'
hue_order=['Yes','No']
width=0.8


g = sns.catplot(kind="box", x=x_col, y=y_col, order=order, hue=hue_col, hue_order=hue_order, data=df)
ax = g.axes[0,0]

# get the offsets used by boxplot when hue-nesting is used
# https://github.com/mwaskom/seaborn/blob/c73055b2a9d9830c6fbbace07127c370389d04dd/seaborn/categorical.py#L367
n_levels = len(df[hue_col].unique())
each_width = width / n_levels
offsets = np.linspace(0, width - each_width, n_levels)
offsets -= offsets.mean()

pos = [x+o for x in np.arange(len(order)) for o in offsets]

counts = df.groupby([x_col,hue_col])[y_col].size()
counts = counts.reindex(pd.MultiIndex.from_product([order,hue_order]))
medians = df.groupby([x_col,hue_col])[y_col].median()
medians = medians.reindex(pd.MultiIndex.from_product([order,hue_order]))

for p,n,m in zip(pos,counts,medians):
    if not np.isnan(m):
        ax.annotate('N={:.0f}'.format(n), xy=(p, m), xycoords='data', ha='center', va='bottom')

enter image description here

...