带有嵌套 `ggforce::facet_zoom` 的 Facet wrap 图

Uma*_*mao 6 r ggplot2 ggforce

我想使用ggplot2::facet_wrapfacet_grid使用使用ggforce::facet_zoom.

我也很乐意以与 类似的方式将它们排列起来facet_grid,最好使用条形文本标签,但也不太明白如何让它起作用。

例如一个分面图

library(ggplot2)
library(ggforce)
library(dplyr)

p1 <- ggplot(mtcars) +
  geom_boxplot(
    aes(
      x = factor(gear),
      y = mpg,
      fill = factor(gear)
    )
  ) +
  facet_wrap(
    facets = ~cyl,
    nrow = 2,
    scales = "free_y"
  )

p1
Run Code Online (Sandbox Code Playgroud)

但是每个方面都应该是这样的(这是上面的第一个方面):


zoomlims <- data.frame(
  cyl = c(4, 6, 8),
  lower = c(27, 18, 13),
  upper =c(32, 21, 17)
)

p2a <- ggplot(mtcars %>% filter(cyl == 4)) +
  geom_boxplot(
    aes(
      x = factor(gear),
      y = mpg,
      fill = factor(gear)
    )
  ) +
  facet_zoom(
    ylim = c(zoomlims$lower[1], zoomlims$upper[1]),
    zoom.size = 1
  )

p2a
Run Code Online (Sandbox Code Playgroud)

理想情况下,一个 facet 调用会将所有参数都用于 zoom 和 wrap,但它们不会,并且在另一个调用一个 facet 函数之后调用一个 facet 函数只会覆盖前一个函数,例如 zoom second

p3a <- ggplot(mtcars) +
  geom_boxplot(
    aes(
      x = factor(gear),
      y = mpg,
      fill = factor(gear)
    )
  ) +
  facet_wrap(
    facets = ~cyl,
    nrow = 2,
    scales = "free_y"
  ) +
  facet_zoom(
    ylim = c(zoomlims$lower, zoomlims$upper),
    zoom.size = 1
  )

p3a
Run Code Online (Sandbox Code Playgroud)

或者换行



p3b <- ggplot(mtcars) +
  geom_boxplot(
    aes(
      x = factor(gear),
      y = mpg,
      fill = factor(gear)
    )
  ) +
  facet_zoom(
    ylim = c(zoomlims$lower, zoomlims$upper),
    zoom.size = 1
  ) +
  facet_wrap(
    facets = ~cyl,
    nrow = 2,
    scales = "free_y"
  )

p3b
Run Code Online (Sandbox Code Playgroud)

可能可以通过拼凑来模仿这一点,但这也不起作用,并且不会包含包装中的条状文本(尽管可以注释)。


library(patchwork)
p2b <- ggplot(mtcars %>% filter(cyl == 6)) +
  geom_boxplot(
    aes(
      x = factor(gear),
      y = mpg,
      fill = factor(gear)
    )
  ) +
  facet_zoom(
    ylim = c(zoomlims$lower[1], zoomlims$upper[1]),
    zoom.size = 1
  )

p2c <- ggplot(mtcars %>% filter(cyl == 8)) +
  geom_boxplot(
    aes(
      x = factor(gear),
      y = mpg,
      fill = factor(gear)
    )
  ) +
  facet_zoom(
    ylim = c(zoomlims$lower[1], zoomlims$upper[1]),
    zoom.size = 1
  )


p4 <- p2a + p2b + p2c + plot_layout(nrow = 2, guides = "collect")

p4
Run Code Online (Sandbox Code Playgroud)

想法?

reprex 包(v0.3.0)于 2020 年 2 月 14 日创建

Bru*_*oto 0

我认为新版本ggforce解决了这个问题只需安装新版本devtools::install_github("thomasp85/ggforce")

发布文本: https ://github.com/thomasp85/ggforce/releases/tag/v0.4.0