【问题标题】:ggplot2 change fill for color legend when fill also used in aesthetic当填充也用于美学时,ggplot2更改颜色图例的填充
【发布时间】:2020-01-25 02:54:48
【问题描述】:

在ggplot2的美学中也使用填充时,有没有办法控制颜色图例的填充?

例如。

dat<-data.frame(id=as.character(1:4), var1=rep(LETTERS[1:2], 2), var2=rep(LETTERS[3:4], 2))
dat
library(ggplot2)

ggplot(dat)+
  geom_bar(aes(id, color=var1, fill=var2))+
  scale_color_manual(values=c("A"="black", "B"="grey"))+
  theme_light()

在这个图例中,很难看到颜色图例中深灰色填充周围的浅灰色边框。我承认指定颜色并填充同一个图可能不是一个好习惯,因为很难理解哪种颜色意味着什么,并且填充对象周围的彩色边框很难区分,但我该怎么做如果我想?

通过在图中手动指定填充,可以在不指定填充的情况下控制图例中的填充颜色。

ggplot(dat)+
  geom_bar(aes(id, color=var1), fill="white")+
  theme_light()

我认为有一种方法可以使用主题中的参数来控制它,但是theme(legend.background=element_rect()) 控制了整个图例的背景(这是正确的)

ggplot(dat)+
  geom_bar(aes(id, color=var1, fill=var2))+
  scale_color_manual(values=c("A"="black", "B"="grey"))+
  theme_light()+
  theme(legend.background = element_rect(fill="blue"))

同样在主题中,theme(legend.key = element_rect(fill="blue")) 仅在图例中的var2 框周围添加一条细蓝线,legend.box 控制多个图例的排列(“水平”或“垂直”),theme(legend.box.background = element_rect(fill="blue")) 颜色var1var2 传说之间的背景。

我想也许图例使用 NA 的默认值进行填充,所以我尝试使用 scale_color_discrete() 手动指定它

ggplot(dat)+
  geom_bar(aes(id, color=var1, fill=var2))+
  scale_color_manual(values=c("A"="black", "B"="grey", 
                              na.translate=TRUE, na.value = "white"))+
  theme_light()

看起来和第一个情节一样。

这似乎应该由theme()scale_color_manual 中的参数控制,但我似乎无法弄清楚。
干杯

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    对于图例的数据相关方面,theme() 不会帮助您。相反,您需要使用 guides 并覆盖颜色图例的填充:

    ggplot(dat)+
        geom_bar(aes(id, color=var1, fill=var2))+
        scale_color_manual(values=c("A"="black", "B"="grey"))+
        guides(color = guide_legend(override.aes = list(fill = "white"))) +
        theme_light()
    

    一般规则是theme() 只控制绘图的整体外观,而不是像比例尺这样的数据相关部分(也许不是“数据相关”,它应该是“根据数据”)。

    【讨论】:

    • 谢谢,速度很快!我完全忘记了guides。也感谢theme()guide()之间的解释!
    【解决方案2】:

    在写下这个问题并尝试我能想到的一切的过程中,我确实找到了解决方案。它确实看起来有点hacky,需要过度绘图。

    dat<-data.frame(id=as.character(1:4), var1=rep(LETTERS[1:2], 2), var2=rep(LETTERS[3:4], 2))
    
    library(ggplot2)
    
    ggplot(dat)+
      geom_bar(aes(id, fill=var2))+
      geom_bar(aes(id, color=var1), alpha=0)+
      scale_color_manual(values=c("A"="black", "B"="grey"))+
      theme_light() 
    

    在这里,通过在填充条形图的顶部叠加 alpha=0 的颜色条形图,我可以获得所需的图,但感觉有点像 ggplot2 的损坏。我希望有更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多