使用 facet_grid 时如何更改小平面边框的颜色

How to change color of facet borders when using facet_grid

当使用 facet_grid 时,ggplot2 用比平常更宽的白线划分构成方面变量的主要类别。这很好地满足了大多数目的。有时我想更清楚地显示这些主要分类之间的划分,并想用另一种颜色遮挡小平面划分。有没有办法做到这一点?谢谢

试试这个——您可以使用 strip.background 控制它,使用 element_rect 调用格式化。

qplot(hwy, cty, data = mpg) +
  facet_grid(. ~ manufacturer) +   
  theme(strip.text.x = element_text(size = 8,
                                    colour = "red", 
                                    angle = 90),
        strip.background = element_rect(fill = "darkblue",
                                        colour = NA)
  )

您可能需要使用 ggplot 的布局 table 和 gtable 功能。

library(ggplot2)
library(gtable)
library(grid)

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + 
     facet_grid(am ~ cyl)
## Get the plot grob
gt <- ggplotGrob(p)

## Check the layout
gtable_show_layout(gt)   # Vertical gaps are in columns 5 and 7
                         # and span rows 4 to 9
                         # Horizontal gap is in row 8
                         # and spans columns 4 to 9


## To automate the selection of the relevant rows and columns:
## Find the panels in the layout
## (t, l, b, r refer to top, left, bottom, right);
## The gaps' indices are one to the right of the panels' r index (except the right most panel);
## and one below the panels' b index (except the bottom most panel);
## Rmin and Rmax give the span of the horizontal gap;
## Bmin and Bmax give the span of the vertical gap;
## cols and rows are the columns and row indices of the gaps.

panels = subset(gt$layout, grepl("panel", gt$layout$name), t:r)

# The span of the horizontal gap
Rmin = min(panels$r)
Rmax = max(panels$r) + 1

#The span of the vertical gap
Bmin = min(panels$t) - 1
Bmax = max(panels$t)

# The columns and rows of the gaps
cols = unique(panels$r)[-length(unique(panels$r))] + 1
rows = unique(panels$t)[-length(unique(panels$t))] + 1

# The grob - orange rectangle
g = rectGrob(gp = gpar(col = NA, fill = "orange"))

## Add orange rectangles into the vertical and horizontal gaps
gt <- gtable_add_grob(gt, 
      rep(list(g), length(cols)),
      t=Bmin, l=cols, b=Bmax)

gt <- gtable_add_grob(gt, 
      rep(list(g), length(rows)),
      t=rows, l=Rmin, r=Rmax)

## Draw it
grid.newpage()
grid.draw(gt)

虽然晚了一年,但我发现这是一个简单的修复方法:

ggplot(mpg, aes(cty, hwy, color = factor(year)))+ 
  geom_point()+
  facet_grid(cyl ~ drv) +
  theme(panel.margin=unit(.05, "lines"),
        panel.border = element_rect(color = "black", fill = NA, size = 1), 
        strip.background = element_rect(color = "black", size = 1))

更新 2021-06-01


ggplot2 3.3.3 开始,属性 panel.margin 已弃用,我们应该改用 panel.spacing。因此,代码应该是:

ggplot(mpg, aes(cty, hwy, color = factor(year)))+ 
  geom_point()+
  facet_grid(cyl ~ drv) +
  theme(panel.spacing = unit(.05, "lines"),
        panel.border = element_rect(color = "black", fill = NA, size = 1), 
        strip.background = element_rect(color = "black", size = 1))