如何在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
不确定区间示例输出
解决方案
要实现需求,分两步处理:
- 生成缺失月份的阴影区域数据
- 按年份分组绘制折线,自动断开跨缺失月份的连接
具体代码如下:
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
相关产品推荐
相关产品推荐

