如何按照多个变量重新排序条形图

3

我想绘制一个条形图,并根据 年级分数 排序条形。对于我的问题可能听起来有些傻。我知道如何按一个变量排序,但不知道两个变量怎么排序。有人可以教我吗?

df<-structure(list(ID = c("A1-18-603", "A1-19-604", "A2-20-605", 
"A1-21-606", "A1-22-607", "A2-16-601", "A5-17-602", "A1-14-502", 
"A1-15-503", "A1-13-501", "A5-12-403", "A2-10-401", "A1-11-402", 
"A2-07-301", "A5-08-302", "A3-09-303", "A1-06-203", "A1-05-202", 
"A3-04-201", "A1-02-102", "A6-03-103", "A1-01-101"), Score = c(33.58, 
12.88, 12.65, 12.19, 11.5, 9.66, 3.45, 26.22, 13.11, 11.96, 78.42, 
38.64, 16.1, 54.74, 12.88, 9.2, 114.53, 25.76, 22.54, 15.87, 
13.11, 6.67), Grade = c("6", "6", "6", "6", "6", "6", "6", "5", 
"5", "5", "4", "4", "4", "3", "3", "3", "2", "2", "2", "1", "1", 
"1")), row.names = c(NA, -22L), class = "data.frame")

ggplot(data = df)  +
    geom_bar(aes(y =  reorder(ID, desc(Grade)),  x = Score, fill = Grade), stat = "identity",  width = 0.8)

我可以按等级排序,但不知道如何按分数进一步排序。

输入图像说明


1
这个回答解决了你的问题吗?在ggplot2条形图中排序条形 - user14692575
相关内容请参见以下链接:https://dev59.com/MKLia4cB1Zd3GeqPg0yW - tjebo
3个回答

4

尝试这个经典技巧:

library(tidyverse)
df %>%
  mutate(reord = as.numeric(Grade) + as.numeric(Score),
         ID = fct_reorder(ID, reord, .desc = F)) %>% 
  ggplot() +
  geom_bar(aes(y =  reorder(ID, desc(Grade)),  x = Score, fill = Grade), stat = "identity",  width = 0.8)

使用 tidyverse 中的 forcats 包创建一个变量,按照 as.numeric(Grade) + as.numeric(Score) 进行排序,然后在 geom_bar 调用中使用这个单一变量进行重新排序。

完成后,可以直接从数据中删除 reord 变量,因为它只是一个临时的辅助变量。

enter image description here


as.numeric(Grade) + as.numeric(Score) 会得到一个数字,还是只是一个命令? - Stataq
这将是一个代表您想要的排序的数字。绘图后您不需要该变量,因此可以在之后删除它。我将编辑答案。 - BHudson
1
我们需要担心另一个等级+分数会被包含在另一个等级中吗? - Stataq
1
不可以,在Grade函数内部你定义了一个名为reord的数字变量,但是稍后又使用了reorder() - BHudson

4
这将按降序排列成绩和分数:
df %>% arrange(across(.cols=c("Grade", "Score"))) %>% 
  rowid_to_column() %>% 
ggplot()  +
  geom_bar(aes(y =  reorder(ID, rowid),  x = Score, fill = Grade), stat = "identity",  width = 0.8)

这将产生:

输入图片描述


2
这是一种方法。创建一个名为ord的变量,将其用于reorder调用中。
suppressPackageStartupMessages({
  library(dplyr)
  library(ggplot2)
})

df %>%
  mutate(ord = order(desc(Grade), Score)) %>%
  ggplot()  +
  geom_bar(
    aes(
      y = reorder(ID, ord),  
      x = Score, fill = Grade
    ), 
    stat = "identity",  
    width = 0.8
  )

reprex package (v2.0.1) 于2022年5月27日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接