如何在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
相关产品推荐
相关产品推荐

