对分组变量中的因子进行重新排序,以便可以使用ggplot2对其进行绘制

时间:2019-07-03 23:02:42

标签: r ggplot2 dplyr

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

我正在根据按工作类别,性别/种族,性别和平均年龄分组的数据集进行工作。我已经可以使用以下代码按性别成功订购此商品:

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对其进行图形处理时,会产生以下结果:

output

显然,这是因为ggplot2是按因子顺序而不是排列的数据帧顺序绘制图形。我已经尝试了多种方法来重新设置genXrce,具体取决于上面代码中的genXrce安排,包括重新设置,变异和重新排序。

我的问题是:如何以ggplot2生成图表的方式对数据进行重新排序/排列,该图表以与生成的表格相同的方式给出按性别分组的上升平均值?任何建议,不胜感激。

编辑1: 在下面的评论中,建议使用forcats或类似的功能通过ggplot安排图表。像这样的例子:

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

但是,这将平均排列所有genXrce因子,并且不再按性别分开。需要明确的是,油印顺序应与表格相同->女白,女黑,女其他,女亚洲,男白,男黑....

上面的ggplot产生下面的图,它混淆了性别: 2nd graph

1 个答案:

答案 0 :(得分:1)

给您的数据框rsltProf带有所需顺序的行,将genXrce转换为因子,该因子的水平由该列的行顺序指定:

library(dplyr)
library(ggplot2)

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

enter image description here