Introduction

The purpose of this project is to use machine learning to create a model to predict the outcome of playoff series in the NBA.

Data Setup

Our team_data frame has one row per team per game played in the NBA back to 2004. Our player_data frame has one row per player per game played in the NBA back to 2004. Each of these data frames have basic box score info for the given player/team for the given game.

library(tidyverse)
library(tidymodels)
library(ggimage)
library(gt)
library(gtExtras)

team_data <- read_csv("team_game_data.csv")
player_data <- read_csv("player_game_data.csv")

We will manipulate the data to get a data frame with one row per team per playoff series.

playoff_games <- team_data |>
  filter(
    gametype == 4
  )

playoff_series <- playoff_games |>
  filter(
    # Find all game 1s
    # The last integer of the game ID is the game number of the series
    substr(nbagameid, nchar(nbagameid), nchar(nbagameid)) == 1,
  ) |>
  mutate(
    # Add variable representing round number
    # Playoff round is represented by the 6th integer of game ID
    round = substr(nbagameid, 6, 6)
  ) |>
  select(
    # select distinct series defining vars and playoff round number
    season,
    team = off_team,
    opponent = def_team,
    round,
    # Binary variable that indicates if the home team is "team" (1) or "opponent" (0)
    team_home = off_home,
    start_date = gamedate
  ) |>
  # summarise using playoff_games df and join it back
  left_join(playoff_games |>
              summarise(
                games = n(),
                team_wins = sum(off_win),
                .by = c(season, off_team, def_team)
              ) |>
              mutate(
                # Not needed, using for validation
                opponent_wins = games - team_wins
              ),
            by = c("season", 
                   "team" = "off_team", 
                   "opponent" = "def_team")
            ) |>
  mutate(
    # Binary var indicating if the "team" (1) or "opponent" (0) won the series
    series_win = ifelse(team_wins > opponent_wins, 1, 0)
  )

#2023-24 playoff games aren't included in my data set, so I will add them in manually
playoffs23 <- read_csv("playoffs23.csv")

p2_df <- playoff_series |>
  filter(
    # Going to use seasons back to 2014-15 for prediction purposes
    season >= 2014
  ) |>
  select(
    season,
    team,
    opponent,
    start_date,
    round,
    hca = team_home,
    series_win,
    games
  ) |>
  rbind(playoffs23)

Now that we have the playoff series that we want to make predictions for, we need to gather regular season data from that same season to create features with.

# Set up data
off_metrics <- team_data |>
  filter(
    # Regular Season
    gametype == 2
  ) |>
  summarise(
    ortg = (sum(points)*100) / sum(possessions),
    ppa = sum(shotattemptpoints) / sum(shotattempts),
    off_ast_pct = sum(assists) / sum(fgmade),
    oreb_pct = sum(reboffensive) / sum(reboundchance),
    off_tov_pct = (sum(turnovers)*100) / sum(possessions),
    wp = sum(off_win) / (sum(off_win) + sum(def_win)),
    .by = c(season, off_team)
  )

def_metrics <- team_data |>
  filter(
    # Regular Season
    gametype == 2
  ) |>
  summarise(
    drtg = (sum(points)*100) / sum(possessions),
    def_ast_pct = sum(assists) / sum(fgmade),
    dreb_pct = sum(rebdefensive) / sum(reboundchance),
    def_tov_pct = (sum(turnovers)*100) / sum(possessions),
    blk_pct = sum(blocksagainst) / sum(fg2attempted),
    .by = c(season, def_team)
  )

Combine features back to the playoff series we will be predicting.

p2_df <- p2_df |>
  # Join in team metrics
  left_join(
    off_metrics,
    by = c("season",
           "team" = "off_team")
  ) |>
  left_join(
    def_metrics,
    by = c("season",
           "team" = "def_team")
  ) |>
  # Join in opponent metrics
  left_join(
    off_metrics |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_off_team")
  ) |>
  left_join(
    def_metrics |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_def_team")
  ) |>
  mutate(
    nrtg = ortg - drtg,
    opp_nrtg = opp_ortg - opp_drtg,
    diff_nrtg = nrtg - opp_nrtg,
    series_win = as.factor(series_win),
    round = as.factor(ifelse(round == 4, 3, round)),
    diff_wp = wp - opp_wp,
    diff_drtg = opp_drtg - drtg,
    diff_ortg = ortg - opp_ortg
  )

More Feature Engineering

I want to use just a few smart features for this prediction problem, instead of making a very complex model with a high quantity of variables. I had some ideas for intuitive features that seem to affect playoff series, and below I will work on creating good representations of them.

The features I want to capture are: How “hot” or “cold” a team finishes a season

# Try to capture how good a team is playing at the end of the season
ortg_since_jan <- team_data |>
  filter(
    months(gamedate) %in% month.name[1:8],
    gametype == 2
  ) |>
  summarise(
    ortg_since_jan = (sum(points)*100) / sum(possessions),
    wp_since_jan = sum(off_win) / (sum(off_win)+sum(def_win)),
    .by = c(season, off_team)
  )

