以下数据集包含有关学校部门中有多少bad
,alright
和good
学生的信息。
students <- data_frame(
department = factor(c("Maths", "Physics", "Economics")),
bad = c(15, 20, 8),
alright = c(10, 22, 17),
good = c(8, 12, 5)
)
我整理数据集,然后使用它制作一个堆叠的条形图,以可视化每个类别和每个系中的学生人数:
tidy_students <- students %>%
gather(key = "student_quality", value = "number", -department)
ggplot(data = tidy_students, aes(x = department, y = number, fill = student_quality)) +
geom_bar(stat = "identity") +
coord_flip()
我希望能够根据学生的子类别对酒吧进行重新排序。例如,如果我想根据好学生的人数以降序排列,则顶部的栏将是物理系的,其次是经济学栏,最后是数学栏。
我正在使用的实际数据有更多的类别(部门)和子类别(学生素质),我希望能够根据任何子类别对栏进行重新排序。
我该如何实现?非常感谢您的帮助。
答案 0 :(得分:1)
条根据因子水平排序。就您而言,这些是
levels(tidy_students$department)
## [1] "Economics" "Maths" "Physics"
,然后从底部开始按顺序绘制条形图。您只需要做的就是更改因子中级别的顺序。例如,您可以明确指定所需的顺序:
tidy_students$department <- factor(tidy_students$department,
levels = c("Maths", "Economics", "Physics"))
因此,您的问题基本上可以归结为产生一个包含所需顺序水平的向量。
对于您在问题中提出的示例,我将向您展示如何执行此操作:根据正常学生的数量,以降序排列条形。由于条形图是从底部开始绘制的,因此我必须创建与之完全相反的顺序:
library(dplyr)
ordered <- filter(tidy_students, student_quality == "alright") %>%
arrange(number)
tidy_students$department <- factor(tidy_students$department, levels = ordered$department)
ggplot(data = tidy_students, aes(x = department, y = number, fill = student_quality)) +
geom_bar(stat = "identity") +
coord_flip()
您也可以使用arrange(desc(number))
降序排列。