使用 tidyverse 根据另一个变量的字母顺序绘制具有要排序的因子的图形
Plot a graph with a factor to be ordered based on the alphabetic order of another variable using tidyverse
考虑下面的数据集,其中 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)
情节
levels(df$Nbr)
[1] "5" "6" "1" "2" "4" "3" "7"
问题
如何使用 tidyverse 根据 char
向量的字母顺序对 y 轴 (Nbr) 因子进行排序?
代码
library(tidyverse)
dfplot <- df %>%
dplyr::arrange(desc(char))
ggplot() +
geom_raster(aes(Vis, forcats::fct_inorder(Nbr)), data = dfplot)
输出
解决方案提示
将 dplyr::arrange()
工具与 forcats::fct_inorder()
工具相结合以获得您喜欢的任何有序级别的巨大潜力。前者将根据其他变量 in 为您执行 factor 的 sorting/arrangement/ordering 数据框,但后者将保留在您的 ggplot()
图表中安排了 order。可能这就是为什么它被称为 [fct]_[in][order]().
参考
Hadley Wickham 的软件包 forcats。
考虑下面的数据集,其中 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)
情节
levels(df$Nbr)
[1] "5" "6" "1" "2" "4" "3" "7"
问题
如何使用 tidyverse 根据 char
向量的字母顺序对 y 轴 (Nbr) 因子进行排序?
代码
library(tidyverse)
dfplot <- df %>%
dplyr::arrange(desc(char))
ggplot() +
geom_raster(aes(Vis, forcats::fct_inorder(Nbr)), data = dfplot)
输出
解决方案提示
将 dplyr::arrange()
工具与 forcats::fct_inorder()
工具相结合以获得您喜欢的任何有序级别的巨大潜力。前者将根据其他变量 in 为您执行 factor 的 sorting/arrangement/ordering 数据框,但后者将保留在您的 ggplot()
图表中安排了 order。可能这就是为什么它被称为 [fct]_[in][order]().
参考
Hadley Wickham 的软件包 forcats。