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

使用ggplot2绘制降雨柱状图:Y轴刻度及均值线添加问题求助

ggplot2降雨柱状图问题解决

问题原因分析

  1. Y轴刻度异常:原代码使用stat="summary"但未指定聚合函数,默认计算的是每年单日降雨的均值。如果逐日降雨数据中大部分天数降雨量为0,均值会极低,导致Y轴仅显示1、2。而实际需要的应该是每年的降雨总量。
  2. 均值线不匹配:原代码mean(dat$Rainfall)计算的是所有单日降雨的均值,和柱状图展示的单日均值逻辑不符;若要展示多年年均降雨总量的均值,需先计算每年总量再取平均。
  3. 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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:23:34