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

如何为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区域,没有将图案属性映射到变量,因此无法生成对应图例。需要重构数据格式,把区间信息和分组变量绑定,再统一映射样式属性。

实现步骤

  1. 重构数据,生成包含每个区间ymin、ymax和对应分组变量的数据集
  2. 在aes中把pattern、pattern_fill、pattern_angle等属性映射到分组变量
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:46:00