如何在ggplot2中按geom /图层进行分面?

时间:2019-05-23 17:18:36

标签: r ggplot2 facet-wrap facet-grid

我希望使用gridExtra的facet_grid重新创建下面的ggplot输出,但是我不确定ggplot标识了图中的图层是什么。在此示例中,有两个几何...

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输出是:

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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)

enter image description here

答案 1 :(得分:2)

一种不明智的做法是获取现有数据帧,并创建所需的数据帧的两个,三个,许多副本,并为其链接一个值以用于构面并稍后进行过滤。将数据帧合并(或绑定)为一个数据帧。然后设置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)

enter image description here