如何在facet_wrap时间序列图中剔除跨年异常值,仅展示全年数据?
解决跨年异常点,只展示每年1-12月数据的方法
要剔除跨年的异常点,核心思路是确保每个年份的分面只包含对应年份1月1日到12月31日的数据,用lubridate包处理日期会非常方便,下面是具体步骤和代码:
1. 先处理数据(关键步骤)
首先假设你已经有了全海湾的日平均水温数据框(比如叫daily_temp),里面包含日期列(比如date)和日平均水温列(比如mean_temp)。如果还没计算日平均,也可以在计算的同时完成筛选:
# 加载需要的包 library(lubridate) library(ggplot2) library(dplyr) # 从原始15分钟数据计算日平均,并同步筛选当年数据 daily_temp <- tempdat %>% # 把15分钟时间戳转换为日期格式 mutate(date = as.Date(sampletime_15min)) %>% # 按日期计算全海湾的日平均水温(如果是按站点统计,可在group_by里加上station) group_by(date) %>% summarise(mean_temp = mean(temp_c, na.rm = TRUE)) %>% ungroup() %>% # 提取每个日期对应的年份 mutate(year = year(date)) %>% # 只保留该年份1月1日到12月31日的数据 filter(date >= ymd(paste0(year, "-01-01")) & date <= ymd(paste0(year, "-12-31")))
2. 绘制分面图
用处理好的数据绘图,此时每个年份的分面只会显示当年1-12月的内容:
ggplot(daily_temp, aes(x = date, y = mean_temp)) + geom_line(color = "#2c3e50") + # 按年份分面,x轴设为自由刻度更贴合各年份的日期范围 facet_wrap(~year, scales = "free_x") + labs(x = "日期", y = "全海湾日平均水温(°C)") + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
小提示
- 如果你的日期列不是
Date类型,一定要先用as.Date()或者lubridate::ymd()转换,否则日期筛选会出错; - 如果你需要按站点展示数据,只需要在
group_by()里加上station字段即可,不影响年份筛选的逻辑。
内容的提问来源于stack exchange,提问作者Mareike Donají Duffing Romero
相关产品推荐
相关产品推荐

