ggplot2修改线条颜色后name3未在图例显示的问题求助
解决ggplot线条不在图例显示的问题
这问题我之前也碰到过,核心原因是:ggplot的图例只对aes()内部定义的美学映射生效。你把name3的color参数写在geom_line()外面,相当于直接硬编码颜色,ggplot不会把它当成需要生成图例项的映射关系,自然就不会出现在图例里啦。
给你两种解决方案,推荐第一种,更符合ggplot的语法逻辑:
方案一:统一用aes映射+手动指定颜色
把所有线条的颜色都放到aes()内部定义,然后用scale_color_manual()精准控制每个系列的颜色,这样三个线条都会出现在图例中:
clist <- list(c(1:39), c(2:40), c(3:41)) clist.ts <- lapply(clist, function(x) ts(x, frequency = 1, start = 1978)) ind78_ymean_tsdf <- as.data.frame(clist.ts) names(ind78_ymean_tsdf) <- c("name1", "name2", "name3") ind78_ymean_tsdf$"Year" <- c(1978:2016) # 修改后的绘图代码 ggplot(ind78_ymean_tsdf, aes(x=Year)) + geom_line(aes(y=name1, color="Name One")) + geom_line(aes(y=name2, color="Name Two")) + geom_line(aes(y=name3, color="Name Three"), size=1.5) + # 把color移到aes里 labs(title="Development of the indices", x="Year", y="Index") + scale_color_manual( name="Individual replications", values=c("Name One"="red", "Name Two"="blue", "Name Three"="black") # 自定义各系列颜色 )
你可以把示例里的red、blue改成你想要的name1和name2的颜色,灵活度很高。
方案二:手动添加图例项(不推荐,更繁琐)
如果你非要保持color在aes外的写法,可以用guides()手动补上图例项,但这种方法需要手动匹配样式,维护起来麻烦:
ggplot(ind78_ymean_tsdf, aes(x=Year)) + geom_line(aes(y=name1, color="Name One")) + geom_line(aes(y=name2, color="Name Two")) + geom_line(aes(y=name3), color="black", size=1.5) + labs(title="Development of the indices", x="Year", y="Index") + scale_color_discrete(name="Individual replications") + guides( color=guide_legend( override.aes = list( color=c("red", "blue", "black"), size=c(1,1,1.5) # 对应线条粗细 ) ) )
内容的提问来源于stack exchange,提问作者yaennu
相关产品推荐
相关产品推荐

