如何在Python绘制箱线图时仅展示最大和最小异常值?
Python箱线图仅展示最大、最小两个异常值的实现方案
核心思路是不修改原始数据集,先手动按箱线图规则筛选出所有异常值,仅保留最大最小两个后,关闭绘图库默认的异常值展示,再手动把这两个点叠加到图上。
完整可运行代码示例
import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 1. 生成模拟偏态数据(替换为你自己的数据集即可) np.random.seed(42) # 对数正态分布是典型的右偏分布,会产生大量高侧异常值 data = np.random.lognormal(mean=2, sigma=1.5, size=1000) # 2. 按箱线图默认规则筛选异常值 q1 = np.percentile(data, 25) q3 = np.percentile(data, 75) iqr = q3 - q1 # 箱线图默认异常值判定规则:小于Q1-1.5*IQR 或 大于Q3+1.5*IQR lower_threshold = q1 - 1.5 * iqr upper_threshold = q3 + 1.5 * iqr all_outliers = data[(data < lower_threshold) | (data > upper_threshold)] # 仅保留最大、最小两个异常值,若异常值不足2个则全保留 target_outliers = np.array([all_outliers.min(), all_outliers.max()]) if len(all_outliers) >= 2 else all_outliers # 3. 绘图 plt.figure(figsize=(8, 4)) # 绘制箱线图时关闭默认的异常值展示 sns.boxplot(x=data, showfliers=False, color="#87CEEB") # 手动叠加保留的异常值,y=0对应单组箱线图的纵向位置 plt.scatter(x=target_outliers, y=[0]*len(target_outliers), color="red", s=50, marker="o", label="保留异常值") plt.legend() plt.xlabel("数据值") plt.title("偏态分布箱线图(仅展示最大最小异常值)") plt.show()
多组数据的适配说明
如果是多组并列箱线图,对每一组数据单独执行上述异常值筛选逻辑,绘制散点时对应修改y坐标即可:每组箱线图的纵向坐标依次为0、1、2……,对应组的顺序。
自定义调整项
- 异常值判定规则可自行修改,比如把1.5倍IQR改为3倍IQR,仅需调整
lower_threshold和upper_threshold的计算系数即可 - 保留的异常值样式可通过
scatter函数的color、s、marker参数调整
内容的提问来源于stack exchange,提问作者김ㅈㅎ
相关产品推荐
相关产品推荐

