重新排序分组变量中的因素,以便可以使用 ggplot2 按顺序绘制

标签 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 的级别,但均无济于事,包括重新调整级别、变异和重新排序。

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

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

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

不过,这样会把所有的genXrce因素按平均排列,不再按性别分开。需要明确的是,条形图顺序应与表格相同 --> 女性-白人、女性-黑人、女性-其他、女性-亚洲人、男性-白人、男性-黑人....

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

最佳答案

给定你的数据框 rsltProf,其中的行按所需的顺序排列,将 genXrce 转换为一个因子,其水平由该列的行顺序指定:

library(dplyr)
library(ggplot2)

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

enter image description here

关于重新排序分组变量中的因素,以便可以使用 ggplot2 按顺序绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878878/

相关文章:

r - 让foreach()和ggplot2相处融洽

r - 有办法 `pipe through a list'吗?

R Shiny 传递响应式(Reactive)到 selectInput 选择

r - ggplot2垂直颜色条标题右居中

r - R ggplot2绘制每小时数据

R: 如何对 ";"分隔的数值进行分隔和相加(maxed out memory问题)

r - 在 R 中截断但不舍入

python - python 中 ggplot 的文档和语法

r - R 中的嵌套匹配函数

r - 从一列数据帧中提取数据帧(tidyverse 方法)