drtg_since_jan <- team_data |>
  filter(
    months(gamedate) %in% month.name[1:8]
  ) |>
  summarise(
    drtg_since_jan = (sum(points)*100) / sum(possessions),
    .by = c(season, def_team)
  )

p2_df <- p2_df |>
  left_join(
    ortg_since_jan,
    by = c("season", 
           "team" = "off_team")
  ) |>
  left_join(
    drtg_since_jan,
    by = c("season", 
           "team" = "def_team")
  ) |>
  left_join(
    ortg_since_jan |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_off_team")
  ) |>
  left_join(
    drtg_since_jan |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_def_team")
  ) |>
  mutate(
    nrtg_since_jan = ortg_since_jan - drtg_since_jan,
    opp_nrtg_since_jan = opp_ortg_since_jan - opp_drtg_since_jan,
    diff_nrtg_since_jan = nrtg_since_jan - opp_nrtg_since_jan
  )

Which team has the “best” player

# Find a way to determine best player on the team
best_players <- player_data |>
  filter(
    gametype == 2
  ) |>
  mutate(
    #create a binary variable to see if a player appeared in each game
    played_in_game = ifelse(seconds > 0, 1, 0)
  ) |>
  summarise(
    fgm = sum(fgmade),
    fg3m = sum(fg3made),
    fga = sum(fgattempted),
    usg = (sum(shotattempts) + sum(turnovers)) / (sum(teamshotattempts) + sum(teamturnovers)),
    mpg = (sum(seconds) / 60) / sum(played_in_game),
    ast = sum(assists),
    gp = sum(played_in_game),
    ppps = (sum(points) + sum(assists)*2.3) / sum(seconds),
    .by = c(season, player_name, team)
  ) |>
  filter(
    mpg > 25,
    gp > 25
  ) |>
  mutate(
    efg_x_usg = ((fgm + (.5*fg3m)) / fga) * usg
  ) |>
  summarise(
    max_ppps = max(ppps),
    max_efgXusg = max(efg_x_usg),
    .by = c(season, team)
  )

p2_df <- p2_df |>
  left_join(
    best_players,
    by = c("season", "team")
  ) |>
  left_join(
    best_players |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_team")
  ) |>
  mutate(
    diff_max_ppps = max_ppps - opp_max_ppps,
    diff_max_efgXusg = max_efgXusg - opp_max_efgXusg
  )

Important players who will miss playoff games

# Find important players who are missing games right before the playoffs start and may not play in playoffs
missing <- player_data |>
  filter(
    gametype == 2,
    months(gamedate) %in% month.name[3:8]
  ) |>
  mutate(
    #create a binary variable to see if a player appeared in each game
    played_in_game = ifelse(seconds > 0, 1, 0)
  ) |>
  summarise(
    mpg = (sum(seconds) / 60) / sum(played_in_game),
    pct_games_missed = sum(missed) / n(),
    .by = c(season, player_name, team)
  ) |>
  filter(
    mpg >= 25,
    pct_games_missed > .5
  ) |>
  summarise(
    possible_missing = n(),
    .by = c(season, team)
  )

p2_df <- p2_df |>
  left_join(
    missing,
    by = c("season", "team")
  ) |>
  left_join(
    missing |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_team")
  ) |>
  mutate(
    possible_missing = ifelse(is.na(possible_missing), 0, possible_missing),
    opp_possible_missing = ifelse(is.na(opp_possible_missing), 0, opp_possible_missing),
    diff_possible_missing = possible_missing - opp_possible_missing
  )

How much playoff experience a team has

# Create a variable representing playoff experience on each team
# Just going to accomplish this with last four seasons worth of playoff experience
player_year4 = player_data |>
  # Find players on each team
  filter(
    gametype == 2
  ) |>
  mutate(
    #create a binary variable to see if a player appeared in each game
    played_in_game = ifelse(seconds > 0, 1, 0)
  ) |>
  summarise(
    mpg = (sum(seconds) / 60) / sum(played_in_game),
    .by = c(nbapersonid, season, team)
  ) |>
  mutate(
    season3 = season - 1,
    season2 = season - 2,
    season1 = season - 3,
    season0 = season - 4
  )

playoff_players <- player_data |>
  filter(
    gametype == 4
  ) |>
  select(
    season, 
    nbapersonid,
    team
  ) |>
  unique()

# Find playoff players from the years before
playoff_exp <- player_year4 |>
  left_join(
    playoff_players |> mutate(yr3 = 1),
    by = c("nbapersonid",
           "season3" = "season", 
           "team")
  ) |>
  left_join(
    playoff_players |> mutate(yr2 = 1),
    by = c("nbapersonid",
           "season2" = "season", 
           "team")
  ) |>
  left_join(
    playoff_players |> mutate(yr1 = 1),
    by = c("nbapersonid",
           "season1" = "season", 
           "team")
  )|>
  left_join(
    playoff_players |> mutate(yr0 = 1),
    by = c("nbapersonid",
           "season0" = "season", 
           "team")
  ) |>
  filter(
    mpg > 20
  ) |>
  mutate(
    yr3 = ifelse(is.na(yr3), 0, yr3),
    yr2 = ifelse(is.na(yr2), 0, yr2),
    yr1 = ifelse(is.na(yr1), 0, yr1),
    yr0 = ifelse(is.na(yr0), 0, yr0),
    yrs_exp = yr3 + yr2 + yr1 + yr0
  ) |>
  summarise(
    avg_po_exp_l4y = mean(yrs_exp),
    .by = c(team, season)
  )

