使用tidyverse根据另一个变量的字母顺序绘制要排序的因子的图

问题描述 投票:0回答:1

请考虑以下具有Nbr变量的数据集,该变量是具有无序水平的因子。该顺序应遵循数据集中char向量的字母顺序。我浏览了网络,寻找一种类似的情况,您想绘制基于另一个矢量对一个因子进行排序的图,并且我发现许多使用数值矢量而不是字符串矢量且不按字母顺序排列的问题。在“ R for Data Science”(又名R4DS)这本书的因素部分中没有找到解决方案。

MWE

df <- structure(list(Vis = structure(c(1L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 10L, 12L, 12L, 13L, 13L, 1L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 10L, 12L, 12L, 13L, 13L, 1L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 10L, 11L, 11L, 1L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 10L, 11L, 11L, 1L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 10L, 12L, 12L, 13L, 13L, 1L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 10L, 11L, 11L, 1L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 10L, 12L, 12L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"
), class = "factor"), char = c("Fro", "Fro", "Fro", "Fro", "Fro", 
"Fro", "Fro", "Fro", "Fro", "Fro", "Fro", "Fro", "Fro", "Fro", 
"Fro", "Fro", "Gae", "Gae", "Gae", "Gae", "Gae", "Gae", "Gae", 
"Gae", "Gae", "Gae", "Gae", "Gae", "Gae", "Gae", "Gae", "Gae", 
"Ada", "Ada", "Ada", "Ada", "Ada", "Ada", "Ada", "Ada", "Ada", 
"Ada", "Ada", "Ada", "Ada", "Ada", "Bal", "Bal", "Bal", "Bal", 
"Bal", "Bal", "Bal", "Bal", "Bal", "Bal", "Bal", "Bal", "Bal", 
"Bal", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", 
"Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Ebe", "Dei", 
"Dei", "Dei", "Dei", "Dei", "Dei", "Dei", "Dei", "Dei", "Dei", 
"Dei", "Dei", "Dei", "Dei", "Geb", "Geb", "Geb", "Geb", "Geb", 
"Geb", "Geb", "Geb", "Geb", "Geb", "Geb", "Geb", "Geb", "Geb"
), Nbr = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("5", 
"6", "1", "2", "4", "3", "7"), class = "factor")), row.names = c(NA, 
104L), class = "data.frame")

代码

ggplot() +
  geom_raster(aes(Vis, Nbr), data = df)

enter image description here

levels(df$Nbr)
[1] "5" "6" "1" "2" "4" "3" "7"

问题

如何使用tidyverse根据char向量的字母顺序对y轴(Nbr)因子进行排序?

r string ggplot2 factors
1个回答
0
投票

代码

library(tidyverse)
dfplot <- df %>%
  dplyr::arrange(desc(char))

ggplot() +
  geom_raster(aes(Vis, forcats::fct_inorder(Nbr)), data = dfplot)

输出

enter image description here

解决方案的提示

dplyr::arrange()工具与forcats::fct_inorder()结合使用以获得您喜欢的任何有序水平具有巨大的潜力。前者将根据数据帧中其他变量in为您进行factor的排序/安排/排序,而后者将在您的ggplot()内部保留安排的order图形。可能就是这个原因,它被称为[fct] _ [in] [order]()

参考

Hadley Wickham的打包forcats

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.