sdvplot-js docs · View source

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).

teams, season . Best point differential: .

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

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.