p2_df <- p2_df |>
  left_join(
    playoff_exp,
    by = c("season", "team")
  ) |>
  left_join(
    playoff_exp |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_team")
  ) |>
  mutate(
    diff_avg_po_exp_l4y = avg_po_exp_l4y - opp_avg_po_exp_l4y
  )

H2H success from the two teams that year in the regular season

# Create feature for h2h success between each team so far this season
h2h_record <- team_data |>
  filter(
    gametype == 2
  ) |>
  summarise(
    h2h_wp = sum(off_win) / (sum(off_win) + sum(def_win)),
    h2h_gp = sum(off_win) + sum(def_win),
    .by = c(season, off_team, def_team)
  )

p2_df <- p2_df |>
  left_join(
    h2h_record,
    by = c("season", 
           "team" = "off_team",
           "opponent" = "def_team")
  ) |>
  mutate(
    opp_h2h_wp = 1 - h2h_wp,
    diff_h2h_wp = h2h_wp - opp_h2h_wp
  )

Team success on the road and at home in the regular season

# Create feature for home/away wp
home_record <- team_data |>
  filter(
    gametype == 2,
    off_home == 1
  ) |>
  summarise(
    home_wp = sum(off_win) / (sum(off_win) + sum(def_win)),
    .by = c(season, off_team)
  )

away_record <- team_data |>
  filter(
    gametype == 2,
    off_home == 0
  ) |>
  summarise(
    away_wp = sum(off_win) / (sum(off_win) + sum(def_win)),
    .by = c(season, off_team)
  )

p2_df <- p2_df |>
  left_join(
    home_record,
    by = c("season", 
           "team" = "off_team")
  ) |>
  left_join(
    home_record |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_off_team")
  ) |> 
  left_join(
    away_record,
    by = c("season", 
           "team" = "off_team")
  ) |>
  left_join(
    away_record |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_off_team")
  ) |>
  mutate(
    diff_home_wp = home_wp - opp_home_wp,
    diff_away_wp = away_wp - opp_away_wp
  )

Model Specifications

I am going to use a logistic regression model to predict the chance each team has to win their series.

After some testing and analysis, the variables I found useful in model are the metrics representing how the team has been doing since January in the regular season, which team has the best player, playoff experience, and h2h record between the two teams in the regular season, as well as team DRTG (which was useful when the model seemed to be overfitting to which team had the best player, which was a metric made from offensive numbers). Some other metrics I tried, such as a feature for how many important players a team was missing, were too imperfect to provide predictive value, and would need to be further refined before being included.

# Saving 2022 and 2023 for testing set
training <- p2_df |>
  filter(
    season <= 2021
  )

testing <- p2_df |>
  filter(
    season > 2021
  )
set.seed(2183287)

#assign observations to cv folds
cv_data <- training |>
  vfold_cv(v=5) 

rec <- recipe(series_win ~ diff_nrtg_since_jan + diff_max_efgXusg + diff_drtg + 
                diff_avg_po_exp_l4y + diff_h2h_wp,
              data = training)

mod <- logistic_reg() |>
  set_engine("glm") %>%
  set_mode("classification")

wf <- workflow() |>
  add_model(mod) |>
  add_recipe(rec)

cv_results <- fit_resamples(
  wf,
  resamples = cv_data,
  metrics = metric_set(accuracy, roc_auc)
)

collect_metrics(cv_results)
## # A tibble: 2 × 6
##   .metric  .estimator  mean     n std_err .config             
##   <chr>    <chr>      <dbl> <int>   <dbl> <chr>               
## 1 accuracy binary     0.746     5  0.0444 Preprocessor1_Model1
## 2 roc_auc  binary     0.797     5  0.0389 Preprocessor1_Model1

Final Model Selection

final_model_wp <- fit(wf, data = training)

Obtaining Model Predicitons

preds_wp <- predict(final_model_wp, new_data = testing, type = "prob") |>
  select(pred_series_win = .pred_1)

testing_with_preds = testing |>
  cbind(preds_wp)

Model Overview

My model is a relativity simple model that uses differences in key inputs between two teams playing a playoff series. Using playoff data from the 2015 to 2022 Playoffs, it calculates how much win percentage each advantage/disadvantage a team has over the other is worth, depending on the category of the advantage and the magnitude of that advantage. Once the model trains and decides how many win percentage points each advantage/disadvantage is worth, it applies onto the future playoff series in question.

My model emphasizes non-stylistic stats, or in other words, doesn’t penalize or give advantages to teams based on the style they play or what their specific strengths/weaknesses are.

