ggboxplot箱线图中位数与手动计算结果不一致问题
箱线图中位数与手动计算结果不一致的原因
导致ggpubr包中ggboxplot绘制的箱线图中位数与手动计算结果存在差异的核心原因主要有三点:
1. 对数转换的计算顺序差异
你在代码中使用了scale_y_log10()对Y轴做对数转换,ggplot2的逻辑是先基于原始数据计算中位数、四分位数等统计量,再将统计结果做对数转换后绘制;但如果手动计算时,你是先对CO₂数据做对数转换再求中位数,两者结果必然不同——中位数不满足线性变换之外的转换不变性,对数转换会改变数据的分布位置。
2. 0值与NA值的处理逻辑不同
你的CO₂数据中包含0和NA:
- ggboxplot会自动剔除
NA值,但log10(0)为负无穷,无法在对数轴上绘制,因此ggplot2会将0值识别为异常值(即使你设置了outlier.shape=1),在计算箱线图统计量时会排除这些0值; - 若手动计算时未剔除0值,或者对0值做了不同处理(比如替换为极小值),就会导致中位数结果和图中不一致。
3. 分组逻辑的一致性问题
ggboxplot严格按照x="opmode"、fill="Trailer"、facet.by="Vehicle"的组合进行分组计算。如果手动计算时:
- 没有严格匹配相同的分组维度(比如漏筛了
Trailer或Vehicle的分类); - 分组后的数据范围和ggplot自动分组的范围不一致,也会出现中位数差异。
验证示例(以你的数据集为例)
针对opmode=0、Vehicle=C13的分组,分别计算两种情况的中位数:
- 包含0值的原始数据中位数:约0.000365
- 剔除0值后的原始数据中位数:0.00036
将这两个值做对数转换后,在图上的位置会明显不同,这就是你看到差异的直接来源。
内容的提问来源于stack exchange,提问作者rohit j
相关产品推荐
相关产品推荐

