如何为geom_ribbon_pattern添加对应变量的图例说明?
问题描述

希望为geom_ribbon_pattern绘制的带图案区域添加与变量对应的图例说明,效果同折线图的图例一致。
当前使用的代码:
library(ggplot2) library(ggpattern) # Reshape the data into a long format data_long <- data %>% gather(key = "variable", value = "value", NI, GP, SA, CF) ggplot() + #geom_line(data = data_long, aes(x = date, y = value, linetype = variable),size=1) + #scale_linetype_manual(values = c("solid", "dashed", "dotted", "dotdash")) + geom_ribbon_pattern(data = data, aes(x = date, ymin = 0, ymax = CF), fill = "gray95", color = "white", pattern = "crosshatch", pattern_fill = "white", pattern_angle = 45, pattern_density = 0.01, pattern_spacing = 0.01) + geom_ribbon_pattern(data = data, aes(x = date, ymin = CF, ymax = NI), fill = "gray95", color = "white", pattern = "stripe", pattern_fill = "gray40", pattern_angle = 45, pattern_density = 0.01, pattern_spacing = 0.01) + geom_ribbon_pattern(data = data, aes(x= date, ymin= NI, ymax= GP), fill= "gray95", color= "transparent", linetype="dashed", pattern= "stripe", pattern_fill= "gray80", pattern_angle= 90, pattern_density= 0.01, pattern_spacing= 0.01) + geom_ribbon_pattern(data= data, aes(x= date, ymin= GP, ymax= SA), fill= "gray95", color= "white", pattern= "stripe", pattern_fill= "gray80", pattern_angle= 135, pattern_density= 0.01, pattern_spacing= 0.01)+ geom_line(data = data_long, aes(x = date, y = value, linetype = variable),size=1) + scale_linetype_manual(values = c("solid", "dashed", "dotted", "dotdash")) + scale_pattern_manual(values=c("crosshatch","stripe","stripe","stripe"))
数据说明:数据包含CF、GP、NI、SA四列,所有数值为随机生成。
解决方案
当前代码的核心问题是手动单独绘制每个geom_ribbon_pattern区域,没有将图案属性映射到变量,因此无法生成对应图例。需要重构数据格式,把区间信息和分组变量绑定,再统一映射样式属性。
实现步骤
- 重构数据,生成包含每个区间
ymin、ymax和对应分组变量的数据集 - 在
aes中把pattern、pattern_fill、pattern_angle等属性映射到分组变量 - 用
scale_*_manual统一指定每个分组的样式,同时合并折线图与图案的图例
示例代码
library(ggplot2) library(ggpattern) library(tidyr) library(dplyr) # 生成模拟数据(匹配原数据结构) set.seed(123) data <- tibble( date = seq.Date(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "month"), CF = runif(12, 10, 20), NI = runif(12, 20, 30), GP = runif(12, 30, 40), SA = runif(12, 40, 50) ) # 重构为区间格式,绑定分组变量 data_ribbon <- tibble( variable = rep(c("CF", "NI", "GP", "SA"), each = nrow(data)), ymin = c(rep(0, nrow(data)), data$CF, data$NI, data$GP), ymax = c(data$CF, data$NI, data$GP, data$SA), date = rep(data$date, 4) ) # 折线图长格式数据 data_long <- data %>% gather(key = "variable", value = "value", NI, GP, SA, CF) ggplot() + # 绘制带图案的ribbon,将样式属性映射到variable geom_ribbon_pattern( data = data_ribbon, aes(x = date, ymin = ymin, ymax = ymax, pattern = variable, pattern_fill = variable, pattern_angle = variable), fill = "gray95", color = "white", pattern_density = 0.01, pattern_spacing = 0.01 ) + # 绘制折线图,线型映射到variable geom_line(data = data_long, aes(x = date, y = value, linetype = variable), size = 1) + # 手动指定每个变量的图案类型 scale_pattern_manual( values = c(CF = "crosshatch", NI = "stripe", GP = "stripe", SA = "stripe") ) + # 手动指定每个变量的图案填充色 scale_pattern_fill_manual( values = c(CF = "white", NI = "gray40", GP = "gray80", SA = "gray80") ) + # 手动指定每个变量的图案角度 scale_pattern_angle_manual( values = c(CF = 45, NI = 45, GP = 90, SA = 135) ) + # 手动指定每个变量的线型 scale_linetype_manual( values = c(CF = "solid", NI = "dashed", GP = "dotted", SA = "dotdash") ) + # 合并图例,保证图案与线型样式一致 guides( pattern = guide_legend(override.aes = list(linetype = c("solid", "dashed", "dotted", "dotdash"))), linetype = guide_legend(override.aes = list(pattern = c("crosshatch", "stripe", "stripe", "stripe"))) ) + theme_minimal()
关键说明
- 重构
data_ribbon后,每个区间都对应一个variable分组,让图案属性与变量绑定,自动生成图例 - 通过
scale_*_manual系列函数精准控制每个变量的样式细节 - 使用
guides()合并图案和线型图例,实现折线图与图案区域图例样式统一的效果
内容的提问来源于stack exchange,提问作者s Murasame
相关产品推荐
相关产品推荐

