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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:08:42