ggplot2次坐标轴图例颜色异常:非次轴线条图例变蓝的解决方法
解决ggplot2次坐标轴图例颜色统一为蓝色的问题
这个问题的核心是你直接在第二个geom_line()里指定了col="blue",这会让ggplot把这个颜色应用到所有图例线条上,覆盖了原本的默认黑色。要解决这个问题,我们需要把颜色也纳入**美学映射(aes)**中,然后手动指定每个类别的颜色和线型:
修改步骤:
- 将
geom_line(data=prev2, aes(y=value), col="blue")改为geom_line(data=prev2, aes(y=value, color="REFERRALS")),把颜色作为映射变量绑定到数据集类别 - 添加
scale_color_manual()来定义每个数据集的颜色,把GP和HOSPITAL设为黑色,REFERRALS设为蓝色 - 确保
scale_linetype_manual()的values对应三个数据集的顺序(GP、HOSPITAL、REFERRALS)
修改后的完整代码:
library(ggplot2) library(reshape2) prev <- data.frame( YEAR = seq(1990,1995), GP = c(7,9,14,12,11,12), HOSPITAL = c(0,0,0,0,0.5,0.8) ) d <- melt(prev, id.vars="YEAR") names(d)[2] <- "Datasets" prev2 <- data.frame( YEAR = seq(1990,1995), Datasets = rep("REFERRALS",6), value = c(0.5,0.9,1.2,3,7,11) ) ggplot(d, aes(YEAR, value, linetype=Datasets, color=Datasets)) + geom_line() + scale_linetype_manual(values=c("solid","dashed","solid")) + scale_color_manual(values=c("black","black","blue")) + # 精准指定每个数据集的颜色 scale_x_discrete(limits=seq(1990,1995,1)) + geom_vline(xintercept=1991, col="darkgrey") + geom_vline(xintercept= 1994, col="darkgrey") + geom_line(data=prev2, aes(y=value)) + # 无需再单独指定颜色,全局映射已覆盖 scale_y_continuous(sec.axis=sec_axis(~.*7,name="number of referrals")) + theme_bw() + xlab("\nYear") + ylab("Prevalence") + theme(legend.justification=c(.1,.9), legend.position=c(.05,.96), legend.title=element_blank(), plot.margin = unit(c(.5,.5,.5,.5), "cm"), axis.title.y.right = element_text(color="blue"))
原理说明:
当你直接在geom_line()里设置col="blue"时,ggplot会把这个颜色当作该图层的固定属性,同时会强制覆盖图例中所有线条的颜色。而把颜色放进aes()后,ggplot会将颜色和线型一样,作为与Datasets关联的映射变量,此时通过scale_color_manual()就能精准控制每个类别的颜色,让GP和HOSPITAL保持黑色,REFERRALS显示蓝色,图例也会正确对应各自的颜色和线型。
内容的提问来源于stack exchange,提问作者Joanne Demmler
相关产品推荐
相关产品推荐

