【问题标题】:Heat map soccer game in rr中的热图足球比赛
【发布时间】: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)

【问题讨论】:

    标签: r ggplot2 heatmap geom-tile


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多