Free course · Beginner to Intermediate · 10 parts · ~60 min

Sports Data Visualization

Ten chart types, each built on real sports data, ending with the styling pass that makes a figure publishable.

Charts are how analysis gets believed. This course works through the chart types that cover almost every sports-data situation — bars, part-to-whole, shaded ranges, dual axes, small multiples, heatmaps, bump charts — one honest build at a time, each from data you can inspect.

The order matters less here than elsewhere: the first five are independent of each other. But save the last step for last — it's the difference between a chart that works and a chart you'd put your name on.

What you'll be able to do

  • Pick the right chart form for a comparison, a trend, or a distribution
  • Build hexbin shot heatmaps and correlation matrices that stay readable
  • Track rank over time with a bump chart
  • Apply a deliberate styling pass: fonts, grids, labels, source lines
Download the course bundle - every script + dataset, one ZIP

The bundle contains each part's finished script, the shared helpers, and the sample data they read, with a README listing the run order - the whole course works offline.

The syllabus

Pace: The first five parts are independent - take one whenever you have an hour. Give the last three consecutive evenings.

  1. Stacked Bar Charts: Win-Loss CompositionBeginner · ~5 minPart plus whole in one mark - the simplest honest composition chart.
  2. Grouped Bar Charts: Compare Two Metrics Side by SideBeginner · ~5 minSide-by-side comparison is the bread and butter of sports charts.
  3. Pie and Donut Charts: Showing Part-to-Whole (and When Not To)Beginner · ~5 minPart-to-whole done carefully - including when a pie is the wrong call.
  4. fill_between: Shade Above and Below a BaselineBeginner · ~5 minShaded bands say 'range' better than any pair of lines.
  5. Dual-Axis Charts: Plot Two Scales with twinx()Intermediate · ~5 minTwo units, one timeline - and the honesty rules dual axes demand.
  6. Small Multiples: Compare Every Team at Once with SubplotsIntermediate · ~7 minOne small chart per team beats one giant unreadable one.
  7. A Correlation Heatmap: Which Team Stats Move TogetherIntermediate · ~5 minEvery pairwise relationship at a glance, before you model anything.
  8. Make a Shot-Density Heatmap with hexbinIntermediate · ~5 minDensity beats scatter once you have thousands of points.
  9. A Standings Bump Chart: Visualizing a Season's TwistsAdvanced · ~10 minRank over time is its own chart form; bump charts read like a story.
  10. Publication-Ready Charts: matplotlib Styling and AnnotationsIntermediate · ~8 minThe final pass - typography, grids, labels, source lines - that makes a chart yours.

Check yourself

Five questions, graded on the page, nothing recorded anywhere - pick an answer and the explanation appears.

1. Your reader needs to compare eight teams' totals. The best default form is…

2. When is a dual-axis chart defensible?

3. You have 10,000 shot locations and a scatter plot is a smear. Reach for…

4. Small multiples work because…

5. A correlation heatmap shows…

Where next: Statistics for Sports Data · Basketball Analytics with the NBA API.