Тепловая карта R - изменить оси на переменную из функции - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать функцию в R, которая будет принимать два имени (символа) и два двойных. Затем он выведет тепловую карту ggplot2. Вот данные:

> dput(df)
structure(list(`0` = c(0.0608, 0.0791, 0.0514, 0.0223, 0.0072, 
0.0019, 4e-04, 1e-04, 0, 0, 0), `1` = c(0.0912, 0.1186, 0.0771, 
0.0334, 0.0109, 0.0028, 6e-04, 1e-04, 0, 0, 0), `2` = c(0.0684, 
0.0889, 0.0578, 0.025, 0.0081, 0.0021, 5e-04, 1e-04, 0, 0, 0), 
    `3` = c(0.0342, 0.0445, 0.0289, 0.0125, 0.0041, 0.0011, 2e-04, 
    0, 0, 0, 0), `4` = c(0.0128, 0.0167, 0.0108, 0.0047, 0.0015, 
    4e-04, 1e-04, 0, 0, 0, 0), `5` = c(0.0038, 0.005, 0.0033, 
    0.0014, 5e-04, 1e-04, 0, 0, 0, 0, 0), `6` = c(0.001, 0.0013, 
    8e-04, 4e-04, 1e-04, 0, 0, 0, 0, 0, 0), `7` = c(2e-04, 3e-04, 
    2e-04, 1e-04, 0, 0, 0, 0, 0, 0, 0), `8` = c(0, 1e-04, 0, 
    0, 0, 0, 0, 0, 0, 0, 0), `9` = c(0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0), `10+` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), class = "data.frame", row.names = c("0", 
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10+"))

Теперь, если я жестко закодирую имена на осях (homeScore и awayScore), это сработает:

  df %>% 
    as_tibble(rownames = "awayScore") %>%
    pivot_longer(cols = -awayScore, names_to = "homeScore", values_to = "probability") %>%
    mutate_at(vars(awayScore, homeScore), ~forcats::fct_relevel(.x, "10+", after = 10)) %>% 
    ggplot() + 
    geom_tile(aes(x=awayScore, y=homeScore, fill = probability)) +   
    scale_fill_gradient2(low = "red", mid = "white", high = muted("blue"))+
    theme(plot.margin = unit(c(2,2,2,2),"cm"))

Это результат:

enter image description here

But now, I want homeScore and awayScore to be variables in a function. So this is my new function with the same df:

TestFunction<-function(home,away){
  
  
  df %>% 
    as_tibble(rownames = away) %>%
    pivot_longer(cols = -away, names_to = "home", values_to = "probability") %>%
    mutate_at(vars(away, home), ~forcats::fct_relevel(.x, "10+", after = 10)) %>% 
    ggplot() + 
    geom_tile(aes(x=away, y=home, fill = probability)) +   
    scale_fill_gradient2(low = "red", mid = "white", high = muted("blue"))+
    theme(plot.margin = unit(c(2,2,2,2),"cm"))
  
}

But this plot is not what's expected:

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

Что мне нужно, чтобы homeScore и awayScore на любой из осей стали переменными из функции?

1 Ответ

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

Если вы хотите использовать строки в aes вместо имен переменных фрейма данных, вам нужно вместо этого использовать функцию aes_string.

Вот ваш обновленный код:

TestFunction<-function(home,away){
    df %>% 
    as_tibble(rownames = away) %>%
    pivot_longer(cols = -away, names_to = home, values_to = "probability") %>%
    mutate_at(vars(away, home), ~forcats::fct_relevel(.x, "10+", after = 10)) %>% 
    ggplot() + 
    geom_tile(aes_string(x=away, y=home, fill = "probability")) +   
    scale_fill_gradient2(low = "red", mid = "white", high = muted("blue"))+
    theme(plot.margin = unit(c(2,2,2,2),"cm"))
  
}
TestFunction("homeScore",'awayScore')

Обратите внимание, что я изменил строку pivot_longer, чтобы включить name_to=home (у вас это было жестко запрограммировано), а также в aes_string я поместил кавычки в fill="probability

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

...