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

Seaborn箱线图中位数显示异常问题求助

Seaborn箱线图中位数显示异常问题求助

我来帮你理清这个问题的核心原因~

先复现你的代码场景:

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

df_s=pd.Series([    
      5990.00,  
3990.00,  
399000.00  ,
1995000.00])
plt.yscale("log")

sns.boxplot(y=df_s)
plt.show()

你手动计算的原始数据中位数完全正确:把数据排序后是[3990, 5990, 399000, 1995000],中位数是第2和第3个数的平均值,也就是(5990 + 399000)/2 = 202495。

那为什么箱线图里的中位数看起来像在10⁴到10⁵之间呢?其实是对数刻度的非线性特性造成的视觉错觉:

  • 202495以10为底的对数值是log10(202495) ≈ 5.306,对应到对数坐标轴上,这个数值的实际位置是在10⁵(对应log值5,即100000)和10⁶(对应log值6,即1000000)之间,只是因为对数轴的刻度间隔是对数级的,10⁴到10⁵、10⁵到10⁶的视觉距离完全相同,202495离10⁵的视觉距离不算远,才会让你误以为落在10⁴区间。

另外要明确:当你设置plt.yscale("log")后,Seaborn是基于原始数据计算中位数等统计量,再把这些数值映射到对数轴上展示,而非先对数据做对数转换再计算统计量。所以箱线图的中位数位置是完全准确的,只是对数刻度的视觉呈现容易造成误解。

你可以用一行代码验证这个结论:

plt.axhline(y=202495, color='r', linestyle='--')

这条红色虚线会和箱线图的中位数线完美重合,证明两者是完全一致的~

备注:内容来源于stack exchange,提问作者Laxmiprasad Iyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:04:32