首页 > 解决方案 > 重新排序分组变量中的因子,以便可以使用 ggplot2 按顺序绘制它

问题描述

我正在尝试制作一个图表,显示性别种族群体的平均年龄。图表本身应按平均年龄从最低平均年龄到最高平均年龄的顺序显示此信息,并按总体性别分组。

我正在处理按工作类别、性别/种族、性别和平均年龄分组的数据集。我已经能够使用以下代码按性别成功订购:

rsltProf = rslt %>% 
      filter(group == "Professionals" & avg > 0) %>%
      group_by(gender) %>%
      arrange(avg, .by_group = TRUE)
str(rsltProf$genXrce)

我得到以下输出:

    group          genXrce   gender      avg
1 Professionals Female-Asian Female 33.25397
2 Professionals Female-Other Female 37.55000
3 Professionals Female-White Female 39.89632
4 Professionals Female-Black Female 39.94118
5 Professionals   Male-Other   Male 32.80000
6 Professionals   Male-Asian   Male 37.86667
7 Professionals   Male-Black   Male 38.69767
8 Professionals   Male-White   Male 38.85294
Factor w/ 9 levels "Female-Asian",..: 4 2 3 1 9 7 8 6

太好了,这正是我想要的。但是,当我用 ggplot 绘制它时,它会产生以下结果:

输出

显然,这是因为 ggplot2 是按因子的顺序而不是排列的数据框的顺序绘制图形的。根据上面代码中的排列方式,我尝试了多种方法来重新调整 genXrce,但无济于事,包括重新调整、变异和重新排序。

我的问题是:我如何重新排序/排列数据,以使 ggplot2 生成一个按性别分组的上升平均值的图表,就像我制作的表格一样?非常感谢任何建议。

编辑 1:在下面的评论中,建议使用 forcats 或类似的函数通过 ggplot 排列图形。像这样的一个例子:

ggplot(data = rsltProf, mapping = aes(x =fct_reorder(!!as.name(genXrce), avg), y =  avg, fill = genXrce))

但是,这将平均安排所有 genXrce 因素,并且不再按性别分开。要清楚,条形图顺序应与表格相同->女性-白人,女性-黑色,女性-其他,女性-亚洲,男性-白色,男性-黑色...。

上面的 ggplot 产生了下面的图表,它混淆了性别: 第二张图

标签: rggplot2dplyr

解决方案


给定rsltProf具有所需顺序的行的数据框,转换genXrce为具有由该列的行顺序指定的级别的因子:

library(dplyr)
library(ggplot2)

rsltProf %>% 
  mutate(genXrce = factor(genXrce, levels = unique(.$genXrce))) %>% 
  ggplot(aes(genXrce, avg)) + geom_col()

在此处输入图像描述


推荐阅读