Facet_wrap с макетом, как Facet_grid - PullRequest
       4

Facet_wrap с макетом, как Facet_grid

0 голосов
/ 17 февраля 2020

Использование facet_grid оборачивает панели в соответствии с уровнями факторов в предоставленных переменных, даже если данные для данной комбинации отсутствуют. Это поведение, к которому я стремлюсь.

К сожалению, шкалы осей Y не могут быть независимыми от уровня отдельной панели (см. здесь и здесь ). Для этого вы должны использовать facet_wrap.

facet_wrap, однако, не обеспечивает тот же макет, что и facet_grid, и отображает только те панели, которые имеют значения для построения.

Как сохранить макет в стиле facet_grid, но с независимыми масштабами по оси Y? Это нормально, если панели без данных остаются пустыми, если они занимают соответствующее пространство.

Воспроизводимый пример:

library(ggplot2)
set.seed(1)

# Generate data
test <- data.frame(x = c(rep(1, 6), rep(2, 6)), 
                   facet_1 = rep(c("A", "A", "A", "B", "B", "C"), 2),
                   facet_2 = rep(c("B", "C", "D", "C", "D", "D"), 2),
                   y = c(1e0, 1e1, 1e2, 1e3, 1e4, 1e5, rnorm(1, 1e0, 1e0*.34), rnorm(1, 1e1, 1e1*.34), rnorm(1, 1e2, 1e2*.34), rnorm(1, 1e3, 1e3*.34), rnorm(1, 1e4, 1e4*.34), rnorm(1, 1e5, 1e5*.34)))

# facet_grid - Shows blank panels B-B, B-C, and C-C. This is what I want.
#            - Does NOT scale y appropriately at the individual panel level.
ggplot(test, aes(x = x, y = y)) +
  facet_grid(facet_2 ~ facet_1, scales = "free") +
  geom_line()

facet_grid example

# facet_wrap - Does NOT show blank panels B-B, B-C, and C-C.
#            - Does scale y appropriately at the individual panel level.
ggplot(test, aes(x = x, y = y)) +
  facet_wrap(vars(facet_1, facet_2), scales = "free") +
  geom_line()

facet_wrap example

1 Ответ

3 голосов
/ 17 февраля 2020

Вы можете complete пропустить комбинацию и затем построить.

library(ggplot2)

tidyr::complete(test, facet_1, facet_2, fill = list(x = 0, y = 0)) %>%
#Keeping them as NA would give a blank plot
#tidyr::complete(test, facet_1, facet_2) %>%
   ggplot() + aes(x = x, y = y) +
   facet_wrap(vars(facet_1, facet_2), scales = "free") +
   geom_line()

enter image description here

Это даст вам предупреждение, поскольку в этих 3 группах есть только одно наблюдение.

...