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

Seaborn箱线图仅显示最大最小离群值报AxesSubplot不可下标错误解决方案

问题根因

  • 你参考的是matplotlib原生plt.boxplot()的实现逻辑,它返回的是包含fliers字段的属性字典,但seaborn的sns.boxplot()返回的是AxesSubplot对象,不能直接用下标['fliers']取值,这是报错的直接原因
  • 原有代码中fly.get_data是方法引用,没有加调用括号(),无法获取实际的离群点坐标数据

修正后可运行代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 示例数据
mda8 = pd.DataFrame({
'T1':[35.000000, 32.125000, 32.000000, 35.250000, 28.875000, 28.500000, 29.375000, 25.125000, 34.166667, 35.250000],
'T2':[28.375, 30.750, 33.250, 34.000, 32.875, 30.250, 29.875, 100.409, 29.625, 1.232],
'T3':[34.250, 102.232, 28.250, 33.000, 27.625, 21.500, 28.375, 30.250, 3.454, 33.750]})

fig,ax = plt.subplots(1, figsize=(8,6))
g = sns.boxplot(data=mda8, orient='v', width = 0.7, whis = (2,98), ax=ax)

# 提取所有离群点对象
fliers = [line for line in ax.lines if line.get_marker() == 'o']

for fly in fliers:
    x_data, y_data = fly.get_data()
    if len(y_data) == 0:
        continue
    # 仅保留y方向最大和最小离群值
    min_idx = np.argmin(y_data)
    max_idx = np.argmax(y_data)
    fly.set_data([x_data[min_idx], x_data[max_idx]], [y_data[min_idx], y_data[max_idx]])

xvalues = ['Niland', 'El Centro', 'Calexico']
plt.xticks(np.arange(3), xvalues, fontsize=12)
ax.set_ylabel('Ozone MDA8 (ppb)',fontsize=15)
ax.set_ylim(0,105)
plt.show()

替代实现方案(兼容性更强)

如果担心seaborn版本迭代后离群点提取逻辑变化,可以手动计算统计量实现,完全可控:

  1. 按列计算2%、25%、50%、75%、98%分位数作为箱线边界
  2. 筛选出超出2%/98%分位数的离群点,每组仅保留最大、最小两个值
  3. 用matplotlib原生ax.bxp()绘制箱线主体,单独绘制筛选后的离群点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:00:02