The country moved right in 2024. You have heard that sentence, and a red-and-blue map of who won cannot check it. A county that went from 70% Republican to 60% Republican is still red, and it just moved ten points toward the Democrats. Color shows the level; the sentence is a claim about change. So turn it into a question a citizen can answer from the record: which way did the country move between 2020 and 2024, and where — everywhere at once, or only in some places?
The form that answers it is a wind map, which draws change instead of level. Every place gets an arrow: which way it moved between the two elections, and how far. Together the arrows look like a weather chart, and they read like one — you can see whether a front crossed the whole country or only part of it. That is the argument for the form. One mark carries direction and size at once, which is exactly the pair of things the question asks and exactly the pair a colored map cannot show.
The question needs the same places observed twice, and the county is the right unit mostly by elimination. States are too coarse to show where movement happened, precincts are not published nationally at all, and counties are the only level in between with national coverage in both years.
No federal source publishes county returns. The Federal Election Commission publishes official results by state and by congressional district and not by county,1 and no agency assembles what the states publish. So every national county map anyone has drawn rests on somebody’s private compilation. The one here is the county presidential returns for 2020 and 2024 compiled by the researcher Tony McGovern and downloadable at https://github.com/tonmcg/US_County_Level_Election_Results_08-24. His README — the note that accompanies a published data file and says what it holds and where it came from — says the 2024 figures were copied from Fox News’s results pages, the 2020 figures from Fox News, Politico and the New York Times, and that the figures “are not authoritative.” A file that admits what it is makes an honest foundation, and the limits section below takes the admission seriously.
What a certified return is, who writes it and what it can bear is the subject of this cluster’s returns chapter. What it costs to assemble the fifty-one states’ own files instead is the county-returns brief’s.
Two more sources anchor the picture. Each arrow starts at the Census Bureau’s population-weighted center of population for its county: the point you would reach by averaging the home locations of everyone counted there in the 2020 census, which is where the county’s people actually are, not the middle of its shape.2 For a western county the difference can be a hundred kilometers of empty desert. There are 3,221 of these centers, built from the whole census rather than a sample, and the Bureau publishes them as one small file. And Georgia is drawn a second time from the Georgia Secretary of State’s own certified returns for both years. One map from a compilation nobody certifies, one from a state’s legal record, the same encoding on both: that comparison is part of the test.
Sixteen tables from this chapter’s three build scripts are worth analyzing on their own. (Two more, the projected map outlines, are linked at the figures that draw on them.) Four are what the figures below are drawn from; the rest are the audits, joins and companion vintages that make the four trustworthy. Sizes are rows by columns, read off the files.
| Table | What it holds | Size |
|---|---|---|
wind_us.csv |
3,104 national county arrows, 2020 to 2024: both years’ returns, the two-party margin and swing, and the arrow’s start point and length. | 3,104 × 26 |
wind_ga.csv |
The same columns for Georgia alone, 159 counties, built from the state’s own returns rather than a national compilation. | 159 × 24 |
county_centroids.csv |
3,221 county population-weighted centroids, where the tail of each arrow is anchored. | 3,221 × 6 |
provenance_audit.csv |
A per-unit audit of the two national county files this chapter reconciles, before they became wind_us.csv. | 104 × 6 |
audit_summary.csv |
provenance_audit.csv collapsed to counts – how many units matched cleanly, how many needed a decision. | 5 × 3 |
precinct_join_ladder.csv |
What each successive repair to the Georgia precinct-name join recovers, step by step. | 4 × 4 |
precinct_join_residual.csv |
Where the precinct join still fails after every repair, by county. | 44 × 5 |
office_gap.csv |
2,641 Georgia precincts: president against senate on the same ballot, the within-precinct check on ticket-splitting. | 2,641 × 6 |
wind_ga_counties.csv |
159 Georgia counties against the 2022 governor’s race, a baseline the presidential swing is checked against. | 159 × 15 |
wind_input_2026.csv |
A stub: the one file meant to be replaced with live returns on class day, so the map can be redrawn on the newest election. | 159 × 10 |
parity.csv |
The agreement check between the D3 map in the browser and the base-R map on paper – same arrows, two renderers. | 2 × 5 |
wind_us_1620.csv |
The same national arrows for 2016 to 2020, carrying that pair’s own vote columns (votes_dem_16 / votes_gop_16). | 3,111 × 25 |
join_1620.csv |
The unit audit for the 2016-to-2020 join, the same kind of table provenance_audit.csv is for 2020-to-2024. | 82 × 4 |
wind_us_1624.csv |
2016 to 2024 arrows, an eight-year span built by joining the two pairs already on disk – no votes fetched twice. | 3,099 × 27 |
source_audit_2016.csv |
Two independent 2016 county-return files scored, at the state level, against a third source that shares data with neither. | 50 × 4 |
correction_2016.csv |
Per-county, the 2016 swing before and after that audit’s correction was applied. | 3,111 × 8 |
One more file is not data about the subject – it is how this chapter
checked its own numbers: facts.csv, the individual
numbers the text above quotes.
wind_us.csv holds one row per county drawn, with both
years’ returns and the county’s center point side by side. The columns
that matter carry the analysis: margin_20 and
margin_24 are the two-party margins, Republican votes minus
Democratic votes divided by the sum of the two, so that a county the
Democrat carried by ten points reads −10. swing is the
difference between them, in points, positive toward the Republican.
net_votes is the swing multiplied by the county’s two-party
vote — the net number of ballots that changed hands. pop is
the county’s census population, and x, y,
dx, dy are where the arrow starts on the page
and which way and how far it goes, stored once so every figure draws the
identical arrow.
Follow one row through. Fulton County, Georgia — Atlanta — cast 380,212 Democratic and 137,247 Republican votes in 2020, a margin of D+47.0; in 2024 it cast 384,752 and 144,655, a margin of D+45.4. Subtract the first margin from the second and the swing is R+1.6: the county moved toward the Republican while staying one of the most Democratic in the South, which is exactly the movement a red-and-blue map cannot show. Its net votes are that swing applied to its 529,407 two-party ballots of 2024, 8,478 ballots’ worth of movement.
The identifier decides everything, so county_fips is
read and stored as text. Read 01001 as a number and it
becomes 1001, which matches nothing, and every state whose
code begins with zero silently drops out when the two years are matched
up. A match that finds nothing does not complain; it just returns fewer
rows.
Cleaning here meant refusing to let the matching decide anything on its own. Three places are not the same unit in the two files, and each got a decision. Alaska reports presidential votes by State House District, under codes that differ between the files and boundaries redrawn after the 2020 census, so it is dropped. Connecticut appears as eight counties in the 2020 file and, in the 2024 file, as the nine planning regions the Census Bureau adopted as county-equivalents in 2022.3 The two sets of units cannot be compared, so its 1,824,280 votes are dropped. The District of Columbia is one row in 2020 and eight wards in 2024, under invented codes, so the wards are summed back into one city.
Hawaii lies outside the map’s frame, and 3,100 counties survive to be drawn. Nothing was imputed (no missing value was filled in by guessing it from something else), and no vote total was adjusted.
wind_ga.csv holds the same columns for Georgia alone,
built from the state’s own returns. Georgia has had the same 159
counties since 1932, when its last two mergers folded Milton and
Campbell counties into Fulton,4 so no unit changed between the two
elections and every county code can be checked by eye.
Before you look, commit to a share. The map below draws 3,100 county arrows for 2020 to 2024. How many lean toward the Republican — a bare majority, about three in four, or nearly all? And a second commitment: will the country as a whole move further than its typical county, or less far? Write both answers down.
First, the code the arrows are written in. It is fixed once, and every map below uses it.
Figure 1. One arrow, seven swings — the key to every map in this brief. An arrow fits this question because one mark carries both of the question’s parts. Direction is the rate: the arrow rotates 8 degrees per point of margin change, clockwise toward the Republican in red, counter-clockwise toward the Democrat in blue, and flat at 11 points. Length is the quantity: the net votes that changed hands, reaching full extension at 25,000 votes on the national map. A 15% floor keeps a small county visible, and the ceiling stops one giant county setting the scale for three thousand.
Ten points in a county of nine hundred and ten points in a county of nine hundred thousand are not the same event. That is why angle and length carry different measurements rather than saying one thing twice. Both constants are printed in each map’s legend. Read Fulton County’s arrow by the key: its swing of R+1.6 turns the arrow 8 × 1.6 = 12.8 degrees clockwise from straight up, so it points a little right of vertical; its 8,478 net votes give it a length of 97 km on a scale whose full 150 km is reached at 25,000 votes. Here is the country.
Figure 2. How every county moved between 2020 and 2024. One arrow per county, starting at the county’s population-weighted center. Arrows lean right where the Republican two-party margin grew and left where it shrank, at 8 degrees per point; length is the net votes moved. 88.5% of the 3,100 arrows lean right: this is what a national swing looks like when it is close to national.
The state outlines the arrows sit on are us_outline.csv,
projected geometry rather than data to analyze.
The first answer is unambiguous. 88.5% of counties moved toward the Republican candidate, the median county — the one in the middle when all 3,100 are sorted by swing — by R+3.1, and the whole field leans one way. The swing was broad. It reached counties that vote Democratic and counties that vote Republican, dense places and empty ones, both coasts and the middle.
| Quantity | Value |
|---|---|
| Counties drawn | 3,100 |
| Median county shift | R+3.1 |
| Counties shifting right (%) | 88.5 |
| Largest shift right | R+28.1 |
| Largest shift left | D+9.2 |
| Arrows at the length cap | 60 |
Broad, but not uniform, and the map shows both at once. 356 counties, 11.5% of the map, moved toward the Democrat anyway, against the tide. The spread among the rest is wide. The largest county move toward the Republican was R+28.1 and the largest the other way D+9.2, while 60 arrows sit at the length cap, understating their counties’ movement. A single national number contains none of that. The arrows are the evidence that “the country moved” is an average over places that moved very differently, and the length channel says where the movement carried real ballots rather than empty land.
Which raises the second question you committed to. Every arrow on that map is the same kind of mark, and the counties are not the same size. The largest cast 3,606,971 two-party votes and the smallest 96, a ratio of about 37,573 to one.
| Question | Answer |
|---|---|
| What did the typical county do? | mean county shift R+3.4 |
| What did the typical county do? (median) | median county shift R+3.1 |
| What did the votes do? | national two-party margin moved R+6.0 |
The typical county moved R+3.1. The country moved R+6.0 — roughly twice as far. “The country” here is every mapped vote added together: the two-party margin of that total went from D+4.3 in 2020 to R+1.7 in 2024. Both numbers are correct; they answer different questions. The gap between them means the biggest counties swung harder than the small ones, and it is why a wind map has to be read with care.
One arrow per county gives rural America several times the visual weight it has in the electorate. Newspapers make that choice constantly, usually without saying so. This brief makes it too, and the difference is that it is being said, with the vote-counted number printed beside the county-counted one.
The national map is drawn from a compilation nobody certifies. Here is the same encoding on data that is somebody’s legal record.
Figure 3. Georgia between 2020 and 2024, from the state’s own returns. 159 counties, Secretary of State returns on both ends, on units unchanged since 1932, so no arrow here can be an artifact of two files that disagree about what a county is. With 159 arrows on a state-sized frame there is room to read each angle: rotation is the same 8 degrees per point, recoverable with a protractor, and length reaches full extension at 8,000 net votes.
Its county outlines are ga_outline.csv, the
same kind of geometry as us_outline.csv, at Georgia’s
scale.
| Quantity | Value |
|---|---|
| Counties drawn | 159 |
| Georgia margin, 2020 | D+0.3 |
| Georgia margin, 2024 | R+2.2 |
| Statewide shift | R+2.5 |
| Median county shift | R+3.0 |
| Counties shifting right (%) | 81.8 |
| Biggest shift right | Webster R+10.6 |
| Biggest shift left | Henry D+9.2 |
Georgia tells the national story in miniature, from certified numbers. 81.8% of its counties leaned right, the middle one by R+3.0, and the statewide margin moved R+2.5, from D+0.3 to R+2.2. The exceptions are on the map too: Henry County moved D+9.2, the other way, while Webster County moved R+10.6 right. A press compilation and a state’s certified record, drawn with one rule, point the same direction — which is the kind of agreement a claim about the country should be asked to show.
It cannot tell you who changed their mind. A margin swing is a difference between two totals, and it ignores turnout entirely. A county can swing ten points because voters switched, because one side’s voters stayed home, or because new voters arrived, and the arrow is identical in all three cases. A county whose margin held while a third of its voters stopped voting draws a stubby arrow that says nothing changed.
It cannot certify a single count. The national file is a press compilation that calls itself not authoritative, and there is no federal county file to check it against. The fifty-one state canvasses can be read one at a time, and the county-returns brief does exactly that, but no arrow here carries a certification.
It cannot draw the places it could not match. Alaska, Connecticut and Hawaii are simply absent, for the reasons given in The data, and an absence on a map does not look like a warning. It looks like nothing happened there.
It cannot express doubt. An arrow computed from 96 votes is drawn exactly as crisply as one computed from 3,606,971, and there is no obvious way to put an error bar on a direction. The direction itself is a metaphor: nothing traveled north-east, and the form borrows its persuasiveness from weather maps, where the arrows mean a thing really is moving.
And its geography is slightly stale. The center points are 2020 vintage, so the map puts 2024’s voters where 2020’s people lived.
None of these is answered above, and every one can be answered by sorting or filtering the tables the Sources section hands over.
wind_us.csv has swing for every county
drawn. Sort it ascending and read the state_name column of
the counties that moved toward the Democrat. Do they cluster in a few
states, or scatter?wind_us.csv has both swing and
net_votes. Sort by each in turn. Are the counties that
moved the most points the same counties that moved the most ballots, and
what does the difference between the two lists tell you?wind_us.csv carries margin_20 and
margin_24. Filter for counties where the sign changed —
counties that changed winner. How many are there, and how big was the
typical one’s swing compared with the map-wide median?wind_ga.csv has swing and
net_votes for every Georgia county. Which county moved the
most ballots, and is it also the one that moved the most points?Two stretch ideas point past the spreadsheet. The MIT Election Data
and Science Lab publishes county returns built from official state
records back to 2000 (https://github.com/MEDSL/county-returns). Download 2016
and ask whether the previous pair of elections leans the same way this
one does. And pick one state, download its Secretary of State’s
certified county totals, and check them against the compilation’s counts
in wind_us.csv. Any disagreement you find is the price of
the only national file there is.
Data
data/encoding.R and used by every figure, so none is
derived from the data it draws.The data itself
The sixteen tables worth opening on their own are described in The data at the top of this brief. They are plain
CSV, they open in a spreadsheet, and they are yours to take further: wind_us.csv, wind_ga.csv, county_centroids.csv,
provenance_audit.csv,
audit_summary.csv,
precinct_join_ladder.csv,
precinct_join_residual.csv,
office_gap.csv,
wind_ga_counties.csv,
wind_input_2026.csv,
parity.csv, wind_us_1620.csv,
join_1620.csv, wind_us_1624.csv,
source_audit_2016.csv,
correction_2016.csv.
I want to rebuild a public dataset from its original sources, without any starting files. Please do the following and show your work. THE FIRST SOURCE. County-level presidential returns for 2020 and 2024 from Tony McGovern's compilation, served raw from GitHub: https://raw.githubusercontent.com/tonmcg/US_County_Level_Election_Results_08-24/master/2020_US_County_Level_Presidential_Results.csv and the matching 2024 file beside it. Each row is one county, keyed by FIPS code, with votes by candidate. No account or key is needed. Its own README says the numbers were copied by a program from news organizations and are not authoritative — there is no federal publisher of county presidential returns, and that is part of the story. THE SECOND SOURCE. The Census Bureau's population-weighted county centroids, one plain text file: https://www2.census.gov/geo/docs/reference/cenpop2020/county/CenPop2020_Mean_CO.txt Each row is a county with the longitude and latitude of its people, not of its empty land. The header carries an invisible byte-order mark; read it as UTF-8-with-BOM or the first column name arrives mangled. THE THIRD SOURCE. For Georgia alone, the state's own certified returns, exported as JSON by the Secretary of State: https://results.sos.ga.gov/cdn/results/Georgia/export-2024NovGen.json WHAT TO BUILD. 1. A national table of county vote swings, 2020 to 2024, joined to the centroids by FIPS. Do not trust the join: Alaska reports State House districts under invented FIPS codes, three of which collide with real borough codes; Connecticut swapped eight counties for nine planning regions between the files; and the code for the District of Columbia means the whole city in one file and a single ward in the other. A naive join succeeds everywhere and is wrong in all three places. 2. The same table for Georgia's 159 counties from the state's own export — the clean version, where every join key can be checked by eye. CHECK YOUR WORK. The copies this book used were downloaded in August 2026. If your rebuild matches them, you should find: - 3,221 county centroids in the census file - 3,152 rows in the 2020 returns and 3,160 in 2024, of which only 3,104 describe the same place in both years - 159 Georgia counties, joining both years with zero misses The GitHub compilation takes corrections as counties certify and amend; small drifts in its row counts are revisions, not errors.
Federal Election Commission, “Election Results and Voting Information,” https://www.fec.gov/introduction-campaign-finance/election-results-and-voting-information/.↩︎
U.S. Census Bureau, “Centers of Population,” https://www.census.gov/geographies/reference-files/time-series/geo/centers-population.html.↩︎
The change is recorded in the Federal Register: U.S. Census Bureau, “Change to County-Equivalents in the State of Connecticut,” 87 FR 34235 (June 6, 2022), https://www.federalregister.gov/documents/2022/06/06/2022-12063/change-to-county-equivalents-in-the-state-of-connecticut.↩︎
New Georgia Encyclopedia, “Peach County,” which records the 1932 mergers that left the state at 159 counties, https://www.georgiaencyclopedia.org/articles/counties-cities-neighborhoods/peach-county/.↩︎