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

如何修改图例符号颜色且不改变置信区间(SE)颜色

问题:调整ggplot图例中置信区间的填充色

我用以下代码绘制图表:

ggplot(SR_data, aes(x = day, y = max_temp, colour = season2, shape = season2)) +
  geom_point(size = 1.5, show.legend = TRUE) +
  stat_smooth(formula = y ~ x, method = "lm", se = TRUE) +
  scale_colour_manual(values = c("black", "snow4"), labels = c("Shoulder", "Dry"))+
  guides(fill = c("none"), shape = "none", color = guide_legend(override.aes = list(size = 3, shape = c(21,24), fill = c("black", "snow4"))))+
  scale_x_continuous(breaks = seq(0, 120, 10)) +
  labs(x = "Day",y = "Maximum daily temperature (°C)") +
  theme_few() +
  theme(legend.position = c(0.1, 0.85), text = element_text(size = 13), axis.title.y = element_text(margin = margin(r = 10)), axis.title.x = element_text(margin = margin(t = 10)), legend.title = element_blank())

生成的图表:
当前图表

我希望修改图例中代表置信区间的“Shoulder”的背景色,使其与“Dry”的浅灰色一致。目前使用guide_legend(override.aes)自定义图例时,把fill = c("black", "snow4")改成colour后,符号完全没有填充效果,求可行解决方法。

模拟数据:

vec1 <- c("shoulder","shoulder","shoulder","shoulder","shoulder","dry","dry","dry","dry","dry")
vec2 <- c(0,1,2,3,4,5,6,7,8,9,10)
vec3 <- c(24,25,26,32,30,32,29,28,27,31)

SR_data <- data.frame(
  season2 = vec1,
  day = vec2,
  max_temp = vec3
)

解决方法

问题核心是你仅配置了colour美学,但stat_smooth的置信区间(se)填充色由fill美学控制。要实现需求,需针对性调整fill相关映射与配置:

修改后的完整代码

ggplot(SR_data, aes(x = day, y = max_temp, colour = season2, shape = season2)) +
  geom_point(size = 1.5, show.legend = TRUE) +
  # 为置信区间绑定fill映射
  stat_smooth(aes(fill = season2), formula = y ~ x, method = "lm", se = TRUE) +
  scale_colour_manual(values = c("black", "snow4"), labels = c("Shoulder", "Dry")) +
  # 统一设置两个季节的置信区间填充色为浅灰色
  scale_fill_manual(values = c("gray80", "gray80"), labels = c("Shoulder", "Dry")) +
  guides(
    shape = "none", 
    color = guide_legend(
      override.aes = list(
        size = 3, 
        shape = c(21,24), 
        fill = c("black", "snow4") # 保留图例点的填充色与线条色对应
      )
    ),
    fill = "none" # 隐藏独立的fill图例
  ) +
  scale_x_continuous(breaks = seq(0, 120, 10)) +
  labs(x = "Day", y = "Maximum daily temperature (°C)") +
  theme_few() +
  theme(
    legend.position = c(0.1, 0.85), 
    text = element_text(size = 13), 
    axis.title.y = element_text(margin = margin(r = 10)), 
    axis.title.x = element_text(margin = margin(t = 10)), 
    legend.title = element_blank()
  )

关键说明

  • stat_smooth(aes(fill = season2)):让置信区间填充色与season2绑定,才能通过scale_fill_manual统一设置
  • scale_fill_manual(values = c("gray80", "gray80")):强制两个季节的置信区间使用同一浅灰色,可根据需求替换为更匹配的色调(如snow4的相近浅灰)
  • 保留guide_legend中的fill = c("black", "snow4"):确保图例点的填充色与线条色对应,不干扰置信区间的实际填充效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 16:13:11