About
What am I seeing?
Octolamp is a data visualization tool for viewing United Kingdom local election results. It started as what I thought would be a simple holiday project to build a web app for my politics-obsessed brother, but eventually grew to be a lot bigger. If you're curious about how it works under the hood, check out the relevant page on my website. If you're confused about how local government works, check out the explanation page.
Clicking on an area on the map will pull up the council composition following the election in the year selected by the year slider. Because local-government is multi-tier, there are options to change the tier you are viewing and filter councils by certain properties.
Overview
The results panel (on the right) shows:
- The name of the council and the year it was most recently elected (e.g. Shropshire, 2025).
- The council type and its unique government code (e.g. Unitary authority, E06000051).
- A result banner (e.g. LD GAIN FROM CON). The terminology here is explained in the Legend section below.
- A seat diagram showing the council composition, or for wards, a barchart of the vote proportion by party group.
- For councils, a table of each party and the seats won and seat change; for wards, a table of each candidate and their vote total.
The analysis panel (on the left) gives you five main ways to modify the map: by changing the year.
- Changing the year.
- Toggling whether to include previous years' elections.
- Changing the area.
- Toggling whether to view only changes in control, or all elections.
- Changing the coloring method.
The following coloring methods are available:
- Control: the color of the party controlling the council. Grey is used for no overall control.
- Plurality: the color of the largest party, regardless of whether they have control or the council is under NOC.
- Biggest increase: the color of the party that had the greatest numerical increase in seats in the last election.
- Biggest decrease: the color of the party that had the greatest numerical decrease in seats in the last election.
- Party strength: shades from white to the actual party color based on the proportion of council seats controlled in that area.
- Party change: shades from red to green based on the proportion of council seats lost/gained in that area in the most recent election.
Note that the shading for party strength and party change are not linear — they are scaled by a power of ~0.6. For party change, areas with no party presence to begin with are colored in gray, not white.
More detailed clarifications on some parts of the map and UI can be found in the Notes section below.
Legend
| Code |
Name |
Color |
Notes |
| CON |
Conservative |
|
|
| LAB |
Labour |
|
|
| LD |
Liberal Democrat |
|
|
| REF |
Reform UK |
|
|
| GRN |
Green |
|
|
| SNP |
Scottish National Party |
|
|
| PC |
Plaid Cymru |
|
|
| UKIP |
UK Independence Party |
|
|
| NOC |
No overall control |
|
|
| IND |
Independent |
|
Only used for wards. |
| OTH |
Other party |
|
Only used for wards. |
OTH |
Other party or independent |
|
Non-ward data groups them together. |
| Term |
Definition |
| GAIN |
Won control of a council from another party's control or no overall control. |
| HOLD |
No change to council control. |
| LOSS |
Lost control of a council from a majority to no overall control. |
| INIT |
The first election for the council, i.e. no change or hold. |
| (blank) |
No keyword indicates that there is insufficient data to determine control change. |
Explanations of local government terms are available here. |
Notes
Wards
- The percentages in the bar chart are the average percentage of the vote received per candidate. Multi-member wards that have independents and parties running may look a little funny at first.
- Votes are aggregated by party group, not by specific party. The brown group "OTH" represents all non-independents from smaller parties, and the pink group "IND" represents all independents.
- Wards that elect councillors from more than one party group are colored in grey. Note that electing multiple councillors, only from smaller parties, would mean the ward is colored in brown.
Local authority districts (LADs)
- A dagger next to the year indicates a change to boundaries or seat count.
- If the change in seats per party don't add up to zero, it's because the total number of seats on the council have changed.
- Unlike ward data, the data published on LADs does not differentiate between independents and small parties. While pink indicates an independent for a ward, it indicates an independent or a member of a small party for LADs. I chose to use pink over brown because in practice there are more independents than small parties in local government.
- Be careful when looking at swing. Many councils do not elect their members all at once, and comparing one election cycle to the next may not necessarily be a fair comparison if they involved different wards. Octolamp currently does not support comparing exact tranches.
Omissions
Octolamp uses data adapted from spreadsheets published by the UK House of Commons Library. This data is not consistent and therefore some features are unavailable.
- Data on Northern Ireland, the City of London, and the Isles of Scilly is unavailable.
- There is no centralised source of data for vote counts for the local authority district (LAD) elections. The seat totals are shown, but it is not possible to show raw vote counts — I don't have that data.
- Ward-specific data (which does include vote counts) is only available from 2021 through 2025. It has not been published for other years.
- There is (infuriatingly) no centralised source of data for the 2024 LAD elections, despite it existing in 2023 and 2025. I filed a Freedom of Information request, but it was denied, so I have manually collated the data for this.
- There were no elections held in 2020. All elections scheduled to be held in 2020 were held in 2021 instead.
One-offs
- 2025 has no data for Sheffield and Barnsley councils. This is because their boundaries were changed since the last election in 2024. Traditionally, boundary changes only go into effect after the inaugural set of elections for the new council, but in this instance the official maps have been updated to replace the old councils before any elections have been held.
- Conversely, some new councils hold elections the year before the are officially formed, i.e. before they are added to the map. Be careful with the year-only view: some councils will not appear in the year they were elected, but will the year after (once they were legally formed). They will not appear in any year-only view (since they weren't on the map in the year of election, and weren't elected in the year they joined the map). North Yorkshire is an example of this.
- 2018–2021 have no data for Perth & Kinross and Fife councils. Similarly to above, this is because their boundaries changed before elections were held (in 2022).
A word of warning
The data this project is built off of has had errors that I have had to fix. These include:
- The 2022 Welsh results using ward code W05001146 instead of W05001154. The former was, at the time of the election, an inactive ward for an entirely different area.
- An uncountable number of inconsistencies between when to use
& vs and, X on Y vs X-on-Y, St vs St., 's vs s.
- Misspelling "Woughton" as "Wroughton" and not providing a ward code to actually look up the correct name. (2023)
- Misspelling "Scarbrough & Seacroft", a ward in eastern Lincolnshire, as "Scarborough & Seacroft", depsite Scarborough being 100 miles north and in another county. (2023)
- Using the code E05013778 (Hampton) to refer to both Hampton and Hampton Wick, despite them being entirely different wards (the latter has code E05013780), and the fact that "Hampton Wick" is not even named that, but is called "Hampton Wick & South Teddington".
- Omitting eight councils (Eastbourne, Eastleigh, East Dorset, East Hampshire, East Hertfordshire, East Lindsey, East Northhamptonshire, East Staffordshire) from the 2015 House of Commons results report. I hope I'm wrong, but I think this is because they were alphabetically (mostly) between two sides of a page turn. This is despite the fact that the top of the report correctly states
"The Local Elections were comprised of [...] 6,563 seats on 194 shire district councils" (and yet only lists 186 results).
...this was parliamentary data I was using. All this is to say that while I have strong faith in the overall reliability of the data used, you may still find errors.