Showing election results on a geographically accurate map is often frustratingly uninformative because electoral districts vary hugely in size. In British Columbia, the smallest electoral district is a mere 3.5 square kilometers in size, while the largest is 196,484 square kilometers. Superimposing electoral outcomes on a map thus distorts the picture considerably. Enter the idea of a cartogram: a map that changes the size and shape of places to show numbers or data instead of actual land are. For elections, a particularly useful type of cartogram involves hexagons of equal size that represent electoral districts. The main idea is to preserve large-scale geographic shapes and adjacency of districts as much as possible, but not perfectly. There is always a visual trade-off involved—similar to projecting a three-dimensional globe onto two-dimensional maps, only more complicated. There is no good algorithm to do that, and thus what I have put together I constructed "by hand", with a little bit of empirical assistance to see how slightly different shapes scored on performance metrics. The cartogram below shows the outcome of the 2024 election in British Columbia for the three major parties, and it shows nicely how the outcome varied geographically as well. Clearly identified in the diagram are Vancouver Island and the other ten regions of the province, including major cities and urban areas (Vancouver, Surrey, Richmond-Delta, etc.). A full list of constituencies, identified by their three-character codes, follows right below the diagram. Further below are more diagrams and discussions.
The cartogram below has one oddity, but for a reason: Vancouver Island appears attached to the mainland. This is because the North Island eletoral district actually straddles the mainland, although the Queen Charlotte Strait separates mainland from island. Most of the district's population lives on Vancouver Island, and the artificial land bridge is a compromise between "electoral fidelity" and "geographic fidelity". As with all map-making, compromises need to be made.
click on image for high-resolution PDF version
Burnaby-Coquitlam:
BNC Burnaby Centre; BNE Burnaby East; BNN Burnaby-New Westminster; BNO Burnaby North; BNS Burnaby South-Metrotown; POC Port Coquitlam; POM Port Moody-Burquitlam; CQB Coquitlam-Burke Mountain; CQM Coquitlam-Maillardville; NMC New Westminster-Coquitlam.
Cariboo:
CBC Cariboo-Chilcotin; PRM Prince George-Mackenzie; PRO Prince George-North Cariboo; PRV Prince George-Valemount.
Fraser Valley:
ABM Abbotsford-Mission; ABS Abbotsford South; ABW Abbotsford West; CHC Chilliwack-Cultus Lake; CHN Chilliwack North; LLA Langley-Abbotsford; LWG Langley-Walnut Grove; LWI Langley-Willowbrook; MAE Maple Ridge East; MAP Maple Ridge-Pitt Meadows.
Interior:
BDS Boundary-Similkameen; PES Penticton-Summerland; VRL Vernon-Lumby; WKP West Kelowna-Peachland; SHU Salmon Arm-Shuswap; FRN Fraser-Nicola; KAC Kamloops Centre; KAN Kamloops-North Thompson; KEC Kelowna Centre; KLC Kelowna-Lake Country-Coldstream; KLM Kelowna-Mission.
Kootenays:
CLR Columbia River-Revelstoke; KOC Kootenay Central; KOM Kootenay-Monashee; KOR Kootenay-Rockies.
North:
BLS Bulkley Valley-Stikine; PCN Peace River North; PCS Peace River South; SKE Skeena; NEC Nechako Lakes; NOH North Coast-Haida Gwaii.
North Shore:
POR Powell River-Sunshine Coast; WVC West Vancouver-Capilano; WVS West Vancouver-Sea to Sky; NVL North Vancouver-Lonsdale; NVS North Vancouver-Seymour.
Richmond-Delta:
RCB Richmond-Bridgeport; RCC Richmond Centre; RCQ Richmond-Queensborough; RCS Richmond-Steveston; DLN Delta North; DLS Delta South.
Surrey:
SRC Surrey City Centre; SRD Surrey-Cloverdale; SRF Surrey-Fleetwood; SRG Surrey-Guildford; SRN Surrey-Newton; SUN Surrey North; SUP Surrey-Panorama; SUR Surrey-Serpentine River; SUS Surrey South; SWR Surrey-White Rock.
Vancouver:
VHA Vancouver-Hastings; VKE Vancouver-Kensington; VLA Vancouver-Langara; VLM Vancouver-Little Mountain; VNP Vancouver-Point Grey; VNQ Vancouver-Quilchena; VNR Vancouver-Renfrew; VNY Vancouver-Yaletown; VNS Vancouver-South Granville; VNT Vancouver-Strathcona; VNW Vancouver-West End; VFV Vancouver-Fraserview.
Vancouver Island:
OBG Oak Bay-Gordon Head; VTB Victoria-Beacon Hill; VTS Victoria-Swan Lake; SAN Saanich North and the Islands; SAS Saanich South; CRC Courtenay-Comox; CWV Cowichan Valley; ESC Esquimalt-Colwood; JFM Juan de Fuca-Malahat; LAO Ladysmith-Oceanside; LFH Langford-Highlands; MPR Mid Island-Pacific Rim; NAI Nanaimo-Gabriola Island; NAL Nanaimo-Lantzville; NOI North Island.
British Columbia operates elections as a first-past-the-post system: the candidate with the most votes is elected. This winner-takes-all system makes for a simple picture where ridings are either blue, orange, or green. But in truth each riding has rather different strengths for particular parties, and some of the election results are pretty close. The next diagram shows the election results in a rather different way: as a mixture of colours where the colour intensity reflects each of the the three main parties' vote share. This turns the province into a map from orange-y to purplish to greenish to blueish. Some districts show dominance of one party, such as the Peace River districts in Northern BC that are rather blue. Urban ridings in Vancouver show the strength of the NDP, and Vancouver Island shows a lot more greenish hues.
click on image for high-resolution PDF version
The third and last cartogram in this series shows the competitiveness of each riding, with hues of yellow indicating whether the gap between front-runner and runner-up was less than 5%-points (intense yellow), less than 10%-points (medium yellow), or less than 15%-points (very light yellow). The cartogram shows that there are many uncompetitive ridings, which appear as white hexagons. The largest cluster of competitive ridings is in Surrey, so expect campaigning there to be particularly intense. But other ridings across BC may be considered competitive too: several on Vancouver Island, and more across the entire province.
click on image for high-resolution PDF version
Some may be interested in using my cartogram, and I am happy to share the coordinates of the hexagons. They are recorded below in cubic form so that q+r+s=0. Also reported are the three-character codes for the reiding, the name of the riding, and the region to which it belongs.
I am also sharing some bits of R code that may be helpful. The first two functions, hex_x and hex_y, convert the (q,r,s) coordinates into (x,y) coordinates. The third function, hex_polygon, takes (x,y) coordinates and generates a hexagon polygon, which can be stitched together into a sequence of polygons. Lastly, hex_shared determines whether two polygons with coordinates (q1,r1,s1) and (q2,r2,s2) share a common border, and if so, win which direction. The function then returns the beginning and end coordinates of that shared border, or NULL.