I think my model’s strengths come from the fact that it doesn’t care what style your team plays when assessing win probability. It’s been proven that there are many different roster constructions and play styles that can win championships, so when trying to predict playoff series outcomes, I think my model gains advantages by staying away from using things like which team has the better team rebound percentages, or which team shoots more/better from 3 point range. This allows the model to give insight into what else (besides random variation) is driving the outcome of basketball games.

The weaknesses in my model come from imperfect proxy features representing what I deem to be an important predictor. For example, I made a quick feature to determine which team has the “best player” using an interaction of eFG% and USG%. There are other better metrics out there that could do a better job than what I created (something like VORP?), but I used the data I had. If I had more time/data, I would want to improve these proxies. I could find a teams record at full strength for the season. I could use prior playoff series in features for upcoming series. I tried to create a variable for injury detection, but it was imperfect and ultimately not useful. That is something that has lots of influence over win probability, so getting a more accurate feature for that would be a high priority.

Applying Model to the 2024 NBA Playoffs

Since we need to find each teams chances of advancing to each round, we need to find the predicted chance they could beat anyone in the bracket.

I will set up a data frame that includes every possible matchup between the 2024 playoff teams, then import the data needed for my features.

seeds_confs <- data.frame(
    team = c("OKC", "DEN", "MIN", "LAC", "DAL", "PHX", "LAL", "NOP",
             "BOS", "NYK", "MIL", "CLE", "ORL", "IND", "PHI", "MIA"),
    seed = c(1:8, 1:8),
    conf = c(rep("West", 8), rep("East", 8)),
    games_won = c(57, 57, 56, 51, 50, 49, 47, 49,
                  64, 50, 49, 48, 47, 47, 47, 46)
  )

possible_series <- expand.grid(
    team = playoffs23$team, 
    opponent = playoffs23$opponent, 
    round = playoffs23$round
  ) |>
  unique() |>
  filter(
    team != opponent
  ) |>
  mutate(
    season = 2023
  ) |>
  # Join in team metrics
  left_join(
    off_metrics,
    by = c("season",
           "team" = "off_team")
  ) |>
  left_join(
    def_metrics,
    by = c("season",
           "team" = "def_team")
  ) |>
  # Join in opponent metrics
  left_join(
    off_metrics |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_off_team")
  ) |>
  left_join(
    def_metrics |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_def_team")
  ) |>
  # Join in nrtg since Jan
  left_join(
    ortg_since_jan,
    by = c("season", 
           "team" = "off_team")
  ) |>
  left_join(
    drtg_since_jan,
    by = c("season", 
           "team" = "def_team")
  ) |>
  # Join in opp nrtg since Jan
  left_join(
    ortg_since_jan |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_off_team")
  ) |>
  left_join(
    drtg_since_jan |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_def_team")
  ) |>
  # Join in best player data
  left_join(
    best_players,
    by = c("season", "team")
  ) |>
  left_join(
    best_players |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_team")
  ) |>
  # Join in potential missing player data
  left_join(
    missing,
    by = c("season", "team")
  ) |>
  left_join(
    missing |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_team")
  ) |>
  # Join in playoff experience data
  left_join(
    playoff_exp,
    by = c("season", "team")
  ) |>
  left_join(
    playoff_exp |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season",
           "opponent" = "opp_team")
  ) |>
  # Join in h2h record data
  left_join(
    h2h_record,
    by = c("season", 
           "team" = "off_team",
           "opponent" = "def_team")
  ) |>
  # Join home/away wp
  left_join(
    home_record,
    by = c("season", 
           "team" = "off_team")
  ) |>
  left_join(
    home_record |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_off_team")
  ) |> 
  left_join(
    away_record,
    by = c("season", 
           "team" = "off_team")
  ) |>
  left_join(
    away_record |> rename_with( ~ paste0("opp_", .x)),
    by = c("season" = "opp_season", 
           "opponent" = "opp_off_team")
  ) |>
  mutate(
    nrtg = ortg - drtg,
    opp_nrtg = opp_ortg - opp_drtg,
    diff_ortg = ortg - opp_ortg,
    diff_drtg = drtg - opp_drtg,
    diff_nrtg = nrtg - opp_nrtg,
    nrtg_since_jan = ortg_since_jan - drtg_since_jan,
    opp_nrtg_since_jan = opp_ortg_since_jan - opp_drtg_since_jan,
    diff_nrtg_since_jan = nrtg_since_jan - opp_nrtg_since_jan,
    diff_max_ppps = max_ppps - opp_max_ppps,
    diff_max_efgXusg = max_efgXusg - opp_max_efgXusg,
    possible_missing = ifelse(is.na(possible_missing), 0, possible_missing),
    opp_possible_missing = ifelse(is.na(opp_possible_missing), 0, opp_possible_missing),
    diff_possible_missing = possible_missing - opp_possible_missing,
    diff_avg_po_exp_l4y = avg_po_exp_l4y - opp_avg_po_exp_l4y,
    opp_h2h_wp = 1 - h2h_wp,
    diff_h2h_wp = h2h_wp - opp_h2h_wp,
    diff_home_wp = home_wp - opp_home_wp,
    diff_away_wp = away_wp - opp_away_wp
  ) |>
  left_join(
      seeds_confs |> rename_with( ~ paste0("team_", .x)),
      by = c("team" = "team_team")
    ) |>
    left_join(
      seeds_confs |> rename_with( ~ paste0("opp_", .x)),
      by = c("opponent" = "opp_team")
    ) |>
    filter(
      # If not the finals, conf must be the same
      ((round != 4) & (team_conf == opp_conf)) |
      # If the finals, conf must be different
        ((round == 4) & (team_conf != opp_conf))
    ) |>
    mutate(
      # Set hca for potential series
      hca = case_when(
        (round %in% c(1, 2, 3)) & (team_seed < opp_seed) ~ 1,
        (round %in% c(1, 2, 3)) & (team_seed > opp_seed) ~ 0,
        (round == 4) & (team_games_won > opp_games_won) ~ 1,
        (round == 4) & (team_games_won < opp_games_won) ~ 0,
        (round == 4) & (team_games_won == opp_games_won) ~ rbinom(1, 1, .5)
      ),
      round = as.factor(ifelse(round == 4, 3, round))
    )

