如何为Seaborn绘制的箱线图添加四分位数与中位数标签
Seaborn箱线图添加四分位数、中位数数值标签实现方案
核心实现思路:
- 先按箱线图的分组维度计算箱线对应的五数概括(最小值、25%分位数Q1、中位数、75%分位数Q3、最大值),统计结果的分组顺序要和图上实际展示的分组顺序完全对齐
- 遍历每个分组对应的坐标轴位置,将统计数值标注到箱线对应点位上,通过小幅度偏移避免文字和箱线元素重叠
完整可运行代码如下:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd sns.set_style("whitegrid") tips = sns.load_dataset("tips") plt.figure(figsize=(20,8)) box_plot = sns.boxplot(x="total_bill", y="day", orient='h', data=tips) # 获取图上实际展示的y轴分组顺序,避免标签错位 group_order = [tick.get_text() for tick in box_plot.get_yticklabels()] # 按分组计算需要的分位数统计值 group_stats = tips.groupby("day")["total_bill"].describe(percentiles=[0.25, 0.5, 0.75]).loc[group_order] # 遍历每个分组添加数值标签 for y_pos, (_, stats_row) in enumerate(group_stats.iterrows()): # 配置每个统计值的标注位置偏移,可根据视觉效果调整 label_items = [ (stats_row["min"], -0.2), (stats_row["25%"], 0.12), (stats_row["50%"], 0.12), (stats_row["75%"], 0.12), (stats_row["max"], 0.12) ] for val, x_offset in label_items: box_plot.text( x=val + x_offset, y=y_pos, s=f"{val:.1f}", va="center", fontsize=10, color="#2d2d2d" ) plt.tight_layout() plt.show()
关键注意事项:
- 如果绘制纵向箱线图,只需互换标注逻辑里的x、y坐标,调整偏移方向即可
- 代码中的偏移量、字体大小、数值保留小数位数都可以根据图的尺寸、数值范围灵活调整,保证标签清晰不重叠
- 不要硬编码分组顺序,必须通过坐标轴刻度获取当前实际展示的分组顺序,否则容易出现标签和箱线错位的问题
实现效果参考:
内容的提问来源于stack exchange,提问作者mikelowry
相关产品推荐
相关产品推荐

