ggplot2绘图添加颜色图例遇阻:调整aes后图例显示异常
解决ggplot2颜色图例不匹配的问题
我懂你现在的困扰——把颜色参数移到aes()里后图例虽然显示了,但颜色完全不对,这是因为我们需要明确给每个统计量指定对应的颜色映射,而不是让ggplot自动分配。下面给你两个解决方案,先看直接修改现有代码的方法:
方案1:修改现有图层的颜色映射
核心思路是给每个统计量(第一四分位数、均值、第三四分位数)定义一个分类标签,把这个标签放到aes(color = ...)里,再用scale_color_manual()把标签和你想要的颜色绑定起来:
p3 <- ggplot() + # 第一四分位数:指定分类标签为"1st Quartile" geom_point(data = dv, aes(x = year, y = X1st.Qu., group = 1, color = "1st Quartile"), shape = 95, size = 8) + # 均值:指定分类标签为"Mean"(同时给点和线用同一个标签) geom_point(data = dv, aes(x = year, y = Mean, group = 1, color = "Mean"), shape = 21, size = 2) + geom_line(data = dv, aes(x = year, y = Mean, group = 1, color = "Mean"), size = .5) + # 第三四分位数:指定分类标签为"3rd Quartile" geom_point(data = dv, aes(x = year, y = X3rd.Qu., group = 1, color = "3rd Quartile"), shape = 95, size = 8) + # 手动绑定标签和颜色,同时设置图例名称 scale_color_manual(name = "Statistics", values = c("1st Quartile" = "yellow", "Mean" = "blue", "3rd Quartile" = "red")) + # 合并theme设置,让代码更简洁 theme(axis.text.x = element_text(angle = 90, size = 7), plot.title = element_text(hjust = 0.5)) + ggtitle("Statistical description per year") + labs(y = "Statistics", x = "Year")
这样修改后,图例就会正确显示每个统计量对应的颜色了——因为我们明确告诉了ggplot:"1st Quartile"对应黄色,"Mean"对应蓝色,"3rd Quartile"对应红色。
方案2:整理数据为长格式(更推荐)
如果后续要添加更多统计量,重复写多个图层会很麻烦,建议把宽格式的数据转成长格式,这样只用少量图层就能搞定:
首先用tidyr包转换数据:
library(tidyr) dv_long <- dv %>% pivot_longer(cols = c(X1st.Qu., Mean, X3rd.Qu.), names_to = "stat_type", values_to = "value")
然后画图:
p3 <- ggplot(dv_long, aes(x = year, y = value, group = stat_type, color = stat_type)) + geom_point(aes(shape = stat_type, size = stat_type)) + geom_line(data = filter(dv_long, stat_type == "Mean"), size = .5) + # 指定颜色、形状、大小的映射 scale_color_manual(name = "Statistics", values = c("X1st.Qu." = "yellow", "Mean" = "blue", "X3rd.Qu." = "red")) + scale_shape_manual(name = "Statistics", values = c("X1st.Qu." = 95, "Mean" = 21, "X3rd.Qu." = 95)) + scale_size_manual(name = "Statistics", values = c("X1st.Qu." = 8, "Mean" = 2, "X3rd.Qu." = 8)) + theme(axis.text.x = element_text(angle = 90, size = 7), plot.title = element_text(hjust = 0.5)) + ggtitle("Statistical description per year") + labs(y = "Statistics", x = "Year")
这种方式代码更简洁,后续维护和扩展也更方便。
内容的提问来源于stack exchange,提问作者user9737581
相关产品推荐
相关产品推荐

