Local Elections
This site is primarily concerned with the next general election, but it's hard to resist including information about local elections as well, where interesting data can be displayed. Only the main local elections each year are included here; no local by-elections, and no mayoral elections.
See the methodology at the end of the page for details on how the Sankey diagrams are constructed.
May 1, 2025
Results as per Wikipedia:
Party | Seats Won | Total Seats | Change |
---|---|---|---|
Labour | 99 | 6132 | -186 |
Conservative | 316 | 4358 | -676 |
Liberal Democrats | 370 | 3179 | +163 |
Green | 80 | 895 | +45 |
Reform | 677 | 805 | +677 |
Other/Independent | 94 | 2602 | -23 |
Sankey diagrams (partial information)
Select one of the options below to see a Sankey diagram of how seat counts flowed (or are projected to flow) between parties.
Represented seat counts
Missing data reasons
Methodology
Many web sites provide overall numbers of how many seats a party has won or lost compared with the previous time those seats were contested. That information is included here, but additionally, there's an attempt - as far as possible - to show the flow of seats from one party to another, via Sankey diagrams. These diagrams show fewer seats than the total number contested, for various different reasons:
- It can take a few days for all results to become available via the Democracy Club data used to create these diagrams.
- Boundary changes mean that not every electoral district had a corresponding previous election.
- The number of seats filled in a given electoral district may not be the same as the previous election.
- The flow may be inherently unclear due to multiple seats being filled from multiple parties, in a way that the algorithm described below cannot resolve.
(In the future, I may represent ambiguities with an intervening "unknown" node.)
Multi-seat algorithm
When multiple seats are filled in an electoral district, and when the previous election had the same number of seats available, the following algorithm is used to construct transitions from "party before" to "party after":
- Construct pools of winning party seats for the "previous" and "current" elections - imagine a token per seat, in the colour of that party.
-
For each token in the "current" election pool:
- If the "previous" pool contains a token the same party, remove the token and record a transition from the winning party to itself.
- Otherwise, set aside the "current" token in an "unused current winners" pool, and leave the "previous" pool as it is.
-
After this has been completed, we're in one of four situations:
- Both the "previous" pool and the "unused current winners" pool are empty. This means each party won the same number of seats as before. We're done.
- There are potentially multiple different parties in the "previous" pool, but all entries in the "unused current winners" pool are for the same party. This means a single party effectively won seats from multiple other parties, but there's no ambiguity. Record a transition for each of the tokens in the "previous" pool to the party represented in the "unused current winners" pool.
- There are potentially multiple different parties in the "unused current winners" pool, but all entries in the "previous" pool are for the same party. This means that a single party effectively list seats to multiple other parties, but there's no ambiguity. Record a transition from the party represented in the "previous" pool to the party of each of the tokens in the "unused current winners" pool.
- There are multiple different parties in both the "previous" pool and the "unused current winners" pool. This leads to an ambiguous situation, where we can't reasonably record any transitions.
Algorithm examples
Simple (no left-overs to consider): (Con, Lab, Con) => (Con, Con, Lab):
- Con => Con
- Con => Con
- Lab => Lab
All "unused current winners" are in the same party: (Con, Lab, LibDem, Green) => (Ref, Con, Lab, Ref):
- Con => Con
- Lab => Lab
- LibDem => Ref
- Green => Ref
All "previous" entries are in the same party: (Con, Lab, Lab, Lab) => (Ref, Con, Lab, LibDem):
- Con => Con
- Lab => Lab
- Lab => LibDem
- Lab => Ref
Both remaining pools have multiple parties: (Con, Lab, Green) => (Lab, Ref, LibDem):
- Lab => Lab
- ???
- ???