ggplot2在美学中也使用填充时更改颜色图例的填充

时间:2019-09-25 00:02:56

标签: r ggplot2

在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()

在此图例中,很难看到颜色图例中较深的灰色填充周围的浅灰色边框。我会承认,指定颜色并填写相同的图可能不是一个好习惯,因为可能很难理解哪种颜色意味着很难区分填充对象周围的颜色和边框,但是我将如何做如果我想

Here the background color for the color variable makes it difficult to see the grey outline

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

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

enter image description here 我以为可以使用主题中的参数来控制它,但是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"))

enter image description here

在主题方面,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中的参数来控制,但我似乎无法弄清楚。
欢呼声

2 个答案:

答案 0 :(得分:3)

对于图例中与数据相关的方面,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()仅控制图的整体外观,而不控制像比例尺这样的依赖数据的部分(也许不是“依赖数据的”,它应该是“变化的部分”)基于数据”)。

答案 1 :(得分:0)

在编写这个问题并尝试一切可能想到的过程中,我确实找到了解决方案。似乎确实有些骇人听闻,并且需要过多地绘图。

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的损坏。我希望有一个更好的答案。

enter image description here