Skip to content

Instantly share code, notes, and snippets.

@cavedave
Last active May 9, 2026 18:11
Show Gist options
  • Select an option

  • Save cavedave/adb7ebcce0832a26ce4ba7386f0afe12 to your computer and use it in GitHub Desktop.

Select an option

Save cavedave/adb7ebcce0832a26ce4ba7386f0afe12 to your computer and use it in GitHub Desktop.
top nba single game scorers
year assists player team game_date opponent score notes playoff
1990 30 Scott Skiles Orlando Magic December 30, 1990 Denver Nuggets 155–116 [a] no
1978 29 Kevin Porter New Jersey Nets February 24, 1978 Houston Rockets 126–112 [b] no
1959 28 Bob Cousy Boston Celtics February 27, 1959 Minneapolis Lakers 173–139 [c] no
1963 28 Guy Rodgers San Francisco Warriors March 14, 1963 St. Louis Hawks 109–114 [d] no
1991 28 John Stockton Utah Jazz January 15, 1991 San Antonio Spurs 124–102 [e] no
1982 27 Geoff Huston Cleveland Cavaliers January 27, 1982 Golden State Warriors 110–106 no
1989 27 John Stockton Utah Jazz December 19, 1989 New York Knicks 107–115 [f] no
1988 26 John Stockton Utah Jazz April 14, 1988 Portland Trail Blazers 123–128 no
1974 25 Ernie DiGregorio Buffalo Braves January 1, 1974 Portland Trail Blazers 120–119 [g] no
1979 25 Kevin Porter Detroit Pistons March 9, 1979 Boston Celtics 160–119 no
1979 25 Kevin Porter Detroit Pistons April 1, 1979 Phoenix Suns 105–116 no
1985 25 Isiah Thomas Detroit Pistons February 13, 1985 Dallas Mavericks 124–119 [h] no
1987 25 Nate McMillan Seattle SuperSonics February 23, 1987 Los Angeles Clippers 124–112 [i] no
1994 25 Kevin Johnson Phoenix Suns April 6, 1994 San Antonio Spurs 107–95 no
1996 25 Jason Kidd Dallas Mavericks February 8, 1996 Utah Jazz 136–133 [j] no
2017 25 Rajon Rondo New Orleans Pelicans December 27, 2017 Brooklyn Nets 128–113 no
1966 24 Guy Rodgers Chicago Bulls December 21, 1966 New York Knicks 110–107 no
1980 24 Kevin Porter Washington Bullets March 23, 1980 Detroit Pistons 119–114 no
1984 24 John Lucas San Antonio Spurs April 15, 1984 Denver Nuggets 157–154 [k] no
1984 24 Magic Johnson Los Angeles Lakers May 15, 1984 Phoenix Suns 118–102 [l] yes
1985 24 Isiah Thomas Detroit Pistons February 7, 1985 Washington Bullets 126–128 [m] no
1988 24 John Stockton Utah Jazz May 17, 1988 Los Angeles Lakers 109–111 [n] yes
1989 24 John Stockton Utah Jazz January 3, 1989 Houston Rockets 102–104 [o] no
1989 24 Magic Johnson Los Angeles Lakers November 17, 1989 Denver Nuggets 119–105 [p] no
1990 24 Magic Johnson Los Angeles Lakers January 9, 1990 Phoenix Suns 118–121 [q] no
2008 24 Ramon Sessions Milwaukee Bucks April 14, 2008 Chicago Bulls 135–151 [r] no
2010 24 Rajon Rondo Boston Celtics October 29, 2010 New York Knicks 105–101 [s] no
2019 24 Russell Westbrook Oklahoma City Thunder January 10, 2019 San Antonio Spurs 147–154 [t] no
2021 24 Russell Westbrook Washington Wizards May 3, 2021 Indiana Pacers 154–141 [u] no
1967 23 Jerry West Los Angeles Lakers February 1, 1967 Philadelphia 76ers 143–133 [v] no
1978 23 Kevin Porter Detroit Pistons December 27, 1978 Houston Rockets 131–119 no
1979 23 Kevin Porter Detroit Pistons March 30, 1979 Los Angeles Lakers 113–124 no
1982 23 Nate Archibald Boston Celtics February 5, 1982 Denver Nuggets 145–144 [w] no
1984 23 Magic Johnson Los Angeles Lakers February 21, 1984 Seattle SuperSonics 128–112 [x] no
1985 23 Magic Johnson Los Angeles Lakers May 3, 1985 Portland Trail Blazers 130–126 [y] yes
1988 23 Magic Johnson Los Angeles Lakers April 20, 1988 Dallas Mavericks 114–107 [z] no
1989 23 Fat Lever Denver Nuggets April 21, 1989 Golden State Warriors 139–121 [aa] no
1990 23 John Stockton Utah Jazz April 12, 1990 Los Angeles Lakers 107–104 [ab] no
1990 23 John Stockton Utah Jazz December 8, 1990 Los Angeles Clippers 105–95 [ac] no
1991 23 John Stockton Utah Jazz November 29, 1991 Golden State Warriors 135–108 no
1992 23 John Stockton Utah Jazz April 17, 1992 Minnesota Timberwolves 120–106 no
1993 23 Mookie Blaylock Atlanta Hawks March 6, 1993 Utah Jazz 139–118 no
1996 23 John Stockton Utah Jazz April 25, 1996 Portland Trail Blazers 110–102 [ad] yes
1997 23 Nick Van Exel Los Angeles Lakers January 5, 1997 Vancouver Grizzlies 95–82 [ae] no
2001 23 Jamaal Tinsley Indiana Pacers November 22, 2001 Washington Wizards 110–103 [af] no
2007 23 Steve Nash Phoenix Suns April 29, 2007 Los Angeles Lakers 113–100 [ag] yes
2011 23 Rajon Rondo Boston Celtics January 5, 2011 San Antonio Spurs 105–103 [ah] no
2026 23 Ryan Nembhard Dallas Mavericks April 12, 2026 Chicago Bulls 149–128 no
2023 23 Tyrese Haliburton Indiana Pacers December 30, 2023 New York Knicks 140–126 no
1961 22 Oscar Robertson Cincinnati Royals October 29, 1961 Syracuse Nationals 139–132 [ai] no
1966 22 Oscar Robertson Cincinnati Royals March 5, 1966 New York Knicks 149–145 [aj] no
1968 22 Art Williams San Diego Rockets December 28, 1968 Phoenix Suns 136–126 no
1970 22 Art Williams San Diego Rockets February 14, 1970 San Francisco Warriors 141–123 no
1975 22 Kevin Porter Washington Bullets March 5, 1975 Atlanta Hawks 118–112 no
1978 22 Kevin Porter Detroit Pistons December 23, 1978 San Antonio Spurs 126–130 no
1979 22 Phil Ford Kansas City Kings February 21, 1979 Milwaukee Bucks 133–117 no
1979 22 Kevin Porter Detroit Pistons February 27, 1979 Chicago Bulls 117–124 no
1981 22 John Lucas Golden State Warriors February 27, 1981 Denver Nuggets 130–137 no
1983 22 Allen Leavell Houston Rockets January 25, 1983 New Jersey Nets 114–111 [ak] no
1983 22 Magic Johnson Los Angeles Lakers November 17, 1983 Cleveland Cavaliers 127–114 no
1984 22 Ennis Whatley Chicago Bulls January 14, 1984 New York Knicks 111–113 no
1984 22 Ennis Whatley Chicago Bulls March 3, 1984 Atlanta Hawks 102–98 [al] no
1987 22 John Stockton Utah Jazz January 8, 1987 Los Angeles Lakers 107–101 [am] no
1988 22 Doc Rivers Atlanta Hawks May 16, 1988 Boston Celtics 118–109 yes
1989 22 John Stockton Utah Jazz December 11, 1989 Cleveland Cavaliers 110–113 [an] no
1990 22 Magic Johnson Los Angeles Lakers November 6, 1990 Portland Trail Blazers 123–125 [ao] no
1992 22 John Stockton Utah Jazz December 18, 1992 Philadelphia 76ers 112–98 [ap] no
1994 22 Sherman Douglas Boston Celtics April 3, 1994 Philadelphia 76ers 135–112 no
1994 22 Tim Hardaway Golden State Warriors December 16, 1994 Orlando Magic 128–131 [aq] no
1996 22 Robert Pack New Jersey Nets November 23, 1996 Dallas Mavericks 114–91 no
1997 22 Mark Jackson Denver Nuggets January 20, 1997 New Jersey Nets 132–123 no
2001 22 George McCloud Denver Nuggets March 26, 2001 Chicago Bulls 109–104 [ar] no
2001 22 Andre Miller Cleveland Cavaliers December 15, 2001 Philadelphia 76ers 91–94 no
2006 22 Steve Nash Phoenix Suns January 2, 2006 New York Knicks 133–140 [as] no
2008 22 Chris Duhon New York Knicks November 29, 2008 Golden State Warriors 138–125 [at] no
2016 22 Russell Westbrook Oklahoma City Thunder December 17, 2016 Phoenix Suns 114–101 [au] no
2024 22 Trae Young Atlanta Hawks November 27, 2024 Cleveland Cavaliers 135–124 no
2025 22 Nikola Jokić Denver Nuggets March 7, 2025 Phoenix Suns 149–141 [av] no
2026 22 Isaiah Collier Utah Jazz February 3, 2026 Indiana Pacers 131–122 no
# NBA single-game assists leaders (Tufte-style).
# Data: nba_assists.csv from Wikipedia
# https://en.wikipedia.org/wiki/List_of_NBA_single-game_assists_leaders
# (22+ assists in a game; includes marked playoff games in CSV.)
library(ggplot2)
library(dplyr)
library(ggtext)
library(ggrepel)
df <- read.csv("nba_assists.csv", stringsAsFactors = FALSE)
counts_tbl <- df |>
count(player, name = "games", sort = TRUE)
total_games <- nrow(df)
unique_players <- n_distinct(df$player)
cat("\n=== NBA assists CSV summary ===\n")
cat("Total games (rows): ", total_games, "\n", sep = "")
cat("Unique players: ", unique_players, "\n\n", sep = "")
cat("Top players by game count:\n")
print(utils::head(counts_tbl, 15), row.names = FALSE)
cat("\nTop 5 (strict rows 1–5):\n")
print(utils::head(counts_tbl, 5), row.names = FALSE)
if (nrow(counts_tbl) >= 6 && counts_tbl$games[6] == counts_tbl$games[5]) {
cat("\nTied at rank 5 (same count as row 5):\n")
tie_n <- counts_tbl$games[5]
print(counts_tbl[counts_tbl$games == tie_n, ], row.names = FALSE)
}
cat("\n")
# Top three by volume; everyone else gray (Rondo, Westbrook, etc.).
# Distinct hues (avoid dark purple vs dark red): Stockton — Jazz green;
# Porter — bright Pistons red; Magic — Lakers purple.
star_players <- c(
"John Stockton",
"Kevin Porter",
"Magic Johnson"
)
df <- df |>
mutate(
highlight_player = if_else(player %in% star_players, player, "Others"),
highlight_player = factor(
highlight_player,
levels = c(star_players, "Others")
)
)
set.seed(42)
j_x <- 0.45
df <- df |>
mutate(
year_j = year + runif(n(), -j_x, j_x),
assists_j = assists
)
star_colors <- c(
"John Stockton" = "#00471B",
"Kevin Porter" = "#E31837",
"Magic Johnson" = "#552583",
"Others" = "#999999"
)
star_short <- c(
"John Stockton" = "Stockton",
"Kevin Porter" = "Porter",
"Magic Johnson" = "Johnson"
)
subtitle_md <- paste(
vapply(star_players, function(sp) {
sprintf(
"<span style='color:%s'>%s %d</span>",
unname(star_colors[sp]),
unname(star_short[sp]),
sum(df$player == sp)
)
}, character(1)),
collapse = ", "
)
ymin <- 21.5 # pad so 22 tick sits cleanly; record label sits below y = 30
ymax <- max(df$assists) + 0.5
record_pt <- df |>
slice_max(assists, n = 1, with_ties = FALSE)
p <- ggplot(df, aes(year_j, assists_j)) +
geom_hline(
yintercept = 22,
linetype = "dotted",
linewidth = 0.35,
alpha = 0.55,
colour = "#999999"
) +
geom_point(aes(colour = highlight_player), size = 4.2, stroke = 0, alpha = 0.9) +
ggrepel::geom_text_repel(
data = record_pt,
aes(label = player),
family = "Palatino",
size = 3.4,
colour = "#333333",
min.segment.length = 0,
segment.colour = "#999999",
segment.size = 0.35,
box.padding = 0.35,
point.padding = 0.35,
nudge_y = -0.75,
seed = 42
) +
scale_colour_manual(values = star_colors) +
guides(colour = "none") +
scale_x_continuous(
breaks = seq(floor(min(df$year) / 10) * 10, ceiling(max(df$year) / 10) * 10, by = 10),
expand = expansion(mult = 0.02)
) +
scale_y_continuous(
limits = c(ymin, ymax),
breaks = seq(22, floor(ymax), by = 1),
expand = expansion(mult = 0.02)
) +
labs(
title = "Single-game NBA performances: 22+ player assists",
subtitle = subtitle_md,
x = "Year",
y = "Assists",
caption = "data wikipedia by @iamreddave"
) +
coord_cartesian(clip = "on") +
theme_minimal(base_size = 12, base_family = "Palatino") +
theme(
plot.background = element_rect(fill = "#fffff8", colour = NA),
panel.background = element_rect(fill = "#fffff8", colour = NA),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_line(colour = "#00000014", linewidth = 0.35),
panel.border = element_blank(),
axis.line.x.bottom = element_line(colour = "#cccccc", linewidth = 0.5),
axis.line.y.left = element_line(colour = "#cccccc", linewidth = 0.5),
axis.line.x.top = element_blank(),
axis.line.y.right = element_blank(),
axis.ticks.x.bottom = element_line(colour = "#bbbbbb", linewidth = 0.45),
axis.ticks.y.left = element_line(colour = "#bbbbbb", linewidth = 0.45),
axis.ticks.length = grid::unit(5.5, "pt"),
plot.title = element_text(face = "bold", size = 15, colour = "#111111", margin = margin(b = 4)),
plot.subtitle = element_markdown(
size = 9,
colour = "#555555",
lineheight = 1.25,
margin = margin(b = 10),
family = "Palatino"
),
plot.caption = element_text(hjust = 0, size = 8, colour = "#666666", margin = margin(t = 10)),
axis.title = element_text(colour = "#333333"),
axis.text = element_text(colour = "#444444"),
plot.margin = margin(16, 24, 12, 16)
)
print(p)
ggsave(
"nba_assists_tufte.png",
plot = p,
width = 10,
height = 6.67,
dpi = 200,
bg = "#fffff8"
)
year points player season_type
1962 100 Wilt Chamberlain regular
2026 83 Bam Adebayo regular
2006 81 Kobe Bryant regular
1961 78 Wilt Chamberlain regular
1962 73 Wilt Chamberlain regular
1962 73 Wilt Chamberlain regular
1978 73 David Thompson regular
2024 73 Luka Doncic regular
1962 72 Wilt Chamberlain regular
1960 71 Elgin Baylor regular
1994 71 David Robinson regular
2023 71 Donovan Mitchell regular
2023 71 Damian Lillard regular
1963 70 Wilt Chamberlain regular
2017 70 Devin Booker regular
2024 70 Joel Embiid regular
1990 69 Michael Jordan regular
1967 68 Wilt Chamberlain regular
1977 68 Pete Maravich regular
1961 67 Wilt Chamberlain regular
1962 67 Wilt Chamberlain regular
1962 67 Wilt Chamberlain regular
1963 67 Wilt Chamberlain regular
1969 66 Wilt Chamberlain regular
1962 65 Wilt Chamberlain regular
1962 65 Wilt Chamberlain regular
1966 65 Wilt Chamberlain regular
2007 65 Kobe Bryant regular
1959 64 Elgin Baylor regular
1974 64 Rick Barry regular
1993 64 Michael Jordan regular
2023 64 Giannis Antetokounmpo regular
1949 63 Joe Fulks regular
1961 63 Elgin Baylor regular
1962 63 Jerry West regular
1962 63 Wilt Chamberlain regular
1964 63 Wilt Chamberlain regular
1978 63 George Gervin regular
1962 62 Wilt Chamberlain regular
1962 62 Wilt Chamberlain regular
1962 62 Wilt Chamberlain regular
1963 62 Wilt Chamberlain regular
1964 62 Wilt Chamberlain regular
1966 62 Wilt Chamberlain regular
2004 62 Tracy McGrady regular
2005 62 Kobe Bryant regular
2014 62 Carmelo Anthony regular
2021 62 Stephen Curry regular
2024 62 Karl-Anthony Towns regular
2024 62 Devin Booker regular
1952 61 George Mikan regular
1961 61 Wilt Chamberlain regular
1962 61 Wilt Chamberlain regular
1962 61 Wilt Chamberlain regular
1962 61 Wilt Chamberlain regular
1962 61 Wilt Chamberlain regular
1962 61 Wilt Chamberlain regular
1987 61 Michael Jordan regular
1987 61 Michael Jordan regular
1990 61 Karl Malone regular
2000 61 Shaquille O'Neal regular
2009 61 Kobe Bryant regular
2014 61 LeBron James regular
2019 61 James Harden regular
2019 61 James Harden regular
2020 61 Damian Lillard regular
2020 61 Damian Lillard regular
2024 61 Jalen Brunson regular
2025 61 Nikola Jokic regular
1961 60 Wilt Chamberlain regular
1961 60 Wilt Chamberlain regular
1969 60 Wilt Chamberlain regular
1984 60 Bernard King regular
1985 60 Larry Bird regular
1990 60 Tom Chambers regular
2005 60 Allen Iverson regular
2006 60 Gilbert Arenas regular
2007 60 Kobe Bryant regular
2016 60 Kobe Bryant regular
2016 60 Klay Thompson regular
2018 60 James Harden regular
2018 60 Kemba Walker regular
2019 60 Damian Lillard regular
2019 60 James Harden regular
2021 60 Bradley Beal regular
2021 60 Jayson Tatum regular
2022 60 Karl-Anthony Towns regular
2022 60 Kyrie Irving regular
2022 60 Luka Doncic regular
2023 60 Damian Lillard regular
2024 60 Stephen Curry regular
2024 60 De'Aaron Fox regular
2026 60 Luka Doncic regular
1986 63 Michael Jordan playoff
1962 61 Elgin Baylor playoff
# NBA rebounding leaders scatter (Tufte-style).
# Data: nba_rebounds.csv from Wikipedia
# https://en.wikipedia.org/wiki/List_of_NBA_single-game_rebounding_leaders
# — Table 1: 38+ rebounds in a game (all-time)
# — Table 2: 30+ rebounds since NBA/ABA merger (1976)
library(ggplot2)
library(dplyr)
library(ggtext)
df <- read.csv("nba_rebounds.csv", stringsAsFactors = FALSE)
# --- Summary: top 5 by appearances (ties at rank 5 reported) ---
counts_tbl <- df |>
count(player, name = "games", sort = TRUE)
total_games <- nrow(df)
unique_players <- n_distinct(df$player)
cat("\n=== NBA rebound CSV summary ===\n")
cat("Total games (rows): ", total_games, "\n", sep = "")
cat("Unique players: ", unique_players, "\n\n", sep = "")
cat("Top players by game count:\n")
print(utils::head(counts_tbl, 15), row.names = FALSE)
cat("\nTop 5 (strict rows 1–5):\n")
print(utils::head(counts_tbl, 5), row.names = FALSE)
if (nrow(counts_tbl) >= 6 && counts_tbl$games[6] == counts_tbl$games[5]) {
cat("\nTied at rank 5 (same count as row 5):\n")
tie_n <- counts_tbl$games[5]
print(counts_tbl[counts_tbl$games == tie_n, ], row.names = FALSE)
}
cat("\n")
# Highlight only the three clear leaders (Nater / Malone / Willis stay gray).
# Jersey cues: Chamberlain — Warriors/Lakers gold; Russell — Celtics green;
# Rodman — Bulls red (his most iconic look).
star_players <- c(
"Wilt Chamberlain",
"Bill Russell",
"Dennis Rodman"
)
df <- df |>
mutate(
highlight_player = if_else(player %in% star_players, player, "Others"),
highlight_player = factor(
highlight_player,
levels = c(star_players, "Others")
)
)
set.seed(42)
j_x <- 0.55
df <- df |>
mutate(
year_j = year + runif(n(), -j_x, j_x),
rebounds_j = rebounds
)
star_colors <- c(
"Wilt Chamberlain" = "#FDB927",
"Bill Russell" = "#007A33",
"Dennis Rodman" = "#CE1141",
"Others" = "#999999"
)
star_short <- c(
"Wilt Chamberlain" = "Chamberlain",
"Bill Russell" = "Russell",
"Dennis Rodman" = "Rodman"
)
subtitle_md <- paste(
vapply(star_players, function(sp) {
sprintf(
"<span style='color:%s'>%s %d</span>",
unname(star_colors[sp]),
unname(star_short[sp]),
sum(df$player == sp)
)
}, character(1)),
collapse = ", "
)
ymin <- floor(min(df$rebounds) / 5) * 5
ymax <- ceiling(max(df$rebounds) / 5) * 5
p <- ggplot(df, aes(year_j, rebounds_j)) +
geom_point(aes(colour = highlight_player), size = 4.2, stroke = 0, alpha = 0.9) +
scale_colour_manual(values = star_colors) +
guides(colour = "none") +
scale_x_continuous(
breaks = seq(floor(min(df$year) / 10) * 10, ceiling(max(df$year) / 10) * 10, by = 10),
expand = expansion(mult = 0.02)
) +
scale_y_continuous(
breaks = seq(ymin, ymax, by = 5),
expand = expansion(mult = 0.03)
) +
labs(
title = "NBA single-game rebounding leaders",
subtitle = subtitle_md,
x = "Year",
y = "Rebounds",
caption = "data:wikipedia by @iamreddave"
) +
coord_cartesian(clip = "on") +
theme_minimal(base_size = 12, base_family = "Palatino") +
theme(
plot.background = element_rect(fill = "#fffff8", colour = NA),
panel.background = element_rect(fill = "#fffff8", colour = NA),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_line(colour = "#00000014", linewidth = 0.35),
panel.border = element_blank(),
axis.line.x.bottom = element_line(colour = "#cccccc", linewidth = 0.5),
axis.line.y.left = element_line(colour = "#cccccc", linewidth = 0.5),
axis.line.x.top = element_blank(),
axis.line.y.right = element_blank(),
axis.ticks.x.bottom = element_line(colour = "#bbbbbb", linewidth = 0.45),
axis.ticks.y.left = element_blank(),
axis.ticks.length = grid::unit(5.5, "pt"),
plot.title = element_text(face = "bold", size = 15, colour = "#111111", margin = margin(b = 4)),
plot.subtitle = element_markdown(
size = 9,
colour = "#555555",
lineheight = 1.25,
margin = margin(b = 10),
family = "Palatino"
),
plot.caption = element_text(hjust = 0, size = 8, colour = "#666666", margin = margin(t = 10)),
axis.title = element_text(colour = "#333333"),
axis.text = element_text(colour = "#444444"),
plot.margin = margin(16, 24, 12, 16)
)
print(p)
ggsave(
"nba_rebounds_tufte.png",
plot = p,
width = 10,
height = 6.67,
dpi = 200,
bg = "#fffff8"
)
year rebounds player team game_date Opponent notes list_section playoff
1960 55 Wilt Chamberlain Philadelphia Warriors November 24, 1960 Boston Celtics Record set in a losing effort; grabbed 31 rebounds in one half; scored 34 points. 38_or_more no
1960 51 Bill Russell Boston Celtics February 5, 1960 Syracuse Nationals Set a then-record for rebounds in a game; set a still-standing record for rebounds in a winning effort. 38_or_more no
1957 49 Bill Russell Boston Celtics November 16, 1957 Philadelphia Warriors Set a then-record for rebounds in a game; set a still-standing record of 32 rebounds in a single half. 38_or_more no
1965 49 Bill Russell Boston Celtics March 11, 1965 Detroit Pistons 38_or_more yes
1960 45 Wilt Chamberlain Philadelphia Warriors February 6, 1960 Syracuse Nationals Single-game record for a rookie; scored 44 points; the fourth quadruple double-double in NBA history. 38_or_more no
1961 45 Wilt Chamberlain Philadelphia Warriors January 21, 1961 Los Angeles Lakers Scored 56 points; the fifth quadruple double-double in NBA history. 38_or_more no
1959 43 Wilt Chamberlain Philadelphia Warriors November 10, 1959 New York Knicks Set a then-record for a rookie; scored 39 points. 38_or_more no
1961 43 Wilt Chamberlain Philadelphia Warriors December 8, 1961 Los Angeles Lakers Triple overtime; Chamberlain also scored a then-record 78 points in the game; the sixth quadruple double-double in NBA history. 38_or_more no
1963 43 Bill Russell Boston Celtics January 20, 1963 Los Angeles Lakers 38_or_more no
1965 43 Wilt Chamberlain Philadelphia 76ers March 6, 1965 Boston Celtics 38_or_more no
1960 42 Wilt Chamberlain Philadelphia Warriors January 15, 1960 Boston Celtics Rookie season; scored 44 points; the second quadruple double-double in NBA history. 38_or_more no
1960 42 Wilt Chamberlain Philadelphia Warriors January 25, 1960 Detroit Pistons Rookie season; Chamberlain also scored a rookie record 58 points in the same game; the third quadruple double-double in NBA history. 38_or_more no
1965 42 Nate Thurmond San Francisco Warriors November 9, 1965 Detroit Pistons 38_or_more no
1966 42 Wilt Chamberlain Philadelphia 76ers January 14, 1966 Boston Celtics Scored 37 points. 38_or_more no
1969 42 Wilt Chamberlain Los Angeles Lakers March 7, 1969 Boston Celtics Overtime. 38_or_more no
1958 41 Bill Russell Boston Celtics February 12, 1958 Syracuse Nationals 38_or_more no
1962 41 Wilt Chamberlain San Francisco Warriors October 26, 1962 Detroit Pistons Overtime; scored 50 points; the seventh quadruple double-double in NBA history. 38_or_more no
1965 41 Bill Russell Boston Celtics March 14, 1965 San Francisco Warriors 38_or_more no
1967 41 Wilt Chamberlain Philadelphia 76ers April 5, 1967 Boston Celtics Game 3 victory in the Eastern Division finals. 38_or_more yes
1958 40 Bill Russell Boston Celtics March 23, 1958 Philadelphia Warriors Game 3 victory in the Eastern Division finals. 38_or_more yes
1958 40 Bill Russell Boston Celtics December 12, 1958 Cincinnati Royals Overtime. 38_or_more no
1959 40 Wilt Chamberlain Philadelphia Warriors November 4, 1959 Syracuse Nationals Set a then-record for a rookie; third game of career; scored 41 points; the first quadruple double-double in NBA history. 38_or_more no
1960 40 Bill Russell Boston Celtics March 29, 1960 St. Louis Hawks NBA Finals record (tie) 38_or_more yes
1961 40 Bill Russell Boston Celtics February 12, 1961 Philadelphia Warriors 38_or_more no
1962 40 Bill Russell Boston Celtics April 18, 1962 Los Angeles Lakers NBA Finals record (tie); game 7 overtime victory; Russell's 19 rebounds in a single quarter is the most of any NBA quarter — regular season or playoffs; scored 30 points. 38_or_more yes
1964 40 Jerry Lucas Cincinnati Royals February 29, 1964 Philadelphia 76ers His rookie season. 38_or_more no
1964 40 Wilt Chamberlain San Francisco Warriors November 22, 1964 Detroit Pistons Scored 50 points; the eighth and final quadruple double-double in NBA history. 38_or_more no
1965 40 Wilt Chamberlain Philadelphia 76ers December 28, 1965 Boston Celtics Scored 31 points. 38_or_more no
1954 39 Neil Johnston Philadelphia Warriors December 4, 1954 Syracuse Nationals Set a then-record. 38_or_more no
1959 39 Bill Russell Boston Celtics January 25, 1959 Detroit Pistons 38_or_more no
1959 39 Bill Russell Boston Celtics December 19, 1959 New York Knicks 38_or_more no
1959 39 Wilt Chamberlain Philadelphia Warriors December 28, 1959 Cincinnati Royals Rookie season; scored 39 points. 38_or_more no
1960 39 Wilt Chamberlain Philadelphia Warriors January 13, 1960 Syracuse Nationals Rookie season; scored 42 points. 38_or_more no
1960 39 Wilt Chamberlain Philadelphia Warriors January 29, 1960 Boston Celtics Rookie season; scored 43 points. 38_or_more no
1960 39 Bill Russell Boston Celtics March 19, 1960 Philadelphia Warriors 38_or_more no
1961 39 Bill Russell Boston Celtics March 23, 1961 Syracuse Nationals 38_or_more no
1961 39 Wilt Chamberlain Philadelphia Warriors November 4, 1961 Detroit Pistons Scored 58 points. 38_or_more no
1961 39 Bill Russell Boston Celtics December 21, 1961 New York Knicks 38_or_more no
1965 39 Wilt Chamberlain Philadelphia 76ers April 6, 1965 Boston Celtics Scored 30 points. 38_or_more no
1956 38 Maurice Stokes Rochester Royals January 14, 1956 Syracuse Nationals Rookie season; triple-double, scored 26 points with 12 assists. 38_or_more no
1958 38 Bill Russell Boston Celtics February 23, 1958 Philadelphia Warriors 38_or_more no
1959 38 Bill Russell Boston Celtics December 4, 1959 New York Knicks 38_or_more no
1960 38 Wilt Chamberlain Philadelphia Warriors November 29, 1960 Los Angeles Lakers Scored 44 points. 38_or_more no
1960 38 Wilt Chamberlain Philadelphia Warriors December 18, 1960 Cincinnati Royals Scored 32 points. 38_or_more no
1961 38 Bill Russell Boston Celtics April 11, 1961 St. Louis Hawks Scored 30 points 38_or_more no
1961 38 Wilt Chamberlain Philadelphia Warriors November 25, 1961 Chicago Packers Scored 39 points. 38_or_more no
1963 38 Bill Russell Boston Celtics February 21, 1963 San Francisco Warriors 38_or_more no
1963 38 Wilt Chamberlain San Francisco Warriors February 21, 1963 Boston Celtics Scored 40 points. 38_or_more no
1963 38 Bill Russell Boston Celtics April 16, 1963 Los Angeles Lakers 38_or_more no
1964 38 Wilt Chamberlain San Francisco Warriors April 24, 1964 Boston Celtics 38_or_more no
1965 38 Bill Russell Boston Celtics January 30, 1965 New York Knicks 38_or_more no
1965 38 Bill Russell Boston Celtics March 3, 1965 Los Angeles Lakers 38_or_more no
1967 38 Wilt Chamberlain Philadelphia 76ers March 2, 1967 San Francisco Warriors Triple-double, scored 24 points with 13 assists. 38_or_more no
1967 38 Wilt Chamberlain Philadelphia 76ers April 16, 1967 San Francisco Warriors Triple-double, scored 10 points with 10 assists; 26 rebounds in one half, setting the NBA Playoffs record. 38_or_more yes
1967 38 Wilt Chamberlain Philadelphia 76ers December 20, 1967 Seattle SuperSonics Scored 53 points. 38_or_more no
1969 38 Wilt Chamberlain Los Angeles Lakers March 9, 1969 Baltimore Bullets 38_or_more no
1979 37 Moses Malone Houston Rockets February 9, 1979 New Orleans Jazz Scored 33 points. 30_or_more_since_1976 no
1988 35 Charles Oakley Chicago Bulls April 22, 1988 Cleveland Cavaliers 30_or_more_since_1976 no
1992 34 Dennis Rodman Detroit Pistons March 4, 1992 Indiana Pacers Overtime. 30_or_more_since_1976 no
1993 34 Rony Seikaly Miami Heat March 3, 1993 Washington Bullets 30_or_more_since_1976 no
1976 33 Swen Nater Milwaukee Bucks December 19, 1976 Atlanta Hawks Scored 30 points. 30_or_more_since_1976 no
1992 33 Kevin Willis Atlanta Hawks February 19, 1992 Washington Bullets Overtime. 30_or_more_since_1976 no
1996 33 Charles Barkley Houston Rockets November 2, 1996 Phoenix Suns 30_or_more_since_1976 no
1979 32 Robert Parish Golden State Warriors March 30, 1979 New York Knicks Scored 30 points. 30_or_more_since_1976 no
1979 32 Swen Nater San Diego Clippers December 14, 1979 Denver Nuggets 30_or_more_since_1976 no
1982 32 Moses Malone Houston Rockets February 11, 1982 Seattle SuperSonics Scored 38 points. 30_or_more_since_1976 no
1992 32 Dennis Rodman Detroit Pistons January 28, 1992 Charlotte Hornets Overtime. 30_or_more_since_1976 no
1994 32 Dennis Rodman San Antonio Spurs January 22, 1994 Dallas Mavericks 30_or_more_since_1976 no
1981 31 Larry Smith Golden State Warriors March 28, 1981 Denver Nuggets His rookie season. 30_or_more_since_1976 no
1991 31 Kevin Willis Atlanta Hawks December 3, 1991 Dallas Mavericks 30_or_more_since_1976 no
1992 31 Dennis Rodman Detroit Pistons March 14, 1992 Sacramento Kings 30_or_more_since_1976 no
1996 31 Dikembe Mutombo Denver Nuggets March 26, 1996 Charlotte Hornets Double overtime. 30_or_more_since_1976 no
2010 31 Kevin Love Minnesota Timberwolves November 12, 2010 New York Knicks Scored 31 points; youngest player to record 30+ rebounds in a single game. 30_or_more_since_1976 no
2024 31 Jusuf Nurkić Phoenix Suns March 3, 2024 Oklahoma City Thunder 30_or_more_since_1976 no
1978 30 Kareem Abdul-Jabbar Los Angeles Lakers February 3, 1978 New Jersey Nets Overtime; scored 37 points. 30_or_more_since_1976 no
1978 30 Swen Nater Buffalo Braves March 4, 1978 New Jersey Nets 30_or_more_since_1976 no
1988 30 Michael Cage Los Angeles Clippers April 24, 1988 Seattle SuperSonics 30_or_more_since_1976 no
1995 30 Dennis Rodman San Antonio Spurs February 21, 1995 Houston Rockets 30_or_more_since_1976 no
2012 30 Andrew Bynum Los Angeles Lakers April 11, 2012 San Antonio Spurs 30_or_more_since_1976 no
2018 30 Dwight Howard Charlotte Hornets March 21, 2018 Brooklyn Nets Scored 32 points. 30_or_more_since_1976 no
2021 30 Enes Kanter Freedom Portland Trail Blazers April 10, 2021 Detroit Pistons 30_or_more_since_1976 no
library(ggplot2)
library(dplyr)
library(ggtext)
library(ggrepel)
df <- read.csv("nba_60plus.csv", stringsAsFactors = FALSE)
star_players <- c(
"Wilt Chamberlain",
"Kobe Bryant",
"Damian Lillard",
"Michael Jordan",
"James Harden",
"Elgin Baylor"
)
df <- df |>
mutate(
highlight_player = case_when(
player == "Wilt Chamberlain" ~ "Wilt Chamberlain",
player == "Kobe Bryant" ~ "Kobe Bryant",
player == "Damian Lillard" ~ "Damian Lillard",
player == "Michael Jordan" ~ "Michael Jordan",
player == "James Harden" ~ "James Harden",
player == "Elgin Baylor" ~ "Elgin Baylor",
TRUE ~ "Others"
),
highlight_player = factor(highlight_player, levels = c(star_players, "Others"))
)
# Horizontal jitter only: dot *centers* sit on true scores (y = points).
# Vertical jitter made e.g. the 100-pt game sit below the 100 gridline — ggplot
# always centers points on (x, y), never "top edge on value".
set.seed(42)
j_x <- 0.55
df <- df |>
mutate(
year_j = year + runif(n(), -j_x, j_x),
points_j = points
) |>
# Two 1987 MJ 61-pt rows: offset after jitter (L/up, R/down)
group_by(year, points, player) |>
mutate(
mj_twin = if_else(
player == "Michael Jordan" & points == 61 & year == 1987 & n() == 2,
row_number(),
NA_integer_
)
) |>
ungroup() |>
mutate(
year_j = case_when(
mj_twin == 1L ~ year_j - 0.2,
mj_twin == 2L ~ year_j + 0.2,
TRUE ~ year_j
),
points_j = case_when(
mj_twin == 1L ~ points_j + 0.2,
mj_twin == 2L ~ points_j - 0.2,
TRUE ~ points_j
)
) |>
select(-mj_twin)
# Team-leaning colors for highlighted stars (+ gray Others). Baylor: Lakers-era navy.
star_colors <- c(
"Wilt Chamberlain" = "#E6B800",
"Kobe Bryant" = "#552583",
"Michael Jordan" = "#CE1141",
"James Harden" = "#76b7b2",
"Damian Lillard" = "#1a1a1a",
"Elgin Baylor" = "#1c2e50",
"Others" = "#888888"
)
star_short <- c(
"Wilt Chamberlain" = "Chamberlain",
"Kobe Bryant" = "Bryant",
"Damian Lillard" = "Lillard",
"Michael Jordan" = "Jordan",
"James Harden" = "Harden",
"Elgin Baylor" = "Baylor"
)
label_df <- df |>
filter(player == "Bam Adebayo", points == 83) |>
mutate(label = "Bam Adebayo")
subtitle_md <- paste(
vapply(star_players, function(sp) {
sprintf(
"<span style='color:%s'>%s %d</span>",
unname(star_colors[sp]),
unname(star_short[sp]),
sum(df$player == sp)
)
}, character(1)),
collapse = ", "
)
p <- ggplot(df, aes(year_j, points_j)) +
geom_hline(
yintercept = 60,
linetype = "dotted",
linewidth = 0.35,
alpha = 0.55,
colour = "#999999"
) +
geom_point(aes(colour = highlight_player), size = 4.8, stroke = 0, alpha = 0.92) +
scale_colour_manual(values = star_colors) +
guides(colour = "none") +
geom_text_repel(
data = label_df,
aes(label = label),
size = 3.4,
family = "Palatino",
colour = "#111111",
min.segment.length = 0,
box.padding = 0.45,
max.overlaps = Inf,
segment.color = "#666666",
segment.size = 0.3,
point.padding = 0
) +
# Anchor speculative-era games at 2026; omit 2030 tick to avoid implying real timeline
scale_x_continuous(
breaks = c(seq(1950, 2020, by = 10), 2026),
expand = expansion(mult = c(0.02, 0.12))
) +
scale_y_continuous(
breaks = seq(60, 100, by = 10),
expand = expansion(mult = 0.03)
) +
labs(
title = "NBA games with 60 or more points",
subtitle = subtitle_md,
x = "Year",
y = "Points scored",
caption = "data: wikipedia by @iamreddave"
) +
coord_cartesian(clip = "off") +
theme_minimal(base_size = 12, base_family = "Palatino") +
theme(
plot.background = element_rect(fill = "#fffff8", colour = NA),
panel.background = element_rect(fill = "#fffff8", colour = NA),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_line(colour = "#00000014", linewidth = 0.35),
panel.border = element_blank(),
axis.line.x.bottom = element_line(colour = "#cccccc", linewidth = 0.5),
axis.line.y.left = element_line(colour = "#cccccc", linewidth = 0.5),
axis.line.x.top = element_blank(),
axis.line.y.right = element_blank(),
axis.ticks.x.bottom = element_line(colour = "#bbbbbb", linewidth = 0.45),
axis.ticks.y.left = element_blank(),
axis.ticks.length = grid::unit(5.5, "pt"),
plot.title = element_text(
face = "bold",
size = 15,
colour = "#111111",
margin = margin(b = 4)
),
plot.subtitle = element_markdown(
size = 9.5,
colour = "#555555",
lineheight = 1.2,
margin = margin(b = 10),
family = "Palatino"
),
plot.caption = element_text(
hjust = 1,
size = 9,
colour = "#666666",
margin = margin(t = 10)
),
axis.title = element_text(colour = "#333333"),
axis.text = element_text(colour = "#444444"),
plot.margin = margin(16, 36, 12, 16)
)
print(p)
# Tufte-style PNG; Bam Adebayo labeled (name only), segment to jittered point
ggsave(
"nba_60plus_tufte.png",
plot = p,
width = 10,
height = 6.67,
dpi = 200,
bg = "#fffff8"
)
@cavedave

cavedave commented May 9, 2026

Copy link
Copy Markdown
Author
nba_assists_tufte

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment