Skip to content

Instantly share code, notes, and snippets.

@O1sims
Last active March 23, 2019 11:35
Show Gist options
  • Save O1sims/361f9e3242bfdbed86b85bfbcb16e58b to your computer and use it in GitHub Desktop.
Save O1sims/361f9e3242bfdbed86b85bfbcb16e58b to your computer and use it in GitHub Desktop.
R script to query UK Gov petitions and extract NI data
library(httr)
library(magrittr)
library(jsonlite)
# The `constituencies.data` endpoint does not provide the 'party' element for some reason now!
# Here is a manual mapping of constitency to party
PARTY_CONSTITUENCY = list(
"Belfast East" = "Democratic Unionist Party",
"Belfast North" = "Democratic Unionist Party",
"Belfast South" = "Democratic Unionist Party",
"Belfast West" = "Sinn Fein",
"East Antrim" = "Democratic Unionist Party",
"East Londonderry" = "Democratic Unionist Party",
"Fermanagh and South Tyrone" = "Sinn Fein",
"Foyle" = "Sinn Fein",
"Lagan Valley" = "Democratic Unionist Party",
"Mid Ulster" = "Sinn Fein",
"Newry and Armagh" = "Sinn Fein",
"North Antrim" = "Democratic Unionist Party",
"North Down" = "Independent",
"South Antrim" = "Democratic Unionist Party",
"South Down" = "Sinn Fein",
"Strangford" = "Democratic Unionist Party",
"Upper Bann" = "Democratic Unionist Party",
"West Tyrone" = "Sinn Fein")
petition.data <- "https://petition.parliament.uk/petitions/241584.json" %>%
httr::GET() %>%
httr::content(as = "text") %>%
jsonlite::fromJSON()
signituresByConstituency <- petition.data[["data"]][["attributes"]][["signatures_by_constituency"]]
constituencies.data <- "https://petition.parliament.uk/constituencies.json" %>%
httr::GET() %>%
httr::content(as = "text") %>%
jsonlite::fromJSON()
population.data <- "https://petitionmap.unboxedconsulting.com/json/mps/population_ons.json" %>%
httr::GET() %>%
httr::content(as = "text") %>%
jsonlite::fromJSON()
ni.constituencies.data <- list()
for (i in 1:(signituresByConstituency %>% nrow())) {
id <- signituresByConstituency$ons_code[i]
constituencies.data[[id]]$signature_count <- signituresByConstituency$signature_count[i]
constituencies.data[[id]]$population <- population.data[[id]]$population
constituencies.data[[id]]$proportion <- (signituresByConstituency$signature_count[i]/population.data[[id]]$population) * 100
if (substr(id, 1, 1) == "N") {
ni.constituencies.data[[id]] <- constituencies.data[[id]]
}
}
population <- proportion <- signature_count <-
ons_code <- constituency <- party <- mp <- c()
for (i in 1:(ni.constituencies.data %>% length())) {
proportion %<>% append(ni.constituencies.data[[i]]$proportion)
population %<>% append(ni.constituencies.data[[i]]$population)
signature_count %<>% append(ni.constituencies.data[[i]]$signature_count)
ons_code %<>% append(ni.constituencies.data[[i]]$ons_code)
constituency %<>% append(ni.constituencies.data[[i]]$constituency)
party %<>% append(PARTY_CONSTITUENCY[ni.constituencies.data[[i]]$constituency][[1]])
mp %<>% append(ni.constituencies.data[[i]]$mp)
}
df <- data.frame(
population = population,
proportion = proportion,
signature_count = signature_count,
ons_code = ons_code,
constituency = constituency,
party = party,
mp = mp,
stringsAsFactors = FALSE)
totalNICount <- sum(df$signature_count)
totalPetitionCount <- petition.data[["data"]][["attributes"]][["signature_count"]]
df <- df[order(-proportion), ][1:10, ]
df$constituency <- factor(df$constituency, levels = df$constituency)
setColours <- setNames(
c("#D32F2F", "#BDBDBD", "#43A047"),
sort(unique(df$party)))
df %>%
ggplot() +
geom_bar(
mapping = aes(
y = proportion,
x = constituency,
fill = party),
stat = "identity") +
scale_fill_manual(values = setColours) +
labs(title = "NI constituencies voting to Revoke") +
ylab("Proportion of constituents (%)") +
xlab("") +
theme_minimal() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
axis.text.x = element_text(
angle = 90,
hjust = 1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment