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中的热图足球比赛的主要内容,如果未能解决你的问题,请参考以下文章