ggplot2 geom_rect неправильно масштабируется под facet_grid - PullRequest
1 голос
/ 16 марта 2019

Вопрос: geom_rect предотвращает масштабирование из facet_grid с помощью ggplot2.

Мне интересно, вызвано ли это конфликтом в двух фреймах данных, но я не знаю, как решить эту проблему.Надеюсь, ты сможешь мне помочь.

Пример кода следующий:

library(ggplot2)
data_1 <- data.frame(x = c(seq(from = 1, to = 10, by = 1),
                           seq(from = 21, to = 50, by = 1)),
                     y = rnorm(40, mean = 3, sd = 1),
                     z = c(rep("A", 10), rep("B", 30)))

shade <- 
  data.frame(xmin = c(2, 6, 39),
             xmax = c(3, 8, 43),
             ymin = - Inf,
             ymax = Inf)

Если не использовать geom_rect, я могу масштабировать с помощью facet_grid соответственно следующим образом:

ggplot(data = data_1, aes(x = x, y = y)) +
  geom_bar(stat = "identity", fill = "blue") +
  facet_grid(.~z, space = "free_x", scales = "free_x")

результатвыглядит так:

enter image description here

Но если я нарисую geom_rect, то ранее показанная шкала исчезнет, ​​а код и график будут такими:

ggplot(data = data_1, aes(x = x, y = y)) +
  geom_bar(stat = "identity", fill = "blue") +
  geom_rect(data = shade, inherit.aes = FALSE,
            mapping = aes(xmin = xmin, 
                          xmax = xmax, 
                          ymin = ymin, ymax = ymax),
            fill = 'red', alpha = 0.2) +
  facet_grid(.~z, space = "free_x", scales = "free_x")

enter image description here

Как сохранить предыдущее масштабирование по x при рисовании этих geom_rect?

Любое предложение очень ценится.

1 Ответ

1 голос
/ 16 марта 2019

Диапазон оси x изменяется, поскольку данные в слое geom_rect выходят за пределы исходного графика.Шкала делает именно то, что от нее ожидают.

Если вы хотите, чтобы для каждого фасета отображались разные прямоугольники, было бы лучше включить переменную фасета в shade и сохранить только строки с xmin / xmax в пределах диапазона каждого аспекта.Например:

library(dplyr)
shade2 <- shade %>%
  # add facet-specific x-axis range information from data_1
  tidyr::crossing(data_1 %>% group_by(z) %>%
                    summarise(x1 = min(x),
                              x2 = max(x)) %>%
                    ungroup) %>%

  # filter for rects within each facet's x-axis range
  group_by(z) %>%
  filter(xmin >= x1 & xmax <= x2) %>%
  ungroup()

> shade2
# A tibble: 3 x 7
   xmin  xmax  ymin  ymax z        x1    x2
  <dbl> <dbl> <dbl> <dbl> <fct> <dbl> <dbl>
1     2     3  -Inf   Inf A         1    10
2     6     8  -Inf   Inf A         1    10
3    39    43  -Inf   Inf B        21    50

Сюжет:

ggplot(data = data_1, aes(x = x, y = y)) +
  geom_col(fill = "blue") + # geom_col is equivalent to geom_bar(stat = "identity")
  geom_rect(data = shade2, inherit.aes = FALSE,
            mapping = aes(xmin = xmin, xmax = xmax, 
                          ymin = ymin, ymax = ymax),
            fill = 'red', alpha = 0.2) +
  facet_grid(.~z, space = "free_x", scales = "free_x")

result

...