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

R Studio ggplot2:含均值的两年箱线图显示异常问题求助

问题:ggplot2箱线图均值点显示异常的修复方法

我用ggplot2绘制包含均值的两年箱线图,但图中白色星号的均值被划分至异常区间(如图所示),请问该如何修复?

原代码:

ggplot(Datos_CO_trj_2021_2022) + 
geom_boxplot(aes(x=fct_inorder(reorder(format(Datos_CO_trj_2021_2022$date,'%B'),Datos_CO_trj_2021_2022$date)), y=Datos_CO_trj_2021_2022$mean, fill=format(Datos_CO_trj_2021_2022$date,'%Y'))) + 
stat_summary(aes(x=fct_inorder(reorder(format(Datos_CO_trj_2021_2022$date,'%B'),Datos_CO_trj_2021_2022$date)), y=Datos_CO_trj_2021_2022$mean, fill=format(Datos_CO_trj_2021_2022$date,'%Y')), fun = "mean", geom = "point", shape = 8, size = 3, color = "white")+labs(x="Mes", y= bquote(CO~"["~mol/m^2~"]"), title = "Concentración de CO año 2021-2022", fill="Año")+ 
theme(plot.title=element_text(family='SansSerif', size=20, hjust = 0.5),axis.title.x = element_text(family='SansSerif', face='bold', hjust=0.5),axis.title.y = element_text(family='SansSerif', face='bold', hjust=0.5)) +theme_bw()+scale_y_continuous(limits = c(0.01, 0.04))

箱线图均值异常显示


问题原因

核心错误出在数据映射逻辑:

  1. 你在geom_boxplot和stat_summary中都将y映射到了mean列,相当于把每个聚合后的均值当作单个数据点来绘制箱线图,这完全违背了箱线图展示数据分布的作用。
  2. stat_summary的fun="mean"是对已经聚合过的mean列再求均值,得到的结果毫无意义,自然会出现位置异常的情况。

修复方案

假设你的数据包含原始CO浓度列(比如命名为co_concentration),我们需要基于原始数据分组计算箱线统计量和均值,代码如下:

# 提前预处理数据,简化ggplot映射
library(tidyverse)
Datos_CO_trj_2021_2022 <- Datos_CO_trj_2021_2022 %>%
  mutate(
    month = format(date, "%B"),
    year = format(date, "%Y"),
    # 按日期排序月份,保证x轴顺序正确
    month = fct_inorder(reorder(month, date))
  )

# 绘制正确的箱线图+均值点
ggplot(Datos_CO_trj_2021_2022, aes(x = month, y = co_concentration, fill = year)) + 
  geom_boxplot() + 
  # 对每组原始数据计算均值,无需重复映射x和fill
  stat_summary(fun = "mean", geom = "point", shape = 8, size = 3, color = "white") +
  labs(
    x = "Mes", 
    y = bquote(CO~"["~mol/m^2~"]"), 
    title = "Concentración de CO año 2021-2022", 
    fill = "Año"
  ) + 
  theme(
    plot.title = element_text(family='SansSerif', size=20, hjust = 0.5),
    axis.title.x = element_text(family='SansSerif', face='bold', hjust=0.5),
    axis.title.y = element_text(family='SansSerif', face='bold', hjust=0.5)
  ) +
  theme_bw() +
  scale_y_continuous(limits = c(0.01, 0.04))

关键改动说明

  1. 提前用mutate处理月份和年份列,避免在ggplot中重复编写复杂的格式化代码,提升可读性。
  2. 将geom_boxplot的y映射改为原始CO浓度列,让箱线图基于每组原始数据计算四分位数、异常值等统计量,还原箱线图的本来作用。
  3. stat_summary继承全局映射,自动对每个month+year分组的原始数据计算均值,确保均值点位置正确。

如果你的数据只有聚合后的均值(无原始数据),那么箱线图本身没有意义,建议改用柱状图展示各月份的均值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:55:33