Skip to content

Create a Choropleth Map

Goal: Build a beautiful, accurate choropleth map. Avoid the common mistakes (raw counts, rainbow palettes, too many classes).

A choropleth is a thematic map where polygons are colored by a value. It's the most common — and most misused — map type.


The 6 rules of a good choropleth

  1. Normalize the data (don't show raw counts).
  2. Use a sequential palette (light → dark of one hue).
  3. Pick a sensible classification (5 classes is usually right).
  4. Round legend labels to readable numbers.
  5. Add the projection (some projections distort area badly).
  6. Tell the story in the title.

Walkthrough — Median Household Income, by US County

Step 1 — Get the data

  1. Living Atlas → search "USA Counties Generalized". Add to map.
  2. Living Atlas → search "USA Median Household Income" or download from the Census ACS. Add the table.

Step 2 — Join, if needed

If your income data is a separate CSV:

  1. Confirm both have a 5-character FIPS field (Text type).
  2. Right-click counties → Joins and Relates → Add Join.
  3. Validate. Apply. → Detail: Joins & Relates.

Step 3 — Pick a projection

For the contiguous US, use NAD83 / Conus Albers (EPSG:5070). It preserves area, which is exactly what a choropleth needs.

  1. Right-click the map (Contents) → Properties → Coordinate Systems → Search "Albers" → select.

Step 4 — Rule 1: normalize

For income, the value is already a rate ($/household), so no normalization needed. But for most choropleths:

Raw Normalized
Total population Population density (per km²)
Crime count Crimes per 1,000 people
Number of restaurants Restaurants per 10,000 people

If you only have raw counts, add a calculated field. → Attribute Tables.

Step 5 — Symbology

  1. Right-click counties → Symbology.
  2. Primary symbology = Graduated Colors.
  3. Field: MEDIAN_INCOME.
  4. Method: Natural Breaks (Jenks). 5 classes.
  5. Color scheme: a sequential green palette (e.g., Greens), color-blind safe.
  6. Outline: 0.25 pt, gray.
  7. Round upper values in the legend (open each class → set Label):
< $40K
$40K – $55K
$55K – $70K
$70K – $90K
> $90K

Step 6 — Layout

→ Detail: Professional Map Layout.

Title: "Median Household Income, US Counties, 2022"

Subtitle: "American Community Survey 5-year estimates"

Legend, scale bar, north arrow, source line, projection note.

Step 7 — Export

PDF, vector, 300 dpi.


Choropleth mistakes to avoid

Don't

  • 🚫 Show raw counts. "Total robberies, by state" is meaningless without per-capita normalization.
  • 🚫 Use Web Mercator for area-based thematic maps. Areas in Alaska look 3× too big.
  • 🚫 Use a rainbow palette (red → green → blue) — it implies non-existent jumps.
  • 🚫 Use too many classes (>7). The eye can't distinguish.
  • 🚫 Use Equal Interval on skewed data — most polygons end up in one bin.
  • 🚫 Forget the source / date.

Do

  • ✅ Pick a sequential palette for ordered data, diverging for ±values.
  • ✅ Add 5 classes as a default.
  • ✅ Label classes with rounded numbers.
  • ✅ Note the projection in the corner.
  • ✅ Title the question, not the data.

Variant: bivariate choropleth (advanced)

Show two variables at once with a 3×3 color grid. E.g., income (3 levels) × education (3 levels) = 9 colors.

ArcGIS Pro doesn't do this out of the box; either:

  • Bivariate Colors symbology (in newer Pro versions), or
  • Build it manually with a CONCATENATE(income_class, edu_class) field and a unique-values symbology with a 9-color palette.

Practice

Try a normalized choropleth

  1. Add a counties layer.
  2. Calculate population density: POP2020 / SHAPE_AREA_KM2.
  3. Choropleth on density (Quantile, 5 classes, Reds palette).
  4. Compare to a choropleth on raw POP2020. Notice the difference.

The density map is honest. The raw count is misleading (large counties always look big).