Изменение порядка столбцов по значению при сохранении порядка группы - PullRequest
0 голосов
/ 03 июля 2019

Мои данные (воспроизведенные ниже) содержат три переменные: 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значение.

first_image

Один из способов выполнить желаемую группировку и сортировку - использовать 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")

image2

Однако я хотел бы использовать coord_flip для этого сюжета.К сожалению, coord_flip не очень хорошо работает с facet_grid (проблемы с github one , two ).

Как и ожидалось, сортировка по Proficiency без использованияfacet_grid заставляет график переопределять группы Category.

image3

Мой желаемый вывод - это изображение выше, где сортируются Toolsво-первых, Category, а во-вторых Proficiency.Любая помощь очень ценится.

Этот ответ выглядел многообещающе, но применение подобного подхода здесь не сработало для меня;Приведенные ниже манипуляции просто настраивают график для заказа через Proficiency:

df1$Tools <- with(df1, factor(Tools, levels=Tools[order(ave(Proficiency, Category, FUN=min),Proficiency)]))`

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Одним из способов является размещение вашего фрейма данных в желаемом порядке и установка уровней коэффициентов Tools с этим заказом.

library(dplyr)
library(ggplot2)

df1 %>%
  arrange(desc(Category), desc(Proficiency)) %>%
  mutate(Tools = factor(Tools, levels = Tools)) %>%
  ggplot(aes(x = Tools, y = Proficiency, fill = Category)) + 
  geom_col() + 
  coord_flip() 

enter image description here

0 голосов
/ 03 июля 2019

Использовать функцию fct_infreq( )


ggplot(df2, aes(fct_infreq(x),y))+
 geom_col()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...