-
Notifications
You must be signed in to change notification settings - Fork 3
/
Day4_Hexagons.R
71 lines (59 loc) · 2.96 KB
/
Day4_Hexagons.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
rm(list=ls())
library(ggtern)
library(tidyverse)
library(curl)
library(readxl)
library(parlitools)
library(tricolore)
temp <- tempfile()
source <- "https://data.parliament.uk/resources/constituencystatistics/general-election-results-2019.xlsx"
temp <- curl_download(url=source, destfile=temp, quiet=FALSE, mode="wb")
data2019 <- read_excel(temp, sheet="voting-summary")
#Remove non-English constituencies
data2019 <-data2019[,c(1,3,6,19:21)]
data2019$ConProp <- data2019$con/(data2019$con+data2019$ld+data2019$lab)
data2019$LabProp <- data2019$lab/(data2019$con+data2019$ld+data2019$lab)
data2019$LibProp <- data2019$ld/(data2019$con+data2019$ld+data2019$lab)
data2019$year <- 2019
colnames(data2019)[1] <- "id"
#Set up ternary colour scheme
tricolore2019 <- Tricolore(data2019, "LibProp", "ConProp", "LabProp", breaks=100)
#Tidy up the key
key <- tricolore2019$key+
labs(L='Lib Dem', R='Labour', T='Conservative', x="", y="", z="")+
scale_T_continuous(breaks=c(0.25,0.5,0.75, 1), labels=c("25%", "50%", "75%", "100%"))+
scale_L_continuous(breaks=c(0.25,0.5,0.75, 1), labels=c("25%", "50%", "75%", "100%"))+
scale_R_continuous(breaks=c(0.25,0.5,0.75, 1), labels=c("25%", "50%", "75%", "100%"))
data2019$rgb <- tricolore2019$rgb
#Fetch hex map from {parlitools} package
west_hex_map$id <- west_hex_map$gss_code
map.data <- full_join(west_hex_map, data2019, by="id")
tiff("Outputs/ConstHexTern2019.tiff", units="in", width=14, height=10, res=500)
ggplot()+
geom_sf(data=subset(map.data, country_name=="England"), aes(geometry=geometry, fill=rgb))+
scale_fill_identity()+
theme_void()+
theme(plot.title=element_text(face="bold"))+
coord_sf(clip = 'off') +
annotation_custom(
ggplotGrob(key),
xmin = 0.5, xmax =6.5, ymin = 52, ymax = 58 )+
annotate("text", x=-5.8, y=55.4, label="Speaker Linday Hoyle's constituency\nwas, by tradition, uncontested")+
geom_curve(aes(x=-5.4, y=55.22, xend=-3.9, yend=54.87),
curvature=0.18,
arrow=arrow(length=unit(0.2, "cm"), type="closed"))+
annotate("text", x=0.6, y=56.3, label="Each hexagon represents\none constituency")+
geom_curve(aes(x=0.3, y=56.12, xend=-0.62, yend=55.87),
curvature=-0.18,
arrow=arrow(length=unit(0.2, "cm"), type="closed"))+
annotate("text", x=3.5, y=53.2, label="Colour reflects the proportion of\nvotes that went to each main party")+
geom_curve(aes(x=3.2, y=53, xend=1.65, yend=52.78),
curvature=-0.18,
arrow=arrow(length=unit(0.2, "cm"), type="closed"))+
annotate("text", x=0.4, y=50.3, label="Brighton Pavillion (Green) was the only English\nconstituency not to go to one of the 3 main parties")+
geom_curve(aes(x=0, y=50.5, xend=-0.3, yend=50.78),
curvature=-0.18,
arrow=arrow(length=unit(0.2, "cm"), type="closed"))+
labs(title="Vote share across England for the three main parties in the 2019 General Election",
subtitle="Data from House of Commons Library | Plot by @VictimOfMaths")
dev.off()