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

Seaborn箱线图显示异常,请求排查代码问题

问题描述

我编写了一段统计代码,试图生成按航空公司平均延误时长排序的箱线图,但生成的图显示异常。

原代码:

data = data.assign(
    ArrDelay=np.where(data["ArrDelay"].lt(0), 0, data["ArrDelay"]),
    DepDelay=np.where(data["DepDelay"].lt(0), 0, data["DepDelay"])
)
data[["ArrDelay", "DepDelay"]].head(40)
data['Month'] = (data['ArrDelay'] + data['DepDelay'])

result = data.groupby("UniqueCarrier")["Month"].mean()
print(result)
sns.boxplot(x='UniqueCarrier', y='Month', data=data, order=result.index)

当前异常图:
当前异常箱线图

期望样式图:
期望的箱线图


问题排查与修正

核心问题

  • 变量命名混淆:将单条记录的总延误时长命名为Month,与实际月份字段无关联,造成逻辑混乱。
  • 排序逻辑错误:result.index是分组后的默认顺序,未按平均延误值排序,导致箱线图排列不符合期望。
  • 极端值干扰:大量极端值压缩了箱线主体,视觉效果与期望图差异大。

修正后的代码

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

# 处理负延误值,转为0
data = data.assign(
    ArrDelay=np.where(data["ArrDelay"] < 0, 0, data["ArrDelay"]),
    DepDelay=np.where(data["DepDelay"] < 0, 0, data["DepDelay"])
)

# 计算单条记录总延误,命名更清晰
data['TotalDelay'] = data['ArrDelay'] + data['DepDelay']

# 按航空公司分组计算平均延误,降序排序
mean_delay = data.groupby("UniqueCarrier")["TotalDelay"].mean().sort_values(ascending=False)

# 生成按均值排序的箱线图,可选隐藏极端值
sns.boxplot(
    x='UniqueCarrier', 
    y='TotalDelay', 
    data=data, 
    order=mean_delay.index,
    showfliers=False  # 隐藏极端值,让箱线结构更清晰
)

# 优化图表可读性
plt.title("Total Delay by Airline (Sorted by Average Delay)")
plt.xlabel("Airline Carrier")
plt.ylabel("Total Delay (Minutes)")
plt.xticks(rotation=45)
plt.show()

关键修正说明

  • 重命名Month为TotalDelay,避免命名歧义,逻辑更直观。
  • 对分组均值执行sort_values(ascending=False),确保箱线图按平均延误从高到低排列,匹配期望样式。
  • 添加showfliers=False隐藏极端值,还原期望图的清晰箱线结构。
  • 新增可视化调整代码,优化图表标签和可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:05:17