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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:56:35