根据子类别重新排列堆叠的ggplot2 beom_bar

时间:2018-07-27 17:44:51

标签: r ggplot2 bar-chart geom-bar

上下文

以下数据集包含有关学校部门中有多少badalrightgood学生的信息。

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()

enter image description here

我的目标

我希望能够根据学生的子类别对酒吧进行重新排序。例如,如果我想根据好学生的人数以降序排列,则顶部的栏将是物理系的,其次是经济学栏,最后是数学栏。

我正在使用的实际数据有更多的类别(部门)和子类别(学生素质),我希望能够根据任何子类别对栏进行重新排序。

我该如何实现?非常感谢您的帮助。

1 个答案:

答案 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()

enter image description here

您也可以使用arrange(desc(number))降序排列。