Мои данные (воспроизведенные ниже) содержат три переменные: Tools
(категориальная переменная), Proficiency
(столбец значений) и Category
(столбец группировки).Я хотел бы отсортировать столбцы по убыванию значения Proficiency
, сохраняя разделение групп Category
и не используя facet_grid
или facet_wrap
(потому что я использую coord_flip
).Воспроизводимые данные приведены ниже.Чтобы отсортировать по Category
, я указываю уровни Tools
на основе коэффициента Category
.
library(tidyverse)
df1 <- structure(list(Tools = structure(c(1L, 8L, 9L, 5L, 6L, 10L, 2L,
3L, 4L, 7L), .Label = c("Tool1", "Tool7", "Tool8", "Tool9", "Tool4",
"Tool5", "Tool10", "Tool2", "Tool3", "Tool6"), class = "factor"),
Proficiency = c(3, 2, 5, 4, 3, 3, 3, 2, 2, 2), Category = structure(c(1L,
3L, 3L, 2L, 2L, 3L, 1L, 1L, 1L, 2L), .Label = c("Category1",
"Category2", "Category3"), class = "factor")), row.names = c(NA,
-10L), class = "data.frame")
df1$Tools <- factor(df1$Tools, levels = df1$Tools[order(df1$Category)])
ggplot(data = df1, aes(x = Tools, y = Proficiency, fill = Category)) +
geom_col() +
scale_x_discrete(limits = rev(levels(df1$Tools)))
Это дает приведенный ниже график, который явно не сгруппирован в порядке убывания Proficiency
значение.
Один из способов выполнить желаемую группировку и сортировку - использовать facet_grid()
и изменить порядок Tools
на основе Proficiency
в пределах aes
call:
ggplot(data = df1, aes(x = reorder(Tools, -Proficiency), y = Proficiency, fill = Category)) +
geom_col() +
facet_grid(~ Category, scales = "free_x", space = "free_x")
Однако я хотел бы использовать coord_flip
для этого сюжета.К сожалению, coord_flip
не очень хорошо работает с facet_grid
(проблемы с github one , two ).
Как и ожидалось, сортировка по Proficiency
без использованияfacet_grid
заставляет график переопределять группы Category
.
Мой желаемый вывод - это изображение выше, где сортируются Tools
во-первых, Category
, а во-вторых Proficiency
.Любая помощь очень ценится.
Этот ответ выглядел многообещающе, но применение подобного подхода здесь не сработало для меня;Приведенные ниже манипуляции просто настраивают график для заказа через Proficiency
:
df1$Tools <- with(df1, factor(Tools, levels=Tools[order(ave(Proficiency, Category, FUN=min),Proficiency)]))`