0

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

1 回答 1

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)

于 2020-07-11T15:22:39.077 回答