ggplot2使用geom_ribbon实现两类周期区域分开展示问题咨询
解决方法
报错原因
geom_ribbon要求单个分组内的填充、颜色等美学属性不能发生变化,直接将type作为分组参数时,同一个分组内会出现属性跳变,因此触发报错。
修复步骤
1. 调整数据预处理逻辑,新增连续同类型阶段的唯一ID
在生成fake_data的阶段新增segment_id字段,每遇到一次type(扩张/收缩)切换,ID就加1,保证每个连续的同类型阶段对应唯一的分组ID:
library(tidyverse) library(ggspectra) fake_data <- tibble( time = seq(1,100, length.out = 1000), gdp = time+time*(1-sin(0.15*time)) ) %>% mutate( time = row_number(), growth = (gdp - lag(gdp))/lag(gdp) * 100, peak = as.numeric(near(gdp, peaks(gdp), tol = 0.01)), valley = as.numeric(near(gdp, valleys(gdp), tol = 0.01)), type = as.factor( case_when( gdp >= lag(gdp) ~ "Expansion", gdp <= lag(gdp) ~ "Contraction" ) ) ) %>% mutate( cycle = as.factor(cumsum(peak + valley)), # 新增连续同类型阶段ID segment_id = cumsum(type != lag(type, default = first(type))) ) %>% na.omit()
2. 修改绘图代码,将segment_id作为ribbon的分组参数
fake_data %>% ggplot(mapping = aes(x = time, y = gdp)) + geom_line() + geom_point( data = fake_data %>% filter(peak == 1 | valley == 1), mapping = aes(x = time, y = gdp), size = 2 ) + # group映射为segment_id,每个连续阶段单独作为一个ribbon geom_ribbon(aes(ymax = gdp, ymin = 0, fill = type, group = segment_id), alpha = 0.5)
效果图

内容的提问来源于stack exchange,提问作者Serkan
相关产品推荐
相关产品推荐

