переупорядочить каждый фасет по возрастанию для гистограммы с накоплением ggplot - PullRequest
0 голосов
/ 21 января 2019
library(tidyverse)
dat <- read.table(text = "A B C
                          1   23  234 324
                          2   34  534 12
                          3   56  324 124
                          4   34  234 124
                          5   123 534 654",
                  sep = "", 
                  header = TRUE) %>% 
  gather(key = "variable", value = "value") %>% 
  group_by(variable) %>% 
  mutate(ind = as.factor(rep(1:5)), 
         perc = value / sum(value))

ggplot(dat, aes(variable, perc, fill = ind)) + 
  geom_col() +
  scale_y_continuous(labels = scales::percent_format()) + 
  facet_grid(~ variable, scales = "free_x") + 
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

stacked bar

Приведенный выше код создает фасет с накоплением, который вы также видите выше. ind части каждой гистограммы упорядочены так же, как они отображаются в легенде.

Я предпочитаю, чтобы каждая ind часть вместо этого помещалась в порядке возрастания (или убывания). Обычно я достигаю этого благодаря @dgrtwo и функции reorder_within .

reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
  new_x <- paste(x, within, sep = sep)
  stats::reorder(new_x, by, FUN = fun)
}

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

Примечание. Скорее всего, это не дубликат нескольких других вопросов "переупорядочить в аспектах". Мне не удалось найти вопрос, касающийся гистограмм с накоплением, и проблему, которую я описал выше.

ggplot(dat, 
       aes(reorder_within(ind, value, variable), perc, fill = ind)) + 
  geom_col() +
  scale_y_continuous(labels = scales::percent_format()) + 
  facet_grid(~ variable, scales = "free_x") + 
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

stacked bar ascending

1 Ответ

0 голосов
/ 21 января 2019

После некоторых манипуляций этот ответ становится

dat <- dat %>% arrange(variable, -perc) %>% mutate(ordering = row_number())
aux <- with(dat, match(sort(unique(ind)), ind))
ggplot(dat, aes(x = variable, y = perc, fill = interaction(-ordering, variable))) + 
  geom_col() + facet_grid(~ variable, scales = "free_x") + 
  scale_fill_manual("ind", values = scales::hue_pal()(5)[dat$ind],
                    labels = with(dat, ind[aux]), 
                    breaks = with(dat, interaction(-ordering, variable)[aux])) +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) +
  scale_y_continuous(labels = scales::percent_format())

enter image description here

По сравнению со связанным ответом я в первую очередь отсортировал строки и добавил ordering. Что касается восстановления цветовой палитры по умолчанию, я также использовал hue_pal из scales. Это было необходимо из-за использования scale_fill_manual, в этом случае цвета должны быть предоставлены вручную.

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