I can then predict on every one of those matchups, and get the predicted probability of each team winning.

# Predict on every possible series
poss_preds_col <- predict(final_model_wp, new_data = possible_series, type = "prob") |>
  select(pred_series_win = .pred_1)

poss_series_preds <- possible_series |>
  cbind(poss_preds_col)

Simulate

Now that we have the predicted probability of every possible series, we want to simulate the playoffs many times and see how often teams make each round.

sim_playoffs <- function(df){
  
  # Create function to determine matchup based on predicted probabilities
  determine_series_winner <- function(team1, team2, po_round){
    poss_series_preds |>
      filter(
        team == team1,
        opponent == team2,
        round == po_round
        ) |>
      mutate(
        winner = ifelse(rbinom(1, 1, pred_series_win), team, opponent)
      ) |>
      pull(winner)
  }
  
  # First Round Matchups
  west_1v8_winner <- determine_series_winner("OKC", "NOP", 1)
  west_2v7_winner <- determine_series_winner("DEN", "LAL", 1)
  west_3v6_winner <- determine_series_winner("MIN", "PHX", 1)
  west_4v5_winner <- determine_series_winner("LAC", "DAL", 1)
  east_1v8_winner <- determine_series_winner("BOS", "MIA", 1)
  east_2v7_winner <- determine_series_winner("NYK", "PHI", 1)
  east_3v6_winner <- determine_series_winner("MIL", "IND", 1)
  east_4v5_winner <- determine_series_winner("CLE", "ORL", 1)
  
  made_second_round <- c(west_1v8_winner,
                         west_2v7_winner,
                         west_3v6_winner, 
                         west_4v5_winner,
                         east_1v8_winner,
                         east_2v7_winner,
                         east_3v6_winner,
                         east_4v5_winner)
  
  # Second Round Matchups
  west_18v45_winner <- determine_series_winner(
    west_1v8_winner,
    west_4v5_winner,
    2)
  west_27v36_winner <- determine_series_winner(
    west_2v7_winner,
    west_3v6_winner,
    2)
  east_18v45_winner <- determine_series_winner(
    east_1v8_winner,
    east_4v5_winner,
    2)
  east_27v36_winner <- determine_series_winner(
    east_2v7_winner,
    east_3v6_winner,
    2)
  
  made_third_round <- c(west_18v45_winner,
                        west_27v36_winner,
                        east_18v45_winner,
                        east_27v36_winner)
  
  # Third Round Matchups
  west_winner <- determine_series_winner(
    west_18v45_winner,
    west_27v36_winner,
    3)
  east_winner <- determine_series_winner(
    east_18v45_winner,
    east_27v36_winner,
    3)
  
  made_finals <- c(west_winner,
                   east_winner)
  
  # Finals
  finals_winner <- determine_series_winner(
    west_winner,
    east_winner,
    3)
  
  return(poss_series_preds |>
           select(team) |>
           unique() |>
           mutate(made_2r = ifelse(team %in% made_second_round, 1, 0),
                  made_3r = ifelse(team %in% made_third_round, 1, 0),
                  made_4r = ifelse(team %in% made_finals, 1, 0),
                  win_finals = ifelse(team == finals_winner, 1, 0)))
}

# Run a bunch to get how often each team advances to each round
sim_results <- map(1:1000, ~ sim_playoffs()) |>
  bind_rows() |>
  summarise(
    made_2r = mean(made_2r),
    made_3r = mean(made_3r),
    made_4r = mean(made_4r),
    win_finals = mean(win_finals),
    .by = team
  ) |>
  cbind(data.frame(
    url = c("https://a.espncdn.com/i/teamlogos/nba/500/okc.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/min.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/phx.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/den.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/lal.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/dal.png",
            "https://seeklogo.com/images/L/la-clippers-logo-38F03D21AF-seeklogo.com.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/no.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/nyk.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/ind.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/mil.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/cle.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/orl.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/bos.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/mia.png",
            "https://a.espncdn.com/i/teamlogos/nba/500/phi.png")
  ))

Visualized Results

