【问题标题】:ggplot2 different text colors for each legend label [duplicate]每个图例标签的ggplot2不同的文本颜色[重复]
【发布时间】:2017-04-18 17:47:51
【问题描述】:

我正在尝试获取图例标签的文本颜色以匹配其关联的填充/线条颜色。理想情况下,我想将标签颜色映射到审美,但此时我很乐意手动指定颜色。下面是一些使用内置 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"))))

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    首先,我尝试使用您当前尝试的不同版本以及使用theme(legend.text = element_text(color = c("red","blue","green"))),但以上都不起作用,所以我不得不去gtables。

    您想要的都是可能的,但需要您非常熟悉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)
    

    创建 gbgb2label_text 的前 3 行都旨在动态到达我们要修改的底层。一旦我们有了获取对象的路径,我们就可以使用mapply 修改它们并将col 更改为您想要的向量。

    【讨论】:

    • 很好的答案!谢谢你。我将补充一点,如果您有多个图例并且只想将此更改应用于其中一个,我认为您需要小心如何为 gb2 分配值。由于所有图例都将具有“指南”名称,因此您需要检查要编辑的图例并相应地设置 gb2。这不太自动化,需要更多的动手工作。
    猜你喜欢
    • 2014-08-28
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2018-09-14
    相关资源
    最近更新 更多