我试图通过使用geom_text将由图例文本颜色匹配为由因子变量生成的文本的颜色.这里是一个最小的工作示例:
df <- data.frame(a=rnorm(10),b=1:10,c=letters[1:10],d=c("one","two")) p1 <-ggplot(data=df,aes(x=b,y=a)) p1 <- p1 + geom_text(aes(label = c,color=d,fontface="bold")) p1 <- p1 + scale_color_hue(name="colors should match",breaks=c("one","two"),labels=c("should be pink","should be blue")) p1
我确定它是一个简单的修复.任何有关以前职位的建议或参考将有所帮助.我没有找到任何具体的东西.
解决方法
从上面的joran的评论开始,您可以直接编辑Grobs.这是一个相当难看的代码,所以很抱歉(将有一个更优雅的方式来做这个使用网格命令 – 希望有人会发布].
library(grid) gglabcol <- function(plot1) { g <- ggplotGrob(plot1) # legend grobs g.b <- g[["grobs"]][[which(g$layout$name=="guide-Box")]] l <- g.b[["grobs"]][[1]][["grobs"]] # get grobs for legend symbols (extract colour) lg <- l[sapply(l,function(i) grepl("GRID.text",i))] # get grobs for legend labels lb <- l[sapply(l,function(i) grepl("guide.label",i))] # get change colour of labels to colour of symbols for(i in seq_along(lg)) { lb[[i]]$gp$col <- lg[[i]]$gp$col g.b[["grobs"]][[1]][["grobs"]][sapply(g.b[["grobs"]][[1]][["grobs"]],i))][[i]] <- lb[[i]] } # overwrite original legend g[["grobs"]][[which(g$layout$name=="guide-Box")]] <- g.b grid.draw(g) invisible(g) }
情节
gglabcol(p1)