首页 > 解决方案 > 如何将中位数、四分位数信息与箱线图对齐

问题描述

我正在创建一个箱线图并想要中位数和分位数的标签。我还指定了我希望绘图显示的顺序。该图按特定顺序显示,但中位数和分位数信息不显示。

我已在其他箱形图上成功使用此代码,使用不同的列名,但它不适用于这些特定的列

a4_dims = (11.7, 8.27)
fig, ax = plt.subplots(figsize=a4_dims)
sns.boxplot(x='2017Seg', y='AbsYr1Dif', data=yr1, width=.7, showfliers=False,
           order=["<10","10-19","20-49","50-99","100-249","250+"])

medians = yr1.groupby(['2017Seg'])['AbsYr1Dif'].median().values
median_labels = [str(np.round(s, 2)) for s in medians]

pos = range(len(medians))
for tick,label in zip(pos,ax.get_xticklabels()):
    ax.text(pos[tick], medians[tick] + 0.02, median_labels[tick], 
            horizontalalignment='center', size='small', color='w', weight='semibold')

    upperquart = yr1.groupby(['2017Seg'])['AbsYr1Dif'].quantile(.75).values
upperquart_labels = [str(np.round(s, 2)) for s in upperquart]

pos = range(len(upperquart))
for tick,label in zip(pos,ax.get_xticklabels()):
    ax.text(pos[tick], upperquart[tick] + 0.02, upperquart_labels[tick], 
            horizontalalignment='left', size='small', color='b', weight='semibold')

lowerquart = yr1.groupby(['2017Seg'])['AbsYr1Dif'].quantile(.25).values
lowerquart_labels = [str(np.round(s, 2)) for s in lowerquart]

pos = range(len(lowerquart))
for tick,label in zip(pos,ax.get_xticklabels()):
    ax.text(pos[tick], lowerquart[tick] - 0.05, lowerquart_labels[tick], 
            horizontalalignment='right', size='small', color='b', weight='semibold')

无法使用截图工具。

中位数和分位数信息出现的顺序是在箱线图定义上使用 sort 之前的自然排序顺序

不工作的数据样本:

数据样本不起作用

有效的数据样本:

以前工作的示例数据

箱线图不起作用 - 中位数/分位数乱序

箱线图不起作用 - 中位数/分位数乱序

标签: matplotlibseaborn

解决方案


推荐阅读