我如何在 ggplot2 中按 geom / layer 进行分面?

How do I facet by geom / layer in ggplot2?

我希望用 ggplot 的 facet_grid 重新创建下面的 gridExtra 输出,但我不确定哪个变量 ggplot 与层标识在情节中。在这个例子中,有两个 geoms...

require(tidyverse)

a <- ggplot(mpg)
b <- geom_point(aes(displ, cyl, color = drv))
c <- geom_smooth(aes(displ, cyl, color = drv))
d <- a + b + c

# output below
gridExtra::grid.arrange(
  a + b,
  a + c,
  ncol = 2
) 

# Equivalent with gg's facet_grid
# needs a categorical var to iter over...
d$layers
#d + facet_grid(. ~ d$layers??)

我希望重新创建的 gridExtra 输出是:

如果您真的想在不同的方面显示不同的图,一种 hacky 方法是制作数据的单独副本并将其子集...

mpg2 <- mpg %>% mutate(facet = 1) %>%
  bind_rows(mpg %>% mutate(facet = 2))

ggplot(mpg2, aes(displ, cyl, color = drv)) +
  geom_point(data = subset(mpg2, facet == 1)) +
  geom_smooth(data = subset(mpg2, facet == 2)) +
  facet_wrap(~facet)

这样做的一种 hacky 方法是采用现有数据框并创建两个、三个您需要的数据框副本,并带有一个链接到它的值,以便稍后用于分面和过滤。将数据帧联合(或绑定)到一个数据帧中。然后设置 ggplot 和 geoms 并过滤每个 geom 以获得所需的属性。同样对于小平面,使用现有属性来拆分图。

这可以在下面看到:

df1 <- data.frame(
      graph = "point_plot",
      mpg
    )
df2 <- data.frame(
    graph = "spline_plot",
    mpg
  )

df <- rbind(df1, df2)

ggplot(df, mapping = aes(x = displ, y = hwy, color = class)) +
  geom_point(data = filter(df, graph == "point_plot")) +
  geom_smooth(data = filter(df, graph == "spline_plot"), se=FALSE) +
  facet_grid(. ~ graph)