按值对列重新排序,同时保持组顺序

时间:2019-07-03 01:09:41

标签: r ggplot2 tidyverse

我的数据(如下所示)包含三个变量,Tools(类别变量),Proficiency(值列)和Category(分组列)。 我想基于Proficiency值的降序对列进行排序,同时保持Category组的分隔,并且不使用facet_gridfacet_wrap(因为我正在使用{ {1}})。可复制的数据如下。要按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))) 值的降序进行分组。

first_image

完成所需分组和排序的一种方法是使用Proficiency,然后在facet_grid()调用中基于ToolsProficiency进行重新排序:

aes

image2

但是,我想在这个情节中使用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配合使用(github问题onetwo

可以预见的是,不使用facet_grid进行Proficiency排序会导致绘图覆盖facet_grid组。

image3

我想要的输出是上面的图像,其中Category首先按Tools排序,其次按Category排序。非常感谢您的帮助。

This answer看起来很有前途,但是在这里应用类似的方法对我来说并不奏效;下面的操作只是通过Proficiency设置了要排序的图:

Proficiency

2 个答案:

答案 0 :(得分:1)

一种方法是按照所需顺序排列数据框,并按该顺序设置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

答案 1 :(得分:0)

使用功能fct_infreq( )


ggplot(df2, aes(fct_infreq(x),y))+
 geom_col()