Skip to content
Historical Data Visualisation

Make a flow map of migration only when three conditions hold: you have geocoded origin–destination pairs with counts, geography genuinely drives the story, and the number of major flows is small enough (roughly under fifty) that lines stay legible. When origins are vague, routes number in the hundreds, or the real question is change over time, a chord diagram, matrix, or small multiples will serve you far better. This guide is about that decision, not the rendering.

What is a flow map actually good at?

A flow map answers one question well: where did people move from and to, and in what volume, across real space? It excels when:

  • The geographic pattern is the argument (coastal-to-inland, rural-to-urban drift).
  • Endpoints are known places you can geocode with confidence.
  • A handful of dominant flows carry most of the signal.

If those are not true, the map's strengths become liabilities.

When should you NOT make a flow map?

Reach for something else when any of these apply:

Signal in your dataBetter than a flow map
Hundreds of overlapping routesChord diagram or O–D matrix heatmap
Vague origins ("the north", "abroad")Aggregated bar chart by region
The question is volume over timeStacked area or small multiples
You only have destination countsChoropleth of net in-migration
Net balance matters more than directionDiverging bar of net flow per place

A flow map drawn on weak data does not look uncertain — it looks authoritative and wrong, which is the worst outcome.

What does your source data need to contain?

You need three things per link, and if any is missing you cannot draw an honest weighted flow:

csv
origin,dest,o_lat,o_lon,d_lat,d_lon,count,conf
Cork,Liverpool,51.90,-8.47,53.41,-2.99,4200,high
"rural Mayo",Glasgow,53.90,-9.30,55.86,-4.25,1800,low

The conf column matters: many historical migration sources record destinations precisely (port registers) but origins only loosely. Carry that asymmetry into the visual with line opacity, and never invent a coordinate to fill a blank.

How do you keep it from becoming a hairball?

Even with good data, density kills legibility. The standard defences, in order of effort:

  1. Filter to the top N flows by volume; fold the rest into an aggregated remainder.
  2. Aggregate endpoints to regions when town-level detail is noise.
  3. Bundle or curve edges so parallel routes separate visually.
  4. Add transparency so overlapping lines read as density, not a solid block.
  5. Weight line width by count — but cap the maximum so one mega-flow does not blanket the map.

If you still cannot read it after all five, that is your data telling you a flow map is the wrong form.

Directed or undirected — which fits your sources?

Only encode direction if your sources actually record it. Passenger lists give true direction; co-occurrence in two parishes does not. When direction is real, taper line width from thick origin to thin destination, or use a colour gradient — arrowheads clutter at scale. When direction is unknown, say so and draw undirected links; implying directed migration you cannot evidence is a quiet but serious distortion.

A quick decision checklist

Before committing, confirm you can answer yes to all of these. If not, choose an alternative form:

  • Are both endpoints geocodable with documented confidence?
  • Do fewer than ~50 flows carry most of the volume?
  • Is spatial direction the point, rather than trend or composition?
  • Can you honestly represent uncertain origins?
  • Will width and opacity keep the busiest area readable?

Key Takeaways

  • A flow map needs geocoded O–D pairs, counts, and a manageable number of major flows.
  • Don't use one for vague origins, hundreds of routes, or questions about change over time.
  • Carry source asymmetry (precise ports, vague hinterlands) into line opacity.
  • Defeat the hairball with filtering, aggregation, edge bundling, and transparency.
  • Show direction only when your sources record it; otherwise draw undirected links.
  • Consider a chord diagram, O–D matrix, or choropleth when the map fails the checklist.

Frequently Asked Questions

When is a flow map the right choice for migration data?

Use a flow map when you have reliable origin–destination pairs with counts, when geography genuinely drives the story, and when there are few enough major flows (roughly under 50) that lines do not collapse into a hairball.

When should I avoid a flow map?

Avoid it when origins or destinations are vague, when you have hundreds of overlapping routes, or when the real question is volume over time rather than spatial direction; a chord diagram, matrix, or small-multiple bar chart often serves better.

What data do I need to build a migration flow map?

You need origin and destination coordinates plus a flow magnitude for each pair; without geocoded endpoints and a count or estimate per link, you cannot draw weighted, directed flows honestly.

How do I stop a flow map turning into a hairball?

Filter to the top flows by volume, aggregate minor routes into an "other" category, use curved or edge-bundled lines, and add transparency so overlapping flows reveal density instead of a solid mass.

Should migration flow lines be directed?

Yes if direction matters to your argument; encode it with arrowheads, tapering width, or a colour gradient from origin to destination, but only if your sources actually record direction rather than mere co-occurrence.