OKC

 ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#007ac1") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#007ac1") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-6.2, yend=8.2), size = 3, color = "#007ac1") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 3, color = "#007ac1") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=7.88, yend=12.2), size = 3, color = "#007ac1") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 3, color = "#007ac1") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=11.8, yend=15.2), size = 3, color = "#007ac1") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 3, color = "#007ac1") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=15), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/okc.png",
             size = .2) +
  annotate("text", 
           x = -15, 
           y = 13.5, 
           label = sim_results |> 
             filter(team == "OKC") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#ef3b24",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "OKC") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#ef3b24",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "OKC") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#ef3b24",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "OKC") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#ef3b24",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

DEN

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#0860A8") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-5.8, yend=-8.2), size = 3, color = "#0860A8") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-7.8, yend=-12.2), size = 3, color = "#0860A8") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-12.2, yend=-8.8), size = 3, color = "#0860A8") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=-9), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/den.png",
             size = .12) +
  annotate("text", 
           x = -15, 
           y = -10.5, 
           label = sim_results |> 
             filter(team == "DEN") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#fec524",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "DEN") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#fec524",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "DEN") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#fec524",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "DEN") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#fec524",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

MIN

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#0E3764") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#0E3764") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-5.8, yend=-8.2), size = 3, color = "#0E3764") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 3, color = "#0E3764") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-8.2, yend=-3.8), size = 3, color = "#0E3764") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 3, color = "#0E3764") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-.8, yend=-4.2), size = 3, color = "#0E3764") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 3, color = "#0E3764") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=-1), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/min.png",
             size = .13) +
  annotate("text", 
           x = -15, 
           y = -2.5, 
           label = sim_results |> 
             filter(team == "MIN") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#78BE20",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "MIN") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#78BE20",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "MIN") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#78BE20",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "MIN") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#78BE20",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

LAC

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#006BB6") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-6.2, yend=8.2), size = 3, color = "#006BB6") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 3, color = "#006BB6") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=8.2, yend=3.8), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=3.8, yend=7.2), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=7), 
             image = "https://seeklogo.com/images/L/la-clippers-logo-38F03D21AF-seeklogo.com.png",
             size = .11) +
  annotate("text", 
           x = -15, 
           y = 5.5, 
           label = sim_results |> 
             filter(team == "LAC") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#FA0028",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "LAC") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#FA0028",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "LAC") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#FA0028",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "LAC") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#FA0028",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

DAL

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#0C479D") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#0C479D") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-6.2, yend=8.2), size = 3, color = "#0C479D") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 3, color = "#0C479D") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=8.2, yend=3.8), size = 3, color = "#0C479D") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 3, color = "#0C479D") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=.8, yend=4.2), size = 3, color = "#0C479D") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 3, color = "#0C479D") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=1.2), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/dal.png",
             size = .12) +
  annotate("text", 
           x = -15, 
           y = 5.5, 
           label = sim_results |> 
             filter(team == "DAL") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#00843D",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "DAL") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#00843D",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "DAL") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#00843D",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "DAL") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#00843D",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

PHX

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#23006a") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#23006a") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-5.8, yend=-8.2), size = 3, color = "#23006a") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 3, color = "#23006a") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-8.2, yend=-3.8), size = 3, color = "#23006a") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 3, color = "#23006a") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-7.2, yend=-3.8), size = 3, color = "#23006a") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 3, color = "#23006a") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=-7), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/phx.png",
             size = .15) +
  annotate("text", 
           x = -15, 
           y = -2.5, 
           label = sim_results |> 
             filter(team == "PHX") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#e56020",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "PHX") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#e56020",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "PHX") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#e56020",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "PHX") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#e56020",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

LAL

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#542582") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#542582") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-5.8, yend=-8.2), size = 3, color = "#542582") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 3, color = "#542582") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-7.8, yend=-12.2), size = 3, color = "#542582") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 3, color = "#542582") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-11.8, yend=-15.2), size=3, color = "#542582") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 3, color = "#542582") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=-15), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/lal.png",
             size = .16) +
  annotate("text", 
           x = -15, 
           y = -10.5, 
           label = sim_results |> 
             filter(team == "LAL") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#fdb927",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "LAL") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#fdb927",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "LAL") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#fdb927",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "LAL") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#FDB927",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

NOP

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#002a5c") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 3, color = "#002a5c") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-6, xend=-6, y=-6.2, yend=8.2), size = 3, color = "#002a5c") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 3, color = "#002a5c") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=7.88, yend=12.2), size = 3, color = "#002a5c") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 3, color = "#002a5c") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=12.2, yend=8.8), size = 3, color = "#002a5c") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 3, color = "#002a5c") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=-21, y=9), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/no.png",
             size = .17) +
  annotate("text", 
           x = -15, 
           y = 13.5, 
           label = sim_results |> 
             filter(team == "NOP") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#b4975a",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "NOP") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#b4975a",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = -3, 
           y = -4.5, 
           label = sim_results |> 
             filter(team == "NOP") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#b4975a",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "NOP") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#b4975a",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

BOS

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#006532") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#006532") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=5.8, yend=8.2), size = 3, color = "#006532") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 3, color = "#006532") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=7.88, yend=12.2), size = 3, color = "#006532") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 3, color = "#006532") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=11.8, yend=15.2), size = 3, color = "#006532") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 3, color = "#006532") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=15), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/bos.png",
             size = .12) +
  annotate("text", 
           x = 15, 
           y = 13.5, 
           label = sim_results |> 
             filter(team == "BOS") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "darkgrey",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "BOS") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "darkgrey",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "BOS") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "darkgrey",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "BOS") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "darkgrey",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

