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

ggplot2自定义geom_rect图例:CORE-10临床得分折线图求助

解决ggplot2中自定义背景区域图例不显示的问题

你的问题出在没有把背景色块的填充色映射到ggplot的美学映射(aes)中——当前代码里的geom_rect是直接指定fill参数,而非通过aes(fill = ...)建立映射,因此scale_fill_manual无法识别并生成对应图例。同时你设置的theme(legend.position = "none")会隐藏所有图例,这也需要针对性调整。

下面是具体修正步骤和完整代码:

修正思路

  • 先创建单独的背景区域数据框,整合每个区域的范围、标签和颜色,避免重复编写geom_rect
  • 在geom_rect中通过aes(fill = 标签)建立填充色与图例的映射关系
  • 调整scale_fill_manual来匹配标签和对应颜色
  • 单独隐藏ID对应的颜色图例,保留背景区域的图例

完整代码

library(ggplot2)

# 原始数据
CORE10 <- data.frame(
  ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
  Session = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),
  Score = c(23, 11, 23, 12, 6, 12, 4, 24, 7, 7, 4, 3, 18, 8, 4)
)

# 创建背景区域数据框
bg_regions <- data.frame(
  ymin = c(0, 10, 25),
  ymax = c(10, 25, 40),
  label = c("Non-Clinical", "Mild-Moderate", "Moderate-Severe"),
  fill_color = c("lawngreen", "yellow", "red")
)

ggplot(CORE10, aes(Session, Score, colour = ID)) +
  # 先绘制背景色块,通过aes映射fill到标签
  geom_rect(data = bg_regions, aes(xmin = -Inf, xmax = Inf, ymin = ymin, ymax = ymax, fill = label), alpha = .01) +
  # 绘制数据点和折线
  geom_point(size=5, alpha=0.3)+
  geom_line(size=1)+
  theme_minimal()+
  scale_y_continuous(limits= c(0,40), breaks = c(0, 5, 10, 15, 20, 25, 30, 35, 40))+
  scale_x_continuous(breaks = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13, 14 ,15))+
  # 自定义填充色图例
  scale_fill_manual(name = "Severity Level", 
                    values = setNames(bg_regions$fill_color, bg_regions$label),
                    labels = bg_regions$label) +
  # 仅隐藏ID对应的颜色图例
  guides(colour = "none") +
  labs(title="Guided Self-Help CORE-10 Scores")

代码说明

  1. bg_regions数据框整合了三个背景区域的所有信息,让代码更简洁易维护
  2. geom_rect通过data = bg_regions指定背景数据,同时在aes里映射fill = label,让ggplot自动关联生成图例
  3. scale_fill_manual用setNames将标签与颜色一一对应,确保图例显示正确的标签和色块
  4. guides(colour = "none")专门隐藏ID的颜色图例,避免影响背景图例的展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:35:33