如何根据 R 中 ggplot2 表示的其他因素的水平(嵌套排序)对因素的水平进行排序

Posted

技术标签:

【中文标题】如何根据 R 中 ggplot2 表示的其他因素的水平(嵌套排序)对因素的水平进行排序【英文标题】:How to sort levels of a factor according to the levels of other factors (Nested sorting) for ggplot2 representation in R 【发布时间】:2021-11-17 07:11:42 【问题描述】:

我正在努力解决一个在 excel 中需要一秒钟才能解决的超级简单问题,但我在 R 中找不到解决方案。我查看了许多其他帖子并尝试了不同的代码,但它仍然没有不行。

这是一个示例,说明我的数据在假设我们正在处理汽车时的样子。我有两个因素:“品牌”和“型号”(嵌套在“品牌”中);和一个“变量”。

brand = c("Mercedes","Mercedes","Mercedes","Mercedes","Mercedes",
          "Mercedes","Mercedes","Mercedes","Mercedes","BMW",
          "BMW","BMW","BMW","BMW","BMW","BMW","BMW","BMW")
model = c("SL_class", "SL_class", "SL_class", "A_class", 
          "A_class", "A_class", "E_class", "E_class", 
          "E_class", "4 Series", "4 Series", "4 Series", 
          "X1", "X1", "X1", "Z4", "Z4", "Z4")
variable = c(5,6,7,12,13,14,1,2,3,7,8,9,22,24,25,11,12,14)

data = data.frame(brand, model, variable)
data


data$brand <- factor(data$brand)
data$model <- factor(data$model)

我想以 x = 变量和 y = 模型的方式绘制这些数据:

library(tidyverse)

ggplot(data, aes(x = variable, y = model, color = brand)) +
  geom_boxplot()

但我也希望“型号”按“品牌”排序,然后按“型号”按字母顺序排序。像这样,但不必手动指定我的因子的所有级别。我的原始数据集很大,我想找到一种自动的方法:

data$model <- factor(data$model, 
                     levels = c("4 Series", "X1", "Z4", 
                                "A_class", "E_class", "SL_class"))
data$model = fct_rev(data$model)

ggplot(data, aes(x = variable, y = model, color = brand)) +
  geom_boxplot()

在 excel 中,我只需对数据进行自定义排序,将“品牌”指定为第一级排序(从 A 到 Z),将“模型”指定为第二级排序(从 A 到 Z)

除了这种排序,我还可以对“模型”的级别进行排序,首先按“品牌”(如前),然后按“变量”的中间值(从大到小)。

我可以设法按“变量”的中值(见下文)对它们进行排序,但我找不到之前按“品牌”排序的方法。

data %>% 
  mutate(model = fct_reorder(model, variable, .fun='median')) %>% 
  ggplot(., aes(x = variable, y = model, color = brand)) +
  geom_boxplot()

有人可以帮我吗? 谢谢

【问题讨论】:

【参考方案1】:

这是你想要的吗?

我认为安排 -> fct_inorder 将是您最好的替代该 excel 功能的替代品。

data %>%
  arrange(desc(as.character(brand)), desc(as.character(model))) %>%
  mutate(model = fct_inorder(model)) %>%
  ggplot(aes(x = variable, y = model, color = brand)) +
  geom_boxplot()

或同等的

data %>%
  arrange(as.character(brand), as.character(model)) %>%
  mutate(model = fct_inorder(model) %>% fct_rev) %>%
  ggplot(aes(x = variable, y = model, color = brand)) +
  geom_boxplot() 

或者你的其他问题:

data %>%
  arrange(as.character(brand), variable) %>%
  mutate(model = fct_inorder(model) %>% fct_rev) %>%
  ggplot(aes(x = variable, y = model, color = brand)) +
  geom_boxplot() 

【讨论】:

感谢乔恩,这正是我想要的。我认为问题在于,在我的真实数据集中,我之前必须进行一些修改,最后我得到了一个空的因子水平。为此,我尝试的代码不起作用,但在删除空级别后它工作得很好。再次感谢您的帮助

以上是关于如何根据 R 中 ggplot2 表示的其他因素的水平(嵌套排序)对因素的水平进行排序的主要内容,如果未能解决你的问题,请参考以下文章

R:如何使用 ggplot2 创建一个半色半数的热图?

如何在不改变绘图宽度的情况下使用 ggplot2 在 R 中添加可变大小的 y 轴标签?

如何自定义 Plotly/R/ggplot2 动画断点(帧间距、持续时间)

R语言中ggplot2中stat=“identity”啥意思

R中的Cartogram + choropleth地图

ggplot2和其他函数(R)之间的加号[重复]