利用RStudio进行NBA投篮数据可视化数据获取有门道

北单实体店微信:200833335 2025-08-16 16:23

想知道NBA球员和球队的投篮数据吗?用图表展示很方便。下面开始探索NBA投篮数据的图表分析。

数据可视化的起因

看到一张NBA投篮的图片,我立刻产生深入研究投篮数据的想法。目前NBA比赛非常受欢迎,球员的投篮情况是大家讨论的重点。到底各个球员和队伍在投篮方面有哪些不同之处?通过把投篮数据用图形的方式展现出来,可以很清楚地了解

面临的首个问题

需要展示投篮信息图表,必须先搜集投篮地点资料。互联网上虽然有很多NBA数据汇总,但很难找到系统性的原始资料。经过反复查找,意外发现NBA官方网站保存了这些资料,这为后续研究提供了便利。

数据的获取途径

image.png

能够从NBA的官方网站获取投篮的相关信息。以詹姆斯为例,他在2019到2020年的常规赛期间,其投篮的统计数据可以在一个特定的网页上找到。在这个网页上进行一些操作,挑选出合适的选项,就可以得到他那个赛季到目前为止的投篮情况。如果选择SHOT PLOT这个功能,网页会展示出对应的图表,而且可以在网页的构成中找到特定的代码。

数据的抽取方法

<g class="shotplot__shots">
  <g class="shotplot__shot shotplot__miss" ng-repeat="shot in events | filter:{madeflag:false}" ng-attr-transform="translate({{ ::shot.locX }}, {{ ::shot.locY }})" svg-include="#shotplot-miss-template" data-index="0" data-y="124" data-x="221" data-period="1" data-clock="10:59" data-madeflag="false" data-team-id="1610612745" data-team-name="Houston Rockets" data-player-id="201935" data-player-name="James Harden" data-shot-type="3PT Field Goal" transform="translate(124, 221)">
    <title>Harden, James - Q1 10:59title>
    <line x1="-4" x2="4" y1="-4" y2="4">line>
    <line x1="4" x2="-4" y1="-4" y2="4">line>
  g>
  ...
g>

把网页中的相关部分下载下来,保存为HTML文件,然后借助R语言的文本处理功能,从文件内容里找出需要的信息。通过一系列步骤,最终把数据整理得井井有条。这个方法虽然麻烦了些,不过能获得准确的数据,所以觉得这样做很值。

投篮数据可视化准备

library(dplyr)
hd = readLines("./data/HardenJames_Playoffs_201920.html")
# --- find the rows containing data of shot MISS ---
rows = grep(pattern = "shotplot__shot shotplot__miss", hd)
hd_miss = hd[rows]
# find these key fields: data-y, data-x, data-period, data-clock, data-madeflag, data-team-id, data-team-name, data-player-id, data-player-name, data-shot-type
char_from = gregexpr("data-y", hd_miss) %>% unlist
char_end = gregexpr(" transform", hd_miss) %>% unlist - 1
miss_key_fields = substr(hd_miss, char_from, char_end)
# get the key fields:
get_keys = function(x){
  strsplit(x, split = " d") %>% 
          unlist() %>%
          gsub(pattern = "data", replacement = "ata") %>%
          gsub(pattern = "=.*$", replacement = "") %>%
          paste0("d",.)
}
miss_keys = get_keys(miss_key_fields[1])
# get the value fields:
get_values = function(x){
  strsplit(x, split = " d") %>% 
          unlist() %>%
          gsub(pattern = "data", replacement = "ata") %>%
          gsub(pattern = "ata.*=", replacement = "")
}
# test
get_values(miss_key_fields[1])
miss_values = sapply(miss_key_fields, get_values, simplify = "matrix")
miss_values_mat = matrix(unlist(miss_values), ncol = 10, byrow = TRUE)
# using miss_keys as column names
colnames(miss_values_mat) = miss_keys
dim(miss_values_mat)
# --- find the rows containing data of shot MAKE---
rows = grep(pattern = "shotplot__shot shotplot__make", hd)
hd_make = hd[rows]
# find these key fields: data-y, data-x, data-period, data-clock, data-madeflag, data-team-id, data-team-name, data-player-id, data-player-name, data-shot-type
char_from = gregexpr("data-y", hd_make) %>% unlist
char_end = gregexpr(" transform", hd_make) %>% unlist - 1
make_key_fields = substr(hd_make, char_from, char_end)
# get the key fields:
get_keys = function(x){
  strsplit(x, split = " d") %>% 
          unlist() %>%
          gsub(pattern = "data", replacement = "ata") %>%
          gsub(pattern = "=.*$", replacement = "") %>%
          paste0("d",.)
}
make_keys = get_keys(make_key_fields[1])
# get the value fields:
get_values = function(x){
  strsplit(x, split = " d") %>% 
          unlist() %>%
          gsub(pattern = "data", replacement = "ata") %>%
          gsub(pattern = "ata.*=", replacement = "")
}
# test
get_values(make_key_fields[1])
make_values = sapply(make_key_fields, get_values, simplify = "matrix")
make_values_mat = matrix(unlist(make_values), ncol = 11, byrow = TRUE)
# using make_keys as column names
colnames(make_values_mat) = make_keys
dim(make_values_mat)
# --- combine miss (10 columns) and make (11 columns) togather ---
values_mat = rbind(miss_values_mat, make_values_mat[,-3]) # remove data-index from make_values_mat and then combine
hd_data = as.data.frame(values_mat)
# save as a csv file.
write.csv(hd_data, "./hd_2019_2020_regular_clean.csv", row.names = F, quote = F)

要在NBA场地图上标记投篮数据,需要找到合适的场地图片。网页代码显示,它确实提供了相应的背景图。通过查看代码,还能得到许多有用的信息。

可视化的意义与展望

hd_csv = read.csv("./hd_2019_2020_regular_clean.csv")
hd_csv

对NBA的投篮统计进行图形化展示很有价值。可以清晰地展示出球员和队伍的投球特点、擅长位置等。教练能根据这些信息优化打法,球迷也能更全面地认识心仪的选手。以后,这类数据图形化技术也许会运用得更普遍,帮助我们更好地理解篮球比赛。

image.png

各位认为用图表展示信息能让人们更好地明白篮球联赛的赛事吗?可以在留言区发表看法,同时请给这篇文章点个赞,并且转发出去。

下一篇: 昨日NBA 4场赛事获胜今日聊公牛VS骑士拉文表现出色
上一篇: NBA2KOL2助手官方版篮球资讯攻略尽在其中快来下载体验
相关文章
返回顶部小火箭