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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:03:42