ggplot2中geom_text颜色未按预期显示问题求助
ggplot2 geom_text颜色显示为黑色的原因及解决方法
问题原因
你使用scale_colour_manual时,只给"line"和"dot"这两个颜色映射值指定了对应颜色,但geom_text里color=anc的映射值是"red"、"yellow"、"blue",这些值不在手动颜色刻度的定义范围内。ggplot2会对所有未在手动刻度里定义的映射值默认使用黑色,所以底部的文本全部变成了黑色。
另外,你在geom_line和geom_point里把固定字符串(比如"line")放在aes()的color参数中,这会让这些字符串成为颜色映射的分类水平,和geom_text的anc值共用同一个颜色映射系统,而手动刻度没覆盖anc的取值,导致文本颜色被忽略。
解决方法
有两种实用的解决方式:
方式1:让文本颜色脱离统一颜色映射
把geom_text的color参数从aes()中移出来,直接指定为txt数据框的anc列,这样文本颜色就不受scale_colour_manual的影响了:
library(tidyverse) ln <- data.frame(xval=c(1,2,3),yval=c(3,2,5)) txt <- data.frame(xval=c(1,2,3),yval=c(0.5,0.5,0.5),txt=c("A","B","C"),anc=c("red","yellow","blue")) ggplot() + geom_line(data=ln, aes(x=xval, y=yval, color="line"), linewidth=1) + geom_point(data=ln, aes(x=xval, y=yval, color="dot"), size=2.5) + # 将color移出aes,直接绑定txt的anc列 geom_text(data=txt, aes(x=xval, y=yval, label=txt), color=txt$anc, size=3) + ylim(0, 6) + xlim(0, 4) + scale_colour_manual(name="", values = c("line"="cyan", "dot"="black"))
方式2:将文本颜色纳入手动刻度
如果希望文本的颜色也出现在图例中,可以把anc的取值加入scale_colour_manual的values参数里,因为你的anc列本身就是颜色名称,直接对应即可:
library(tidyverse) ln <- data.frame(xval=c(1,2,3),yval=c(3,2,5)) txt <- data.frame(xval=c(1,2,3),yval=c(0.5,0.5,0.5),txt=c("A","B","C"),anc=c("red","yellow","blue")) ggplot() + geom_line(data=ln, aes(x=xval, y=yval, color="line"), linewidth=1) + geom_point(data=ln, aes(x=xval, y=yval, color="dot"), size=2.5) + geom_text(data=txt, aes(x=xval, y=yval, label=txt, color=anc), size=3) + ylim(0, 6) + xlim(0, 4) + scale_colour_manual(name="", values = c("line"="cyan", "dot"="black", "red"="red", "yellow"="yellow", "blue"="blue"))
内容的提问来源于stack exchange,提问作者Ya Huang
相关产品推荐
相关产品推荐

