ggplot:基于年份子集添加新线条
问题:在ggplot中为长期水文数据叠加特定年份的流量线条
我手里有一套约90年的日度水文流量数据,数据结构示例如下:
head(dischg)
date ddmm year cfs daymo
1 1-Jan-27 01-Jan 1927 715 2018-01-01
2 2-Jan-27 02-Jan 1927 697 2018-01-02
3 3-Jan-27 03-Jan 1927 715 2018-01-03
4 4-Jan-27 04-Jan 1927 796 2018-01-04
5 5-Jan-27 05-Jan 1927 825 2018-01-05
6 6-Jan-27 06-Jan 1927 865 2018-01-06
我已经成功画出了整个时间序列的日度长期平均值线条,现在想在同一个ggplot图里,额外添加2014-2018年这五年里每年的单独流量线条,求具体操作方法?
解决方案
别担心,这事儿在ggplot里其实挺简单的,分两步就能搞定:
1. 预处理数据
首先把你需要的2014-2018年子集数据单独提取出来,同时确保你的长期平均值数据是按daymo(月-日)分组计算好的(如果你还没算长期平均,后面也有代码可以补):
# 加载dplyr(如果还没加载的话) library(dplyr) # 提取2014-2018年的流量数据 survey_years_data <- dischg %>% filter(year %in% 2014:2018) # 如果你还没计算长期平均值,用这段代码生成 long_term_avg <- dischg %>% group_by(daymo) %>% summarise(avg_cfs = mean(cfs, na.rm = TRUE))
2. 叠加线条到ggplot图中
在你已有的长期平均图代码基础上,额外调用一次geom_line(),传入刚才提取的子集数据,并且按year分组,这样每个年份会自动生成单独的线条:
# 加载ggplot2 library(ggplot2) # 绘制叠加后的图 ggplot() + # 先画长期平均值线条,用粗黑线条突出显示 geom_line(data = long_term_avg, aes(x = daymo, y = avg_cfs), color = "black", size = 1.2) + # 叠加2014-2018年每年的线条,按年份分组用不同颜色区分 geom_line(data = survey_years_data, aes(x = daymo, y = cfs, color = factor(year)), size = 0.8) + # 美化日期轴,改成按月显示缩写 scale_x_date(date_labels = "%b", date_breaks = "1 month") + # 添加轴标签和图例标题 labs(x = "日期(月-日)", y = "流量(cfs)", color = "调查年份") + # 用简洁的主题 theme_minimal()
关键提示
- 核心思路是两次调用
geom_line(),分别传入不同的数据框:一次是长期平均数据,一次是特定年份的子集数据。 - 子集数据一定要用
factor(year)把年份转成分类变量,这样ggplot会自动为每个年份分配不同的颜色,还会生成对应的图例。
内容的提问来源于stack exchange,提问作者ayesha
相关产品推荐
相关产品推荐

