如何修改图例符号颜色且不改变置信区间(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
相关产品推荐
相关产品推荐

