更改facet标签文本和背景颜色

77

我如何将灰色面标签(A和B)更改为红色背景,白色文本?

library(data.table)
A = data.table(x = 1:4, y = 1:4, z = c('A','A','B','B'))
ggplot(A) + geom_point(aes(x = x, y = y)) + facet_wrap(~z) + theme_bw()

在此输入图片描述

2个回答

122

你可以做:

ggplot(A) +
  geom_point(aes(x = x, y = y)) +
  facet_wrap(~z) +
  theme_bw()+
  theme(strip.background =element_rect(fill="red"))+
  theme(strip.text = element_text(colour = 'white'))

输入图片描述


7
可以只改变一个标签的颜色吗?比如说,我有5列数据,我想要突出显示其中间一列。 - Sergio
1
@Sergio;我已经很长时间没有使用ggplot,因此无法给出恰当的答案,抱歉。我可以建议你研究grob编辑(警告:繁琐),这个回答可能会给你一些启示。也许还有更简单的解决方案。 - Haboryme

25

对于其他想要更改单独面板标签的人,有一个解决方案在这里

g <- ggplot_gtable(ggplot_build(p))
stripr <- which(grepl('strip-r', g$layout$name))
fills <- c("red","green","blue","yellow")
k <- 1
for (i in stripr) {
  j <- which(grepl('rect', g$grobs[[i]]$grobs[[1]]$childrenOrder))
  g$grobs[[i]]$grobs[[1]]$children[[j]]$gp$fill <- fills[k]
  k <- k+1
}
grid::grid.draw(g)

enter image description here


  1. 我正在使用 R v. 3.6.1,看起来一些绘图组件的名称已经改变。为了重新创建相同的绘图,我将上面的第2行和第3行更改为:striprt <- which( grepl('strip-r', g$layout$name) | grepl('strip-t', g$layout$name) )fills <- c("red","green","blue","yellow", "red","green","blue")(还将第5行中的 stripr 更改为 striprt)。
  2. 随着 R 的最新重大更新,ggplot 和 grid 包可能会有即将到来的更改,这也会改变一些东西。 ¯_(ツ )_/¯
- filups21
2
在ggplot中没有本地实现这个的方法吗? - Herman Toothrot
1
以防其他人需要,对于我的新版本,我不得不将strip-r更改为strip-1,您可能需要首先键入g$layout$name来查看您特定的情节,这就是我意识到我的情节是-1的方式。 - Ahdee
对于那些遇到与@vashts85和@Matt相同的更新包问题的人,似乎是由于striprt匹配到的面板数量超过了实际数量。您可以在for循环中添加一行来跳过不是面板的情况:if(length(j)== 0)next - TKraft
@HermanToothrot - 不,ggplot本身无法实现这个功能。在我的回答中提供的链接中,Hadley Wickham说:“这需要对ggplot2进行根本性的更改,因此不幸的是不可能实现。”目前你只能使用像这样丑陋的解决方法。 - filups21
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接