You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Seaborn箱线图获取各类统计数值及异常值?

获取Seaborn箱线图的统计数值

其实Seaborn本身并没有提供直接从绘制好的箱线图对象里提取最小值、四分位数、中位数、最大值和异常值的专属函数——因为Seaborn本质是基于Matplotlib的可视化工具,它的箱线图统计计算逻辑其实是依赖于Pandas或NumPy这类数据处理库实现的。

下面给你两种靠谱的解决方式,优先推荐第一种:

方式一:直接用原始数据计算(最推荐)

既然你已经有了用来绘制箱线图的数据,直接对原始数据做统计计算是最准确、高效的方式,完全不需要依赖绘图对象。

举个实际例子,假设你用tips数据集绘制了箱线图:

import seaborn as sns
import pandas as pd

# 加载示例数据
df = sns.load_dataset('tips')
# 绘制箱线图
ax = sns.boxplot(x='total_bill', data=df)

1. 获取五数概括(最小值、Q1、中位数、Q3、最大值)

用Pandas的quantile方法可以直接指定分位数获取:

# 计算五数概括
five_number_summary = df['total_bill'].quantile([0, 0.25, 0.5, 0.75, 1])
print(five_number_summary)

输出会是类似这样的结果:

0.00     3.07
0.25    13.34
0.50    17.79
0.75    24.12
1.00    50.81
Name: total_bill, dtype: float64

如果你想快速查看所有列的统计信息,也可以用df.describe(),它会包含这些分位数和均值、标准差等信息。

2. 提取异常值

箱线图的异常值定义是落在Q1 - 1.5*IQR到Q3 + 1.5*IQR范围之外的数据,我们可以用布尔索引筛选:

q1 = five_number_summary[0.25]
q3 = five_number_summary[0.75]
iqr = q3 - q1

# 计算异常值的上下边界
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr

# 筛选出异常值
outliers = df[(df['total_bill'] < lower_bound) | (df['total_bill'] > upper_bound)]['total_bill']
print(outliers)

方式二:从Matplotlib轴对象中提取(不推荐)

如果你坚持想从已经绘制好的箱线图里提取数值,也可以通过Seaborn返回的Matplotlib Axes对象来获取,但这种方式比较繁琐,而且容易因为可视化的精度损失导致数值不准确,尤其是分组箱线图场景下更麻烦。

简单说,Seaborn绘制的箱线图,其底层元素(箱体、须线、异常值点)都存储在Axes对象里:

  • 箱体的上下边缘对应Q1和Q3,中间线是中位数
  • 须线的端点对应最小值和最大值(非异常值的极值)
  • 散点是异常值

举个提取中位数的例子:

# 获取第一个箱体对象(如果是单组箱线图)
box = ax.artists[0]
# 箱体的中间线对应中位数,获取其x轴数值(如果是y轴箱线图则取y值)
median = box.get_path().vertices[2, 0]
print(f"中位数: {median}")

但这种方式需要你手动对应每个元素的位置,而且不同的绘图方向(x轴/ y轴箱线图)还要调整取值逻辑,远不如直接用原始数据计算方便。


总结一下:优先选择用Pandas/NumPy对原始数据做统计计算,这是最稳妥的方式;Seaborn本身没有提供直接提取箱线图统计值的函数,从绘图对象里提取属于舍近求远的操作,不推荐。

内容的提问来源于stack exchange,提问作者YANQING JING

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:47:35