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

如何修改ggplot2代码使geom_ribbon仅在VAL≤-1连续两月及以上时显示

解决方案

一、数据预处理:识别符合要求的连续干旱时段

要实现只显示连续≥2个月的干旱(VAL≤-1)区域,首先得按AREA和METRIC分组,标记出连续满足条件的时段:

library(dplyr)
library(data.table)

# 把模拟数据赋值为绘图用的spi_df
spi_df <- dummy

# 预处理:筛选连续≥2个月的干旱时段
spi_processed <- spi_df %>%
  group_by(AREA, METRIC) %>%
  # 标记是否为干旱状态,并用rleid生成连续状态的分组ID
  mutate(
    is_drought = VAL <= -1,
    seq_id = rleid(is_drought)
  ) %>%
  # 按连续状态组计算时长,筛选出≥2个月的干旱组
  group_by(AREA, METRIC, seq_id) %>%
  mutate(seq_length = n()) %>%
  filter(is_drought & seq_length >= 2) %>%
  ungroup()

二、修改绘图代码

用预处理后的数据绘制geom_ribbon,确保填充区域仅出现在符合条件的时段:

ggplot(data = spi_df, aes(x = Date, y = VAL, col = AREA, group = AREA)) +
  geom_line() +  
  # 仅用有效干旱数据绘制填充带,按连续时段分组避免跨非干旱区域填充
  geom_ribbon(data = spi_processed,
              aes(x = Date, ymin = VAL, ymax = -1, group = interaction(AREA, METRIC, seq_id)), 
              fill = "red", colour = "transparent", alpha = 0.3) + 
  facet_grid(METRIC ~ GROUP, scales = "free_x") +
  coord_cartesian(expand = FALSE) +
  theme_bw() +
  labs(y = "SPI") +
  scale_y_continuous(breaks = seq(-4, 4, 1), limits = c(-4, 4)) +
  theme(legend.position = "bottom")

核心逻辑说明

  1. 分组识别连续时段:通过rleid函数为每个连续的干旱/非干旱状态生成唯一ID,确保不同区域、不同指标的时段独立判断。
  2. 筛选有效时段:只保留连续时长≥2个月的干旱组,避免单个月的干旱被填充。
  3. Ribbon独立分组:用interaction(AREA, METRIC, seq_id)作为分组依据,保证每个连续干旱时段的填充带是独立的,不会延伸到VAL>-1的区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:08:14