NYK

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#225EA8") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#225EA8") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=6.2, yend=-8.2), size = 3, color = "#225EA8") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 3, color = "#225EA8") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-7.8, yend=-12.2), size = 3, color = "#225EA8") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 3, color = "#0860A8") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-12.2, yend=-8.8), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 3, color = "#0860A8") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=-9.5), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/nyk.png",
             size = .12) +
  annotate("text", 
           x = 15, 
           y = -10.5, 
           label = sim_results |> 
             filter(team == "NYK") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#f58426",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "NYK") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#f58426",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "NYK") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#f58426",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "NYK") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#f58426",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

MIL

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#003813") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#003813") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=6.2, yend=-8.2), size = 3, color = "#003813") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 3, color = "#003813") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-8.2, yend=-3.8), size = 3, color = "#003813") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 3, color = "#003813") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-.8, yend=-4.2), size = 3, color = "#003813") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 3, color = "#003813") +
  geom_image(aes(x=21, y=-1), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/mil.png",
             size = .12) +
  annotate("text", 
           x = 15, 
           y = -2.5, 
           label = sim_results |> 
             filter(team == "MIL") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#0077C0",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "MIL") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#0077C0",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "MIL") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#0077C0",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "MIL") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#0077C0",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

CLE

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#860038") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#860038") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=5.8, yend=8.2), size = 3, color = "#860038") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 3, color = "#860038") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=8.2, yend=3.8), size = 3, color = "#860038") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 3, color = "#860038") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=3.8, yend=7.2), size = 3, color = "#860038") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 3, color = "#860038") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=7), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/cle.png",
             size = .12) +
  annotate("text", 
           x = 15, 
           y = 5.5, 
           label = sim_results |> 
             filter(team == "CLE") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#fdbb30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "CLE") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#fdbb30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "CLE") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#fdbb30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "CLE") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#fdbb30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

ORL

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=5.8, yend=8.2), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 3, color = "#0860A8") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=8.2, yend=3.8), size = 3, color = "#0860A8") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 3, color = "#0860A8") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=4.2, yend=.8), size = 3, color = "#0860A8") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 3, color = "#0860A8") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=1), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/orl.png",
             size = .15) +
  annotate("text", 
           x = 15, 
           y = 5.5, 
           label = sim_results |> 
             filter(team == "ORL") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "black",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "ORL") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "black",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "ORL") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "black",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "ORL") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "black",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

