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
相关产品推荐
相关产品推荐

