使用ggplot2绘制降雨柱状图:Y轴刻度及均值线添加问题求助
ggplot2降雨柱状图问题解决
问题原因分析
- Y轴刻度异常:原代码使用
stat="summary"但未指定聚合函数,默认计算的是每年单日降雨的均值。如果逐日降雨数据中大部分天数降雨量为0,均值会极低,导致Y轴仅显示1、2。而实际需要的应该是每年的降雨总量。 - 均值线不匹配:原代码
mean(dat$Rainfall)计算的是所有单日降雨的均值,和柱状图展示的单日均值逻辑不符;若要展示多年年均降雨总量的均值,需先计算每年总量再取平均。 stat="identity"无效:直接改stat="identity"会把所有单日数据堆叠绘制,而非按年聚合,因此无法得到正确的年度柱状图。
解决方案
提供两种可行方案,任选其一即可:
方案1:直接在ggplot中计算年度总量
# 先计算多年年均降雨总量的均值 annual_total <- tapply(dat$Rainfall, dat$Year, sum, na.rm = TRUE) mean_annual_rain <- mean(annual_total, na.rm = TRUE) ggplot(data=dat, aes(x=Year, y=Rainfall)) + # 指定stat="summary"并设置fun=sum,计算每年降雨总量 geom_bar(stat="summary", fun=sum, na.rm=TRUE, width=0.5, fill="orange") + # 设置Y轴标签,可手动指定范围(也可省略让ggplot自动识别) scale_y_continuous(name="Rainfall (mm)", limits=c(0, max(annual_total)*1.1)) + # 添加多年年均总量的均值线 geom_hline(yintercept = mean_annual_rain, linetype="dashed", linewidth=1) + labs(x="Year", title="Rainfall at Coonamble Airport between 1998 and 2023")
方案2:先预处理数据再绘图(推荐,逻辑更清晰)
# 用dplyr预处理,计算每年降雨总量 library(dplyr) dat_annual <- dat %>% group_by(Year) %>% summarise(Total_Rain = sum(Rainfall, na.rm = TRUE)) %>% ungroup() # 计算多年年均总量的均值 mean_annual_rain <- mean(dat_annual$Total_Rain, na.rm = TRUE) ggplot(data=dat_annual, aes(x=Year, y=Total_Rain)) + geom_bar(stat="identity", width=0.5, fill="orange") + scale_y_continuous(name="Rainfall (mm)") + geom_hline(yintercept = mean_annual_rain, linetype="dashed", linewidth=1) + labs(x="Year", title="Rainfall at Coonamble Airport between 1998 and 2023")
关键改动说明
- 将
stat="summary"的聚合函数设为fun=sum(方案1),或提前计算年度总量(方案2),确保柱状图展示的是每年降雨总和。 - 调整均值线的计算逻辑,基于年度总量取平均,保证与柱状图数据匹配。
- 若需手动设置Y轴范围,通过
scale_y_continuous(limits=c(min, max))实现,max可设为年度总量最大值的1.1倍,预留顶部空间。
内容的提问来源于stack exchange,提问作者A. Q.
相关产品推荐
相关产品推荐

