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

如何在R的ggplot中为缺失月份添加阴影且不连接折线?

问题描述

更新1

已在原始data.frame中添加绘图所需的不确定区间列(Up、Low)。此前咨询过相关问题,现在需要新方法:在ggplot中给缺失月份的数据区域添加阴影,同时避免折线跨越缺失月份连接。

提供的代码如下:

DF <- data.frame(Date = seq(as.Date("2000-01-01"),to = as.Date("2005-12-31"),by = "day"), 
                 Obs = runif(2192, 5,10),
                 Sim = runif(2192, 8,12),
                 Up = runif(2192,13,15),
                 Low = runif(2192,1,4)) %>% 
      filter(between(month(Date),3,10))

ggplot(DF, aes(x = Date))+
  geom_ribbon(aes(ymin = Up, ymax = Low), fill = "grey30", alpha = 0.5)+
  geom_line(aes(y = Obs, col = "blue"))+
  geom_line(aes(y = Sim, col = "red"))

所需输出

期望效果类似示例图,但折线不会跨缺失月份连接。
示例图

更新2

不确定区间示例输出
不确定区间示例图


解决方案

要实现需求,分两步处理:

  1. 生成缺失月份的阴影区域数据
  2. 按年份分组绘制折线,自动断开跨缺失月份的连接

具体代码如下:

library(tidyverse)

# 生成原始数据并添加年份分组
DF <- data.frame(Date = seq(as.Date("2000-01-01"), to = as.Date("2005-12-31"), by = "day"), 
                 Obs = runif(2192, 5,10),
                 Sim = runif(2192, 8,12),
                 Up = runif(2192,13,15),
                 Low = runif(2192,1,4)) %>% 
      filter(between(month(Date),3,10)) %>%
      mutate(year = year(Date))

# 生成缺失月份的阴影区间数据(1-2月、11-12月)
years <- unique(year(seq(as.Date("2000-01-01"), to = as.Date("2005-12-31"), by = "year")))
shadow_df <- map_dfr(years, function(y) {
  tibble(
    xmin = c(as.Date(paste0(y, "-01-01")), as.Date(paste0(y, "-11-01"))),
    xmax = c(as.Date(paste0(y, "-03-01")), as.Date(paste0(y+1, "-01-01"))),
    ymin = -Inf,
    ymax = Inf
  )
})

# 绘图
ggplot() +
  # 绘制缺失月份阴影
  geom_rect(data = shadow_df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
            fill = "grey80", alpha = 0.5) +
  # 绘制不确定区间
  geom_ribbon(data = DF, aes(x = Date, ymin = Low, ymax = Up), fill = "grey30", alpha = 0.5) +
  # 按年份分组绘制折线,自动断开跨缺失区间的连接
  geom_line(data = DF, aes(x = Date, y = Obs, color = "观测值"), group = ~year) +
  geom_line(data = DF, aes(x = Date, y = Sim, color = "模拟值"), group = ~year) +
  scale_color_manual(values = c("观测值" = "blue", "模拟值" = "red")) +
  labs(x = "日期", y = "数值", color = "数据类型") +
  theme_minimal()

代码说明

  • 阴影区域:遍历每个年份,生成1-2月、11-12月的日期区间,用geom_rect绘制全屏阴影
  • 折线断开:通过year列分组绘图,ggplot会在每年10月结束后自动断开折线,不会连接到下一年3月
  • 调整了geom_ribbon的ymin和ymax顺序(Low为下限,Up为上限,避免显示异常)

内容的提问来源于stack exchange,提问作者Hydro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:23:10