Графики с фасетной оберткой с помощью вложенного `ggforce :: facet_zoom` - PullRequest
4 голосов
/ 14 февраля 2020

Я хотел бы создать график с ggplot2::facet_wrap или facet_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

Но каждый фасет должен быть таким (это первый фасет выше):


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

В идеале один вызов фасета будет принимать все аргументы для увеличения и обернуть, но они этого не сделают, и вызов одной фасетной функции за другой просто переопределяет предыдущую, например, увеличение второй

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

Или обтекание второй



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

Возможно, можно скопировать c с помощью пэчворка, , но это не сработает либо , и не будет включать текст полосы из упаковки (хотя можно комментировать).


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

Мысли?

Создано в 2020-02-14 re прекс пакет (v0.3.0)

...