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

如何在ggplot中同图绘制airquality的Ozone数据与月度均值?

在ggplot图表中添加每月Ozone均值的两种方法

你可以通过以下两种方式在现有图表中添加每个月份的Ozone均值:

方法一:直接用stat_summary在图内计算并绘制均值线

这种方法无需额外预处理数据,直接通过stat_summary函数在ggplot图层中计算并绘制每个月份的均值参考线:

library("tidyverse")
data(airquality)
airquality <- na.omit(airquality)
airquality$date <- as.Date(paste("1973", airquality$Month, airquality$Day, sep="-"))

p1 <- ggplot(airquality, aes(x= date, y = Ozone, col=factor(Month))) + 
  geom_point() + 
  geom_line() +
  # 绘制每月Ozone均值的虚线,颜色与对应月份一致
  stat_summary(fun = mean, geom = "hline", aes(yintercept = after_stat(y)), 
               linetype = "dashed", linewidth = 1)
p1

这里stat_summary会自动按col=factor(Month)的分组计算均值,生成的水平虚线就是对应月份的Ozone均值。

方法二:先预处理数据再绘制均值线段

如果需要让均值线覆盖对应月份的整个日期范围,可以先计算每月均值和日期区间,再添加图层:

library("tidyverse")
data(airquality)
airquality <- na.omit(airquality)
airquality$date <- as.Date(paste("1973", airquality$Month, airquality$Day, sep="-"))

# 计算每月Ozone均值及该月的首尾日期
monthly_mean <- airquality %>%
  group_by(Month) %>%
  summarise(mean_ozone = mean(Ozone),
            min_date = min(date),
            max_date = max(date)) %>%
  ungroup() %>%
  # 转换格式,为每个月生成首尾两个数据点
  pivot_longer(cols = c(min_date, max_date), names_to = "temp", values_to = "date") %>%
  select(-temp)

p1 <- ggplot(airquality, aes(x= date, y = Ozone, col=factor(Month))) + 
  geom_point() + 
  geom_line() +
  # 添加覆盖整个月份的均值线段
  geom_line(data = monthly_mean, aes(y = mean_ozone), linetype = "dashed", linewidth = 1)
p1

这种方式生成的均值线会从对应月份的第一天延伸到最后一天,更直观展示该月均值在时间轴上的范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:40:15