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版本迭代后离群点提取逻辑变化,可以手动计算统计量实现,完全可控:
- 按列计算2%、25%、50%、75%、98%分位数作为箱线边界
- 筛选出超出2%/98%分位数的离群点,每组仅保留最大、最小两个值
- 用matplotlib原生
ax.bxp()绘制箱线主体,单独绘制筛选后的离群点
内容的提问来源于stack exchange,提问作者obscuredbyclouds
相关产品推荐
相关产品推荐

