如何根据 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 表示的其他因素的水平(嵌套排序)对因素的水平进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在不改变绘图宽度的情况下使用 ggplot2 在 R 中添加可变大小的 y 轴标签?
如何自定义 Plotly/R/ggplot2 动画断点(帧间距、持续时间)