geom_tile () в R: порядок сортировки - PullRequest
1 голос
/ 05 августа 2020

У меня есть фрейм данных, для которого я хочу построить тепловую карту:

dput(df)
structure(list(`0` = c(6.08, 7.91, 5.14, 2.23, 0.72, 0.19, 0.04, 
0.01, 0, 0, 0), `1` = c(9.12, 11.86, 7.71, 3.34, 1.09, 0.28, 
0.06, 0.01, 0, 0, 0), `2` = c(6.84, 8.89, 5.78, 2.5, 0.81, 0.21, 
0.05, 0.01, 0, 0, 0), `3` = c(3.42, 4.45, 2.89, 1.25, 0.41, 0.11, 
0.02, 0, 0, 0, 0), `4` = c(1.28, 1.67, 1.08, 0.47, 0.15, 0.04, 
0.01, 0, 0, 0, 0), `5` = c(0.38, 0.5, 0.33, 0.14, 0.05, 0.01, 
0, 0, 0, 0, 0), `6` = c(0.1, 0.13, 0.08, 0.04, 0.01, 0, 0, 0, 
0, 0, 0), `7` = c(0.02, 0.03, 0.02, 0.01, 0, 0, 0, 0, 0, 0, 0
), `8` = c(0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0), `9` = c(0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), `10 or more` = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0)), row.names = c("0", "1", "2", "3", "4", "5", 
"6", "7", "8", "9", "10 or more"), class = "data.frame")

Теперь, чтобы построить тепловую карту с помощью ggplot2, я подхожу к решению следующим образом:

df %>% 
as_tibble(rownames = "homeScore") %>%
pivot_longer(cols = -homeScore, names_to = "awayScore", values_to = "level") %>%
ggplot() +geom_tile(aes(x=homeScore, y=awayScore, fill = level))

Проблема, с которой я сталкиваюсь, заключается в том, что столбцы и строки сортируются по (0,1,10 +, 2, ..) вместо (0,1,2, ... 10+). Вот пример:

введите описание изображения здесь

Как отсортировать значения так, чтобы 10+ было последним для строки и столбца вместо третьего?

1 Ответ

1 голос
/ 05 августа 2020

Как уже упоминал @Nate, вам нужно преобразовать ваши вары в факторы и расположить уровни в правильном порядке. Вместо преобразования через factor(as.numeric(.)) (который преобразует «10 или более» в NA) я бы рекомендовал использовать forcats::fct_relevel, который позволяет вам изменять порядок уровней, например, forcats::fct_relevel(homeScore, "10 or more", after = 10) изменит порядок такие уровни, что 10 or more становится последним уровнем. Попробуйте это:

library(ggplot2)
library(tidyr)
library(dplyr)
library(forcats)

df %>% 
  as_tibble(rownames = "homeScore") %>%
  pivot_longer(cols = -homeScore, names_to = "awayScore", values_to = "level") %>%
  mutate_at(vars(homeScore, awayScore), ~forcats::fct_relevel(.x, "10 or more", after = 10)) %>% 
  ggplot() + 
  geom_tile(aes(x=homeScore, y=awayScore, fill = level))

...