0

Here's what I'm trying to fix...

This code is supposed to generate an NBA shot chart; however, I have been trying to correct this error for close to an hour now. Any help would be greatly appreciated. Attached below is the code for creating the court, along with the code (below that) for creating the chart.

plot_court = function(court_theme = court_themes$light, use_short_three = FALSE) {
  if(use_short_three) {
    three_point_radius = 22
    three_point_side_height = 0
  }
  
  court_points = data_frame(
    x = c(width / 2, -width / 2, -width / 2, width / 2),
    y = c(height, 0, 0, height, height),
    desc = "perimeter"
  )
  
  court_points = bind_rows(court_points , data_frame(
    x = c(outer_key_width / 2, outer_key_width / 2, -outer_key_width / 2, -outer_key_width / 2),
    y = c(0, key_height, key_height, 0),
    desc = "outer_key"
  ))
  
  court_points = bind_rows(court_points, data_frame(
    x = c(-backboard_width / 2, backboard_width / 2),
    y = c(backboard_offset, backboard_offset),
    desc = "backboard"
  ))
  
  court_points = bind_rows(court_points , data_frame(
    x = c(0, 0), y = c(backboard_offset, backboard_offset + neck_length), desc = "neck"
  ))
  
  foul_circle = circle_points(center = c(0, key_height), radius = inner_key_width / 2)
  
  foul_circle_top = filter(foul_circle, y > key_height) %>%
    mutate(desc = "foul_circle_top")
  
  foul_circle_bottom = filter(foul_circle, y < key_height) %>%
    mutate(
      angle = atan((y - key_height) / x) * 180 / pi,
      angle_group = floor((angle - 5.625) / 11.25),
      desc = paste0("foul_circle_bottom", angle_group)
    ) %>%
    filter(angle_group %% 2 == 0) %>%
    select(x, y, desc)
  
  hoop = circle_points(center = c(0, hoop_center_y), radius = hoop_radius) %>%
    mutate(desc = "hoop")
  
  restricted = circle_points(center = c(0, hoop_center_y), radius = 4) %>%
    filter(y >= hoop_center_y) %>%
  mutate(desc = "restricted")
  
three_point_circle = circle_points(center = c(0, hoop_center_y), radius = three_point_side_radius) %>%
  filter(y >= three_point_side_height, y >= hoop_center_y)

three_point_line = data_frame(
  x = c(three_point_side_radius, three_point_side_radius, three_point_circle$x, -three_point_side_radius, -three_point_side_radius),
  y = c(0, three_point_side_height, three_point_circle$y, three_point_side_height, 0),
  desc = "three_point_line"
  )

court_points = bind_rows(
  court_points,
  foul_circle_top,
  foul_circle_bottom,
  hoop,
  restricted,
  three_point_line
  )


  court_points < court_points



#Final Plot Creation
  ggplot() +
    geom_path(
      data = court_points,
      aes(x = x, y = y, group = desc),
      color = court_theme$lines
    ) +
    coord_fixed(ylim = c(0, 45), xlim = c(-25, 25))
    theme_minimal(base_size = 22) +
    theme(
      text = element_text(color = court_theme$text),
      plot.background = element_rect(fill - 'gray20', color = 'gray20'),
      panel.background = element_rect(fill = court_theme$court, color = color_theme$court),
      panel.grid = element_blank(),
      panel.border = element_blank(),
      axis.text = element_blank(),
      axis.title = element_blank(),
      axis.ticks = element_blank(),
      legend.background = element_rect(fill = court_theme$court, color = court_theme$court),
      legend.margin = margin(-1, 0, 0, 0, unit = "lines"),
      legend_position = "bottom",
      legend.key = element_blank(),
      legend.text = element_text(size = rel(1,0))

plot_court(court_themes$ppt, use_short_three = F) +
  geom_point(data = final_durant, aes(x = x, y = y, color = final_durant$isShotMade, fill = final_durant$isShotMade),
             size = 3, shape = 21, stroke = 5) +
  scale_color_manual(values = c("green","red"), aesthetics = "color", breaks = c("TRUE", "FALSE"), labels = c("Made", "Missed")) +
  scale_fill_manual(values = c("green2", "gray20"), aesthetics = "fill", breaks = c("TRUE", "FALSE"), labels = c("Made", "Missed")) +
  scale_x_continuous(limits = c(-27.5, 27.5)) +
  scale_y_continuous(limits = c(0, 45)) +
  theme(plot.title = element_text(hjust = .5, size = 22, family = "Comic Sans MS", face = "bold", vjust = -4),
        plot.subtitle = element_text(hjust = .5, size = 10, family = "Comic Sans MS", face = "bold", vjust = -8),
        legend.position = c(.5, .85),
        legend.direction = "horizontal",
        legend.title = element_blank(),
        legend.text = element_text(hjust = .5, size = 10, family = "Comic Sans MS", face = "bold", colour = "white")) +
  ggtitle(label = "Kevin Durant vs. Milaukee",
          subtitle = "30 PTS | 4 REB | 7-10 3PT - 5/2/21")

ggdraw(p1) + theme(plot.background = element_rect(fill = "gray20", color = NA))

ggsave("Durant.png", height = 6, width = 6, dpi = 300)

rlang::last_error()

Brent315
  • 1
  • 1
  • In order to know what is going wrong, we need to know how `plot_court()` is defined and need to know how the data are constructed. – mikebader Aug 05 '21 at 18:44
  • 3
    Welcome to Stack Overflow. Can you rework your question to make a reproducible example? That would include all relevant code as well as the relevant R objects used in the given code (datasetrs, vectors, etc.). Including these will help folks help you! You can get some good ideas on how to make a reproducible example [in answers to this question](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – aosmith Aug 05 '21 at 18:46

0 Answers0