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))

问题原因
核心错误出在数据映射逻辑:
- 你在
geom_boxplot和stat_summary中都将y映射到了mean列,相当于把每个聚合后的均值当作单个数据点来绘制箱线图,这完全违背了箱线图展示数据分布的作用。 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))
关键改动说明
- 提前用
mutate处理月份和年份列,避免在ggplot中重复编写复杂的格式化代码,提升可读性。 - 将
geom_boxplot的y映射改为原始CO浓度列,让箱线图基于每组原始数据计算四分位数、异常值等统计量,还原箱线图的本来作用。 stat_summary继承全局映射,自动对每个month+year分组的原始数据计算均值,确保均值点位置正确。
如果你的数据只有聚合后的均值(无原始数据),那么箱线图本身没有意义,建议改用柱状图展示各月份的均值。
内容的提问来源于stack exchange,提问作者Dani Z
相关产品推荐
相关产品推荐

