The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Visualization of European basketball data

Guillermo Vinue

2024-01-09

This document contains all the needed R code to reproduce the results described in the paper A Web Application for Interactive Visualization of European Basketball Data (https://doi.org/10.1089/big.2018.0124), which presents the dashboard available at https://www.uv.es/vivigui/AppEuroACB.html. This dashboard belongs to the platform available at https://www.uv.es/vivigui/basketball_platform.html.

# Firstly, load BAwiR and other packages that will be used in the paper:
library(BAwiR) # 1.3
library(tidyverse) # 1.3.2
library(FSA) # 0.8.22
library(gridExtra) # 2.3
# Code for Figure 1:
# Load the data_app_acb file with the ACB games from the 1985-1986 season to the 2017-2018 season:
load(url("http://www.uv.es/vivigui/softw/data_app_acb.RData"))
title <- " Number of Spanish and foreign players along the ACB seasons \n Data from www.acb.com"
get_pop_pyramid(data_app_acb, title, "eng")
# Create the data with games and players' info, add the advanced stats and compute the total numbers:
df0 <- do_join_games_bio("ACB", acb_games_1718, acb_players_1718)
df1 <- do_add_adv_stats(df0)
df2 <- do_stats(df1, "Total", "2017-2018", "ACB", "Regular Season")
# Code for Figure 2:
df3 <- df2[which(df2$Position == "Center"), c("MP", "PTS", "Name", "CombinID")]
df3 <- df3[df3$MP > 100,]
ggplot(df3, aes(x = c(df3[,1])[[1]], y = c(df3[,2])[[1]], group = Name)) +
  geom_point() +
  geom_text(aes(label = Name), size = 2, vjust = -0.8) +
  labs(x = colnames(df3)[1], y = colnames(df3)[2], 
       title = "ACB 2017-2018, Regular Season. Total stats. Centers.")
# Code for Table 2:
df4 <- df3 %>%
  mutate(Player_info = paste("http://www.acb.com/jugador.php?id=", CombinID, sep = "")) %>%
  select(-CombinID)
df5 <- df4[order(df4[,1][[1]], decreasing = TRUE),]
headtail(df5, 3)
# Code for Figure 3:
stats <- c("GP", "MP", "PTS", "FGPerc", "FTPerc", "TRB", "AST", "TOV", "PlusMinus", "PIR")
descr_stats <- c("Games played", "Minutes played", "Points", "Field goals percentage", 
                 "Free throws percentage", "Total rebounds", "Assists", "Turnovers", 
                 "Plus/minus", "Performance index rating")
df2_1 <- df2 %>% 
  select(1:5, stats, 46:49)

perc_plot_doncid <- get_bubble_plot(df2_1, "Doncic, Luka", descr_stats, 3, 7, 8) +
                        theme(strip.text.x = element_blank()) +
                        ggtitle(label = "Doncic, Luka",
                                subtitle = "ACB 2017-2018, Regular Season. Total stats.") +
                        theme(plot.title = element_text(size = 20))

perc_plot_abalde <- get_bubble_plot(df2_1, "Abalde, Alberto", descr_stats, 3, 7, 8) +
                        theme(strip.text.x = element_blank()) +
                        ggtitle(label = "Abalde, Alberto",
                                subtitle = "ACB 2017-2018, Regular Season. Total stats.") +
                        theme(plot.title = element_text(size = 20))

grid.arrange(perc_plot_doncid, perc_plot_abalde, ncol = 2)
# Code for Figure 4:
months <- c(df0 %>% distinct(Month))$Month
months_order <- c("September", "October", "November", "December",  "January", 
                  "February", "March", "April", "May", "June")
months_plot <- match(months_order, months)
months_plot1 <- months_plot[!is.na(months_plot)]
months_plot2 <- months[months_plot1]

df1_m <- df1 %>%
              filter(Player.x %in% c("Doncic, Luka", "Abalde, Alberto")) %>%
              group_by(Month) %>%
              do(do_stats(., "Average", "2017-2018", "ACB", "Regular Season")) %>%
              ungroup() %>%
              mutate(Month = factor(Month, levels = months_plot2)) %>%
              arrange(Month)

df1_m1 <- df1_m %>% 
  select(1:5, stats, 46:50) %>% 
  select(-EPS)
max_val <- max(df1_m1[,colnames(df1_m1) %in% stats])
min_val <- min(df1_m1[,colnames(df1_m1) %in% stats])
get_barplot_monthly_stats(df1_m1, "ACB 2017-2018, Regular Season. Monthly average stats.", 3) +
  scale_y_continuous(limits = c(min_val - 10, max_val + 10))
# Code for Figure 5:
df0$Compet <- "ACB"
plot_yearly <- get_stats_seasons(df0, "ACB", c("Doncic, Luka", "Abalde, Alberto"), 
                                 stats[1:4], "Regular Season", TRUE, FALSE)
plot_yearly$gg + 
  labs(title = "ACB 2017-2018, Regular Season. Yearly average stats.") +
  theme(strip.text.x = element_text(size = 15))
# Code for Figure 6:
levels_stats <- list("Offensive" = c("PTS", "FG", "FGA", "FGPerc", 
                                     "TwoP", "TwoPA", "TwoPPerc",
                                     "ThreeP", "ThreePA", "ThreePPerc",
                                     "FT", "FTA", "FTPerc", "ORB", "AST"),
                     "Defensive" = c("DRB", "STL", "PF"),
                     "Other" = c("GP", "MP", "TRB", "PlusMinus", "PIR"),
                     "Advanced" = c("EFGPerc", "PPS"))
get_heatmap_bb(df2, "Real_Madrid", levels_stats, "PlusMinus", 9, 
               paste("ACB", "2017-2018, Regular Season.", "Total stats.", sep = " "))
# Code for Figure 7:
get_shooting_plot(df2, "Real_Madrid", 3, 1, "ACB 2017-2018, Regular Season.", "en") +
  theme(plot.title = element_text(size = 15))
# Code for Figure 8:
df1_10 <- df1 %>% 
  filter(Day <= 10) 
teams <- as.character(rev(sort(unique(df2$Team))))
df_four_factors <- do_four_factors_df(df1_10, teams)
get_four_factors_plot(df_four_factors$df_rank, df_four_factors$df_no_rank, 
                      c("Real_Madrid", "Valencia"), "en") +
  ggtitle("ACB 2017-2018, Regular Season.")
# Code for Figure 9:
df0$Compet <- "ACB"
gg <- get_table_results(df0, "ACB", "2017-2018")
gg$plot_teams
# Code for Figure 10:
get_map_nats(df2) +
  ggtitle("ACB 2017-2018, Regular Season.")
sessionInfo()
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-redhat-linux-gnu (64-bit)
## Running under: Fedora 30 (Workstation Edition)
## 
## Matrix products: default
## BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so
## 
## locale:
##  [1] LC_CTYPE=es_ES.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=es_ES.UTF-8        LC_COLLATE=C              
##  [5] LC_MONETARY=es_ES.UTF-8    LC_MESSAGES=es_ES.UTF-8   
##  [7] LC_PAPER=es_ES.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.33   R6_2.5.1        jsonlite_1.8.7  evaluate_0.21  
##  [5] rlang_1.1.1     cachem_1.0.8    cli_3.6.1       jquerylib_0.1.4
##  [9] bslib_0.5.1     rmarkdown_2.24  tools_3.6.3     xfun_0.40      
## [13] yaml_2.3.7      fastmap_1.1.1   compiler_3.6.3  htmltools_0.5.6
## [17] knitr_1.43      sass_0.4.7

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.