IND

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#061642") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#061642") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=6.2, yend=-8.2), size = 3, color = "#061642") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 3, color = "#061642") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-8.2, yend=-3.8), size = 3, color = "#061642") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 3, color = "#061642") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-3.8, yend=-7.2), size = 3, color = "#061642") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 3, color = "#061642") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=-7), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/ind.png",
             size = .11) +
  annotate("text", 
           x = 15, 
           y = -2.5, 
           label = sim_results |> 
             filter(team == "IND") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#FDBB30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "IND") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#FDBB30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "IND") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#FDBB30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "IND") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#FDBB30",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

PHI

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=6.2, yend=-8.2), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=-7.8, yend=-12.2), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 3, color = "#006BB6") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-11.8, yend=-15.2), size = 3, color = "#006BB6") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 3, color = "#006BB6") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=-14.5), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/phi.png",
             size = .12) +
  annotate("text", 
           x = 15, 
           y = -10.5, 
           label = sim_results |> 
             filter(team == "PHI") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#ED174C",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = -6.5, 
           label = sim_results |> 
             filter(team == "PHI") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#ED174C",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "PHI") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#ED174C",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "PHI") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#ED174C",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

MIA

ggplot() +
  xlim(-25, 25) + ylim(-18, 25) +
  geom_segment(aes(x=-3, xend=3, y=0, yend=0), size = 3, color = "#98002E") +
  geom_segment(aes(x=-6, xend=0, y=-6, yend=-6), size = 2, color = "black") +
  geom_segment(aes(x=0, xend=6, y=6, yend=6), size = 3, color = "#98002E") +
  geom_segment(aes(x=-6, xend=-6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=-8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=6, xend=6, y=5.8, yend=8.2), size = 3, color = "#98002E") +
  geom_segment(aes(x=-12, xend=-5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-5.95, y=8, yend=8), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=5.95, y=8, yend=8), size = 3, color = "#98002E") +
  geom_segment(aes(x=12, xend=5.95, y=-8, yend=-8), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-12, xend=-12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=4, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=12, xend=12, y=7.88, yend=12.2), size = 3, color = "#98002E") +
  geom_segment(aes(x=12, xend=12, y=-12, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=12, yend=12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-12, yend=-12), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=-4, yend=-4), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=11.95, y=12, yend=12), size = 3, color = "#98002E") +
  geom_segment(aes(x=18, xend=11.95, y=4, yend=4), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-18, xend=-18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=1, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=9, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-1, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=-9, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=18, xend=18, y=12.2, yend=8.8), size = 3, color = "#98002E") +
  geom_segment(aes(x=-24, xend=-17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=9, yend=9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=-24, xend=-17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=15, yend=15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=9, yend=9), size = 2, color = "#98002E") +
  geom_segment(aes(x=24, xend=17.95, y=7, yend=7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=1, yend=1), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-15, yend=-15), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-9, yend=-9), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-7, yend=-7), size = 2, color = "black") +
  geom_segment(aes(x=24, xend=17.95, y=-1, yend=-1), size = 2, color = "black") +
  geom_image(aes(x=21, y=10), 
             image = "https://a.espncdn.com/i/teamlogos/nba/500/mia.png",
             size = .11) +
  annotate("text", 
           x = 15, 
           y = 13.5, 
           label = sim_results |> 
             filter(team == "MIA") |>
             mutate(text = paste0(made_2r*100, "%")) |>
             pull(text),
           color = "#F9A01B",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 9, 
           y = 9.5, 
           label = sim_results |> 
             filter(team == "MIA") |>
             mutate(text = paste0(made_3r*100, "%")) |>
             pull(text),
           color = "#F9A01B",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 3, 
           y = 7.5, 
           label = sim_results |> 
             filter(team == "MIA") |>
             mutate(text = paste0(made_4r*100, "%")) |>
             pull(text),
           color = "#F9A01B",
           fontface = "bold",
           size = 5
           ) +
  annotate("text", 
           x = 0, 
           y = 1.5, 
           label = sim_results |> 
             filter(team == "MIA") |>
             mutate(text = paste0(win_finals*100, "%")) |>
             pull(text),
           color = "#F9A01B",
           fontface = "bold",
           size = 5
           ) +
  annotate("text",
           x = 0, 
           y= 23,
           label = "Predicted Probability of\nEach 2024 Playoff Team Advancing",
           color = "black",
           fontface = "bold",
           size = 8) +
  geom_image(aes(x=0, y=-16),
             image = "https://content.sportslogos.net/logos/6/981/full/2111__nba_playoffs-primary-2018.png",
             size = .4) +
  theme_void()

Overview

t1 <- sim_results |>
  filter(row_number() <= 8) |>
  arrange(desc(win_finals)) |>
  select(url, made_2r, made_3r, made_4r, win_finals) |>
  gt() |>
  gt_img_rows(columns = url, 
              img_source = "web",
              height = 30) |>
  fmt_pct_extra(columns = 2:5, scale = 100) |>
  cols_label(
    url = "",
    made_2r = "Second Round",
    made_3r = "Conf Finals",
    made_4r = "NBA Finals",
    win_finals = "NBA Champion"
  ) |>
  gt_theme_pff() |>
  tab_style(
    style = list(
      cell_text(weight = "bold", align = "center")
    ),
    locations = cells_body()
  ) |>
  tab_spanner(
    label = "Predicted Probabilty of Advancing To",
    columns = c(2:5)
  ) 

t2 <- sim_results |>
  filter(row_number() > 8) |>
  arrange(desc(win_finals)) |>
  select(url, made_2r, made_3r, made_4r, win_finals) |>
  gt() |>
  gt_img_rows(columns = url, 
              img_source = "web",
              height = 30) |>
  fmt_pct_extra(columns = 2:5, scale = 100) |>
  cols_label(
    url = "",
    made_2r = "Second Round",
    made_3r = "Conf Finals",
    made_4r = "NBA Finals",
    win_finals = "NBA Champion"
  ) |>
  gt_theme_pff() |>
  tab_style(
    style = list(
      cell_text(weight = "bold", align = "center")
    ),
    locations = cells_body()
  ) |>
  tab_spanner(
    label = "Predicted Probabilty of Advancing To",
    columns = c(2:5)
  )

gt_two_column_layout(
  list(t1, t2)
)
Predicted Probabilty of Advancing To
Second Round Conf Finals NBA Finals NBA Champion
66.0% 53.6% 37.4% 16.2%
57.2% 39.1% 22.2% 7.5%
79.7% 35.6% 13.2% 4.1%
34.0% 23.6% 11.5% 2.8%
42.8% 22.2% 8.4% 1.5%
70.2% 18.5% 6.1% <1%
20.3% 3.1% <1% <1%
29.8% 4.3% <1% <1%
Predicted Probabilty of Advancing To
Second Round Conf Finals NBA Finals NBA Champion
96.7% 88.2% 73.5% 56.2%
85.6% 66.5% 18.4% 8.7%
67.3% 21.5% 2.7% 1.1%
70.0% 8.5% 3.3% <1%
30.0% 2.2% <1% <1%
32.7% 7.1% <1% <1%
3.3% 1.1% <1% <1%
14.4% 4.9% <1% <1%