Я не уверен, что это обязательно лучше, но вот один подход, который дает тот же график в вашем вопросе:
df %>%
group_by(x) %>%
mutate(pct = n / sum(n)) %>%
ungroup() %>%
arrange(fill != "z", desc(pct)) %>%
group_by(fill) %>%
mutate(order = row_number()) %>%
ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
geom_col()
В зависимости от того, что вы на самом деле пытаетесь сравнить, вы можете рассмотретьдругой порядок или, возможно, аспекты.Например, рассмотрим, что происходит, когда вы выбираете фасет против укладки:
df %>%
group_by(x) %>%
mutate(pct = n / sum(n)) %>%
ggplot(aes(x, pct, fill = fill)) +
geom_col() +
facet_wrap(~ fill)
![enter image description here](https://i.stack.imgur.com/kohuV.png)
Обновление 2019-02-18 (за комментарии) Обновлениеабстрагироваться, зная z
раньше времени.Упорядочение по mean(pct)
для каждого fill
, за которым следует pct
:
df %>%
group_by(x) %>%
mutate(pct = n / sum(n)) %>%
group_by(fill) %>%
mutate(mean_pct = mean(pct)) %>%
arrange(desc(mean_pct), desc(pct)) %>%
mutate(order = row_number()) %>%
ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
geom_col()