Season ratings scatter with logos
The question: which teams were actually good, and which were lucky? Wins and losses are noisy; points scored and allowed per game say more about a team's strength. Plotting the two against each other, with each team as its logo, shows the whole league at once: up and to the right is good at both ends.
The workflow: sportsdataverse-js reads ESPN's standings (sdv.nba.espnNbaStandings({ season: 2025, parsed: true }) in Node; the same parser on the same JSON here). Each row is a team with its conference, record, and points for and against per game (avg_points_for, avg_points_against). sdvplot draws the scatter with logos and meanLines, and ranks the teams by point differential per game with teamTiers. ESPN's team ids resolve in sdvplot as they are.
The snapshot is the final 2024-25 NBA regular season (ESPN season=2025). Tick Fetch live from ESPN to load another season, or leave Season blank for the one ESPN serves now (early in a season the sample is small, so the points cluster).
The dashed diagonal is break-even: a team above it outscored its opponents. The solid lines are the means of the teams shown. Hover a logo for its numbers.
Tiers by point differential
teamTiers ranks the same teams within bands of point differential per game: +6 or better, +2 to +6, within 2 of even, −2 to −6, and worse than −6.
What to take from it
- Differential beats the record. Points scored minus points allowed per game is a steadier measure of a team than its win-loss record, which close games bend. In the 2024-25 snapshot, Oklahoma City's +12.9 led Cleveland's +9.5 by 3.4 points a game, yet the two finished only four wins apart (68-14 and 64-18).
- Reverse the "allowed" axis. With points allowed reversed, up is good on both axes, so the top-right corner holds the teams that are good at both ends and the bottom-left the teams that are bad at both.
- The same rows feed both charts. One parse of the standings drives the scatter and the tiers; switching the conference re-filters the rows, not the requests.
Script it in Node: sdv-js's standings table tutorial turns ESPN standings into a publication table PNG, and its WNBA standings tutorial colours them by team. The Logos by league notebook covers logos, meanLines and axisLogos.