Тепловая карта футбольного матча в г. - PullRequest
0 голосов
/ 11 июля 2020

У меня есть фрейм данных с позицией игрока на поле. Ограничивающая рамка для области - 0 - 1000 и 0 - 750. Начальная позиция мяча - 375-500, а начальная позиция игрока - 637-692.

Я пытался использовать geom_tile, но могу ' Получите тепловую карту. Как связать переменные для создания тепловой карты?

frames <- structure(list(half = c("1T", "1T", "1T", "1T", "1T", "1T", "1T", 
"1T", "1T", "1T", "1T", "1T", "1T", "1T", "1T", "1T", "1T", "1T", 
"1T", "1T", "2T", "2T", "2T", "2T"), `ball-X` = c(375L, 375L, 
375L, 375L, 375L, 372L, 365L, 358L, 351L, 344L, 338L, 332L, 326L, 
320L, 315L, 310L, 305L, 301L, 300L, 309L, 631L, 631L, 631L, 631L
), `ball-Y` = c(500L, 500L, 500L, 500L, 500L, 490L, 470L, 450L, 
432L, 414L, 397L, 381L, 365L, 350L, 336L, 322L, 309L, 297L, 302L, 
304L, 577L, 582L, 589L, 596L), `L-2-X` = c(637L, 637L, 636L, 
636L, 639L, 639L, 641L, 643L, 645L, 648L, 652L, 656L, 660L, 665L, 
669L, 672L, 673L, 674L, 673L, 672L, 227L, 230L, 233L, 235L), 
    `L-2-Y` = c(692L, 692L, 691L, 688L, 685L, 684L, 681L, 678L, 
    674L, 669L, 663L, 657L, 649L, 641L, 633L, 624L, 615L, 606L, 
    596L, 587L, 438L, 445L, 452L, 460L)), class = "data.frame", row.names = c(NA, 
-24L))

ggplot(frames, aes(x = `L-2-X`, y = `L-2-Y`)) +
  scale_x_continuous(limits = c(0,750))+
  scale_y_continuous(limits = c(0,1000))+
  geom_tile(aes(fill = `L-2-X`)) +
  scale_fill_viridis_c(option = "B", direction = -1) + 
  theme_light()+
  facet_grid(~ half)

1 Ответ

1 голос
/ 11 июля 2020

Не уверен в конечном результате, которого вы пытаетесь достичь. Насколько я понимаю, ваш код работает нормально. Однако ваши плитки слишком малы, чтобы быть видимыми. Только когда я увеличил масштаб графика, появились крошечные плитки.

Поэтому я бы рекомендовал объединить данные, чтобы получить красивую тепловую карту. В качестве примера приведенный ниже код объединяет данные в квадраты размером от 25 до 25 (см?). Для заливки я просто подсчитываю количество наблюдений на квадрат. Другой подход - использовать, например, geom_hex, который использует шестиугольники для бинирования.

library(ggplot2)
library(dplyr)

# Bin data
frames_bin <- frames %>% 
  # Bin data
  mutate(l_2_x = cut(`L-2-X`, breaks = seq(0, 750, 25), labels = seq(0, 725, 25), include.lowest = TRUE),
         l_2_y = cut(`L-2-Y`, breaks = seq(0, 1000, 25), labels = seq(0, 975, 25), include.lowest = TRUE)) %>% 
  # Count number of obs per bin
  count(half, l_2_x, l_2_y) %>% 
  # Convert factors to numeric
  mutate_at(vars(l_2_x, l_2_y), ~ as.numeric(as.character(.x)))

ggplot(frames_bin) +
  scale_x_continuous(limits = c(0, 750)) +
  scale_y_continuous(limits = c(0, 1000)) +
  geom_tile(aes(x = l_2_x, y = l_2_y, fill = n)) +
  scale_fill_viridis_c(option = "B", direction = -1) + 
  theme_light()+
  facet_grid(~ half)

# Out of the box: use geom_hex
ggplot(frames) +
  scale_x_continuous(limits = c(0, 750)) +
  scale_y_continuous(limits = c(0, 1000)) +
  geom_hex(aes(x = `L-2-X`, y = `L-2-Y`, fill = ..ncount..)) +
  scale_fill_viridis_c(option = "B", direction = -1) + 
  theme_light()+
  facet_grid(~ half)

...