library(ggplot2)
library(plotly)
library(dplyr)
library(readr)
nba_data <- read_csv("nbastats.csv", locale = locale(encoding = "UTF-8"))
nba_data$Player <- iconv(nba_data$Player, from = "latin1", to = "UTF-8")
nba_data <- nba_data %>%
mutate(
Rank_PER = rank(-`PER?`, ties.method = "min"), # Higher PER = better rank
Rank_WS = rank(-WS, ties.method = "min"), # Higher WS = better rank
Rank_BPM = rank(-BPM, ties.method = "min"), # Higher BPM = better rank
Rank_VORP = rank(-VORP, ties.method = "min"), # Higher VORP = better rank
Avg_Rank = (Rank_PER + Rank_WS + Rank_BPM + Rank_VORP) / 4 # Average rank
)
fig <- plot_ly(nba_data, x = ~`USG%`) %>%
add_trace(y = ~`PER?`, type = 'scatter', mode = 'markers', name = 'PER',
text = ~paste("Player: ", Player, "<br>PER: ", `PER?`, "<br>USG%: ", `USG%`),
hoverinfo = "text", visible = TRUE) %>%
add_trace(y = ~WS, type = 'scatter', mode = 'markers', name = 'WS',
text = ~paste("Player: ", Player, "<br>WS: ", WS, "<br>USG%: ", `USG%`),
hoverinfo = "text", visible = FALSE) %>%
add_trace(y = ~BPM, type = 'scatter', mode = 'markers', name = 'BPM',
text = ~paste("Player: ", Player, "<br>BPM: ", BPM, "<br>USG%: ", `USG%`),
hoverinfo = "text", visible = FALSE) %>%
add_trace(y = ~VORP, type = 'scatter', mode = 'markers', name = 'VORP',
text = ~paste("Player: ", Player, "<br>VORP: ", VORP, "<br>USG%: ", `USG%`),
hoverinfo = "text", visible = FALSE) %>%
add_trace(y = ~Avg_Rank, type = 'scatter', mode = 'markers', name = 'Avg Rank',
text = ~paste("Player: ", Player, "<br>Avg Rank: ", round(Avg_Rank, 2), "<br>USG%: ", `USG%`),
hoverinfo = "text", visible = FALSE) %>%
layout(
title = "NBA Advanced Stats vs. Usage Rate",
xaxis = list(title = "Usage Rate (%)"),
yaxis = list(title = "Metric Value"), # Default title
updatemenus = list(
list(
buttons = list(
list(label = "PER", method = "update",
args = list(list(visible = c(TRUE, FALSE, FALSE, FALSE, FALSE)),
list(yaxis = list(title = "Player Efficiency Rating (PER)"),
title = "Player Efficiency Rating (PER) vs. USG%"))),
list(label = "WS", method = "update",
args = list(list(visible = c(FALSE, TRUE, FALSE, FALSE, FALSE)),
list(yaxis = list(title = "Win Shares (WS)"),
title = "Win Shares (WS) vs. USG%"))),
list(label = "BPM", method = "update",
args = list(list(visible = c(FALSE, FALSE, TRUE, FALSE, FALSE)),
list(yaxis = list(title = "Box Plus-Minus (BPM)"),
title = "Box Plus-Minus (BPM) vs. USG%"))),
list(label = "VORP", method = "update",
args = list(list(visible = c(FALSE, FALSE, FALSE, TRUE, FALSE)),
list(yaxis = list(title = "Value Over Replacement Player (VORP)"),
title = "Value Over Replacement Player (VORP) vs. USG%"))),
list(label = "Avg Rank", method = "update",
args = list(list(visible = c(FALSE, FALSE, FALSE, FALSE, TRUE)),
list(yaxis = list(title = "Average Rank (Lower is Better)", autorange = "reversed"),
title = "Average Rank of Advanced Stats vs. USG%")))
),
direction = "down",
x = 1.1,
xanchor = "left",
y = 1.2,
yanchor = "top"
)
)
)
fig