我的数据(如下所示)包含三个变量,Tools
(类别变量),Proficiency
(值列)和Category
(分组列)。
我想基于Proficiency
值的降序对列进行排序,同时保持Category
组的分隔,并且不使用facet_grid
或facet_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)))
值的降序进行分组。
完成所需分组和排序的一种方法是使用Proficiency
,然后在facet_grid()
调用中基于Tools
对Proficiency
进行重新排序:
aes
但是,我想在这个情节中使用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问题one,two)
可以预见的是,不使用facet_grid
进行Proficiency
排序会导致绘图覆盖facet_grid
组。
我想要的输出是上面的图像,其中Category
首先按Tools
排序,其次按Category
排序。非常感谢您的帮助。
This answer看起来很有前途,但是在这里应用类似的方法对我来说并不奏效;下面的操作只是通过Proficiency
设置了要排序的图:
Proficiency
答案 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()
答案 1 :(得分:0)
使用功能fct_infreq( )
ggplot(df2, aes(fct_infreq(x),y))+
geom_col()