r中的热图足球比赛

Posted

技术标签:

【中文标题】r中的热图足球比赛【英文标题】:Heat map soccer game in r 【发布时间】:2020-11-01 03:25:21 【问题描述】:

我有一个数据框,其中包含球员在球场上的位置。 该区域的边界框为 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】:

不确定您要达到的最终结果。据我所知,您的代码工作正常。但是,您的瓷砖太小以至于无法看到。只有当我放大情节时,才会出现一些小图块。

因此,我建议对数据进行分箱以获得漂亮的热图。例如,我下面的代码将数据按大小为 25 到 25(cm??)的正方形进行分类。对于填充,我只计算每平方的 obs 数量。另一种方法是使用例如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)

【讨论】:

以上是关于r中的热图足球比赛的主要内容,如果未能解决你的问题,请参考以下文章

python爬取足球比赛赛程笔记

OCAC暑期比赛第一场 D题 足球比赛中的危险状态 题解

十分钟,Python 带你看遍世界足球俱乐部沉浮

足球比赛的官方规则

足球比赛的官方规则

足球比赛的官方规则