R, ggplot2, ограничить ряды в граненом графике - PullRequest
0 голосов
/ 04 ноября 2019

Sup,

Рассмотрим следующие строки:

data

df=data.frame(
      prod=sample(1:30, 1000, replace=TRUE),
      mat=sample(c('yes', 'no'), 1000, replace=TRUE),
      fj=sample(c(1,2), 1000, replace = TRUE)
      )

plot

df %>%
  group_by(mat, prod, fj) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>%
  slice(1:5) %>%
  ggplot(aes(x = reorder(prod, n), y = n)) +
  geom_col(fill = RColorBrewer::brewer.pal(3, 'Dark2')[2], colour = "grey", alpha = 0.8) +
  labs(x = "Prod", y = "Qnt") +
  scale_y_continuous(labels = scales::comma) +
  coord_flip() +
  facet_wrap(fj ~ mat, scale="free") +
  theme_minimal()

, что дает мне plot

Теперь, если я уроню fj переменную, как в

df %>%
  group_by(mat, prod) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>%
  slice(1:5) %>%
  ggplot(aes(x = reorder(prod, n), y = n)) +
  geom_col(fill = RColorBrewer::brewer.pal(3, 'Dark2')[2], colour = "grey", alpha = 0.8) +
  labs(x = "Prod", y = "Qnt") +
  scale_y_continuous(labels = scales::comma) +
  coord_flip() +
  facet_wrap(~ mat, scale="free") +
  theme_minimal()

slice(1:5) делает свою работу, и у меня есть:

plot2

Вопрос

почему slice и reorder не работают должным образом, когда есть 3+ переменных и что я должен сделать, чтобы ограничить первыйсюжет до 5 строк каждая?

1 Ответ

2 голосов
/ 04 ноября 2019

Когда вы звоните summarize, вы теряете один уровень группировки. В этом случае вы потеряли fj, поэтому, когда вы slice не включены в групповые подразделения.

Если вы сначала ungroup, затем group_by mat и fj, я думаю, что вы в конечном итогето, что вы ищете.

df %>%
      group_by(mat, prod, fj) %>% 
      summarise(n = n()) %>% 
      ungroup()%>%
      group_by(mat,  fj) %>% 
      arrange(desc(n)) %>%
      slice(1:5) %>%
      ggplot(aes(x = reorder(prod, n), y = n)) +
      geom_col(fill = RColorBrewer::brewer.pal(3, 'Dark2')[2], colour = "grey", alpha = 0.8) +
      labs(x = "Prod", y = "Qnt") +
      scale_y_continuous(labels = scales::comma) +
      coord_flip() +
      facet_wrap(fj ~ mat, scale="free") +
      theme_minimal()

enter image description here

Это оставляет проблему переупорядочения переменной prod внутри каждого фасета. В приведенном выше примере это не работает, поскольку вы упорядочиваете весь фрейм данных, и некоторые значения Prod повторяются в нескольких аспектах. Как обсуждалось в этом сообщении в блоге @ 1016 * @drsimonj, вам нужно создать переменную порядка и построить график на основе этого. Это следует / явно копирует метод, изложенный в сообщении в блоге.

df %>%
      group_by(mat, prod, fj) %>% 
      summarise(n = n()) %>% 
      group_by(mat,  fj) %>% 
      arrange(desc(n)) %>%
      slice(1:5) %>%
      ungroup() %>%
      arrange(fj,mat, n) %>%  # arrange the entire table by the facets first, then by the n value
      mutate(row.order = row_number()) %>%  # create dummy variable
      ggplot(aes(x = row.order, y = n)) +  # plot by the dummy variable
      geom_col(fill = RColorBrewer::brewer.pal(3, 'Dark2')[2], colour = "grey", alpha = 0.8, position = "dodge") +
      labs(x = "Prod", y = "Qnt") +
      scale_y_continuous(labels = scales::comma) +
      scale_x_continuous(   # add back in the Prod values 
            breaks = df2$row.order,
            labels = df2$prod
      )+
      coord_flip() +
      facet_wrap(fj ~ mat, scales = "free") +
      theme_minimal()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...