ggplot2每个图例标签的不同文本颜色

Bra*_*ood 5 r ggplot2

我试图获取图例标签的文本颜色以匹配其关联的填充/线条颜色。理想情况下,我希望将标签颜色映射到美学上,但是在这一点上,我很乐意手动指定颜色。这是一些使用内置PlantGrowth数据集的测试代码,其中包括我手动指定标签颜色的尝试:

ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) +
    geom_boxplot() +
    scale_fill_discrete(guide=guide_legend(label.theme=element_text(angle=0,
                                                                    size=9,
                                                                    color=c("red",
                                                                            "green",
                                                                            "blue"))))
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,图例标签全部使用我指定的第一种颜色(红色)。相反,我希望每个图例标签使用不同的颜色。ggplot2当前是否可以进行此类操作?

Mik*_* H. 6

首先,我尝试使用当前尝试的不同版本进行实验,并使用,theme(legend.text = element_text(color = c("red","blue","green")))但上述方法均无效,因此我不得不转至gtable

您想要的是可能的,但是需要您非常熟悉gtables和gtable程序包。这看起来很混乱,因为有很多嵌套列表,而我们最终要修改的对象位于一个列表的底部。只要忍受我:

library(ggplot2)
library(gtable)
library(grid)
pGrob <- ggplotGrob(ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) +
  geom_boxplot() +
  scale_fill_discrete(guide=guide_legend(label.theme=element_text(angle=0,
                                                                  size=9))))



gb <- which(grepl("guide-box", pGrob$layout$name))
gb2 <- which(grepl("guides", pGrob$grobs[[gb]]$layout$name))
label_text <- which(grepl("label",pGrob$grobs[[gb]]$grobs[[gb2]]$layout$name))
pGrob$grobs[[gb]]$grobs[[gb2]]$grobs[label_text] <- mapply(FUN = function(x, y) {x$gp$col <- y; return(x)},
                                                           x =   pGrob$grobs[[gb]]$grobs[[gb2]]$grobs[label_text],
                                                           y =   c("red", "green", "blue"), SIMPLIFY = FALSE)

grid.draw(pGrob)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

创建gbgb2和的前3行label_text旨在动态地达到我们要修改的最低级别。有了获取对象的路径后,我们可以使用修改它们mapply并将更改col为所需的矢量。