Переименуйте упорядоченные метки оси X в граненом ggplot - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь переименовать граненые, упорядоченные, отметки оси X в ggplot().

library(ggplot2)
library(dplyr)
set.seed(256)

myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}

n <- 15
dat <- data.frame(category = sample(letters[1:2], n, replace = T), 
                  name = myFun(n), 
                  perc = sample(seq(0, 1, by = 0.01), n, replace = TRUE))

to_plot <-
  dat %>% 
  group_by(category) %>%
  arrange(category, desc(perc)) %>%
  top_n(5, perc)

При построении графика я получаю

to_plot %>%
  ggplot(aes(x = name, y = perc)) +
  geom_bar(stat = "identity") +
  facet_wrap(~category, scales = "free_y") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

, который неупорядочен и совсем не тот, что я хочу, поэтому я делаю некоторые упорядочения, добавляя столбец «пустышки» из row_number()

to_plot %>%
  mutate(row_number = row_number()) %>%
  ungroup() %>%
  mutate(row_number = row_number %>% as.factor()) %>%
  ggplot(aes(x = row_number, y = perc)) +
  geom_bar(stat = "identity") +
  facet_wrap(~category, scales = "free_y") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

Это сближает меня, но мне все еще нужно изменить имена на оси X, поэтому я добавляю:

  scale_x_discrete(name = "name", labels = str_wrap(to_plot %>% pull(name), 3))

, но это повторяет только первую группу фасетовпо обоим аспектам, даже если данные на каждом графике верны

enter image description here

Я также попытался просто упорядочить все последовательно и разрешить обеим осям быть free в facet_wrap() fx, но, похоже, это тоже не работает:

new_plot <- 
  dat %>% 
  group_by(category) %>%
  arrange(category, desc(perc)) %>%
  ungroup() %>%
  mutate(row_number = row_number() %>% as.factor())


new_plot %>% 
  ggplot(aes(x = row_number, y = perc)) +
  geom_bar(stat = "identity") +
  scale_x_discrete(name = "name", labels = new_plot %>% pull(name)) +
  facet_wrap(~category, scales = "free") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

Как я могу обозначить x-отметки оси на нескольких facet_wrap() участках независимо друг от друга?Я чувствую, что упускаю что-то довольно простое здесь, но я не могу понять, что это такое.

1 Ответ

2 голосов
/ 04 апреля 2019
to_plot %>%
  ggplot(aes(x = name %>% forcats::fct_reorder(-perc), y = perc)) +
  geom_bar(stat = "identity") +
  facet_wrap(~category, scales = "free") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

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