On the 24th Februrary, the Electoral Commission published all spending by organisations during the UK’s referendum to leave the EU.
#open the csv file from the electoral commission
#rehosted at:
github <- "https://raw.githubusercontent.com/RobWHickman/"
spending <- read.csv(paste0(github, "Databases-and-Files/master/EUref_Spend/EUrefspending.csv"),
stringsAsFactors = FALSE)
#convert to numeric pounds and r date format
spending$TotalExpenditure <- gsub("£", "", spending$TotalExpenditure)
spending$TotalExpenditure <- gsub(",", "", spending$TotalExpenditure)
spending$TotalExpenditure <- as.numeric(spending$TotalExpenditure)
spending$DateIncurred <- as.Date(spending$DateIncurred, "%d/%m/%Y")
#find political parties in the data
party_affiliated <- unique(spending$RegulatedEntityName)[c(2, 8, 9, 16, 20, 27, 39, 61, 62, 66)]
#get the total spend for each sanctioned organisation
total_spend_df <- aggregate(spending$TotalExpenditure,
by = list(spending$RegulatedEntityName),
FUN = sum)
#find the large organisations total spends
#political parties, and others who spend over 1M GBP
organisation_df <- rbind(total_spend_df[which(total_spend_df$x > 1000000),],
total_spend_df[which(total_spend_df$Group.1 %in% party_affiliated),])
organisation_df <- organisation_df[-which(duplicated(organisation_df$Group.1)),]
organisation_df$shortnames <- c("Labour", "Lib Dems", "IN Campaign", "UKIP", "Vote Leave",
"Conservative IN", "DUP", "Green OUT", "Green", "Labour OUT",
"Plaid Cymru", "SNP")
organisation_df$organisation <- c("Labour", "Lib Dems", "Official Campaign", "UKIP",
"Official Campaign", "Conservatives", "DUP", "Greens",
"Greens", "Labour", "Plaid Cymru", "SNP")
organisation_df <- organisation_df[order(organisation_df$Group.1),]
First, the total spends of all the organisations:
library(ggplot2)
library(ggthemes)
library(ggrepel)
#shortened labels of the large spending organisation
#from organisation_df
big_spenders <- c("Brexit Express", "Conservative IN", "Labour", "Leave.EU", "Lib Dems",
"Darren Grimes", "IN Campaign", "UKIP", "Vote Leave")
#plot the total spending of each organisation
ggplot(spending, aes(RegulatedEntityName, TotalExpenditure)) +
geom_bar(stat = "identity") +
geom_bar(data = organisation_df, aes(Group.1, x, fill = organisation), stat = "identity") +
geom_text_repel(data = total_spend_df[which(total_spend_df$x > 500000),],
label = big_spenders, aes(Group.1, x), nudge_x = -4, nudge_y = 500000,
min.segment.length = unit(0.1, "lines")) +
scale_x_discrete(breaks = NULL) +
scale_y_continuous(breaks = seq(0, 7000000, 1000000), labels = paste(seq(0,7), "Million")) +
scale_fill_manual(values = c("blue", "darkred", "green", "red", "yellow",
"pink", "darkgreen", "goldenrod", "purple")) +
theme_fivethirtyeight() +
ggtitle("EU Referendum Expenditure",
"total expenditure (£) for each registered entity sorted alphabetically")

ggraph also came out today
library(ggraph)
library(ggforce)
total_spend_df <- mutate(total_spend_df, shortnames = "", organisation = "none")
total_spend_df$shortnames[which(total_spend_df$x > 500000)] <- big_spenders
total_spend_df$organisation[which(total_spend_df$Group.1 %in% organisation_df$Group.1)] <- organisation_df$organisation
sizes <- total_spend_df$x
position <- pack_circles(sizes)
data <- data.frame(x = position[,1], y = position[,2], r = sqrt(sizes/pi))
ggplot() +
geom_circle(aes(x0 = x, y0 = y, r = r, fill = total_spend_df$organisation), data = data) +
geom_text(label = organisation_df$Group.1) +
geom_circle(aes(x0 = 0, y0 = 0, r = attr(position, 'enclosing_radius'))) +
geom_node_text(data = data, aes(label = total_spend_df$shortnames, size = r)) +
scale_fill_manual(values = c("blue", "darkred", "green", "red", "yellow", "grey",
"pink", "darkgreen", "goldenrod", "purple"), name = "organisation") +
theme_fivethirtyeight() +
#theme(legend.position = "none") +
guides(size = FALSE) +
#guide_legend(title = "organisation")
theme(axis.text = element_blank()) +
ggtitle("EU Referendum Expenditure",
"total expenditure (£) for each registered entity") +
coord_fixed()

LS0tCnRpdGxlOiAiRVUgUmVmZXJlbmR1bSBTcGVuZGluZyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpPbiB0aGUgMjR0aCBGZWJydXJhcnksIHRoZSBFbGVjdG9yYWwgQ29tbWlzc2lvbiBbcHVibGlzaGVkIGFsbCBzcGVuZGluZ10oaHR0cDovL3NlYXJjaC5lbGVjdG9yYWxjb21taXNzaW9uLm9yZy51ay9TZWFyY2gvU3BlbmRpbmc/Y3VycmVudFBhZ2U9MSZyb3dzPTEwJnNvcnQ9RGF0ZUluY3VycmVkJm9yZGVyPWRlc2MmdGFiPTEmb3Blbj1maWx0ZXImZXQ9cHAmZXQ9cHBtJmV0PXRwJmV0PXBlcnBhciZldD1yZCZldnQ9cmVmZXJlbmR1bSZldj0yNTE0Jm9wdENvbHM9Q2FtcGFpZ25pbmdOYW1lJm9wdENvbHM9RXhwZW5zZUNhdGVnb3J5TmFtZSZvcHRDb2xzPUZ1bGxBZGRyZXNzJm9wdENvbHM9QW1vdW50SW5FbmdsYW5kJm9wdENvbHM9QW1vdW50SW5TY290bGFuZCZvcHRDb2xzPUFtb3VudEluV2FsZXMmb3B0Q29scz1BbW91bnRJbk5vcnRoZXJuSXJlbGFuZCZvcHRDb2xzPURhdGVPZkNsYWltRm9yUGF5bWVudCZvcHRDb2xzPURhdGVQYWlkKSBieSBvcmdhbmlzYXRpb25zIGR1cmluZyB0aGUgW1VLJ3MgcmVmZXJlbmR1bSB0byBsZWF2ZSB0aGUgRVVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXRlZF9LaW5nZG9tX0V1cm9wZWFuX1VuaW9uX21lbWJlcnNoaXBfcmVmZXJlbmR1bSxfMjAxNikuCgpgYGB7cn0KI29wZW4gdGhlIGNzdiBmaWxlIGZyb20gdGhlIGVsZWN0b3JhbCBjb21taXNzaW9uCiNyZWhvc3RlZCBhdDoKZ2l0aHViIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUm9iV0hpY2ttYW4vIgpzcGVuZGluZyA8LSByZWFkLmNzdihwYXN0ZTAoZ2l0aHViLCAiRGF0YWJhc2VzLWFuZC1GaWxlcy9tYXN0ZXIvRVVyZWZfU3BlbmQvRVVyZWZzcGVuZGluZy5jc3YiKSwKICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogICNjb252ZXJ0IHRvIG51bWVyaWMgcG91bmRzIGFuZCByIGRhdGUgZm9ybWF0CiAgc3BlbmRpbmckVG90YWxFeHBlbmRpdHVyZSA8LSBnc3ViKCLCoyIsICIiLCBzcGVuZGluZyRUb3RhbEV4cGVuZGl0dXJlKQogIHNwZW5kaW5nJFRvdGFsRXhwZW5kaXR1cmUgPC0gZ3N1YigiLCIsICIiLCBzcGVuZGluZyRUb3RhbEV4cGVuZGl0dXJlKQogIHNwZW5kaW5nJFRvdGFsRXhwZW5kaXR1cmUgPC0gYXMubnVtZXJpYyhzcGVuZGluZyRUb3RhbEV4cGVuZGl0dXJlKQogIHNwZW5kaW5nJERhdGVJbmN1cnJlZCA8LSBhcy5EYXRlKHNwZW5kaW5nJERhdGVJbmN1cnJlZCwgIiVkLyVtLyVZIikKCiNmaW5kIHBvbGl0aWNhbCBwYXJ0aWVzIGluIHRoZSBkYXRhICAKcGFydHlfYWZmaWxpYXRlZCA8LSB1bmlxdWUoc3BlbmRpbmckUmVndWxhdGVkRW50aXR5TmFtZSlbYygyLCA4LCA5LCAxNiwgMjAsIDI3LCAzOSwgNjEsIDYyLCA2NildICAKCiNnZXQgdGhlIHRvdGFsIHNwZW5kIGZvciBlYWNoIHNhbmN0aW9uZWQgb3JnYW5pc2F0aW9uICAKdG90YWxfc3BlbmRfZGYgPC0gYWdncmVnYXRlKHNwZW5kaW5nJFRvdGFsRXhwZW5kaXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGxpc3Qoc3BlbmRpbmckUmVndWxhdGVkRW50aXR5TmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBzdW0pCgojZmluZCB0aGUgbGFyZ2Ugb3JnYW5pc2F0aW9ucyB0b3RhbCBzcGVuZHMKI3BvbGl0aWNhbCBwYXJ0aWVzLCBhbmQgb3RoZXJzIHdobyBzcGVuZCBvdmVyIDFNIEdCUApvcmdhbmlzYXRpb25fZGYgPC0gcmJpbmQodG90YWxfc3BlbmRfZGZbd2hpY2godG90YWxfc3BlbmRfZGYkeCA+IDEwMDAwMDApLF0sCiAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9zcGVuZF9kZlt3aGljaCh0b3RhbF9zcGVuZF9kZiRHcm91cC4xICVpbiUgcGFydHlfYWZmaWxpYXRlZCksXSkKICBvcmdhbmlzYXRpb25fZGYgPC0gb3JnYW5pc2F0aW9uX2RmWy13aGljaChkdXBsaWNhdGVkKG9yZ2FuaXNhdGlvbl9kZiRHcm91cC4xKSksXQogIG9yZ2FuaXNhdGlvbl9kZiRzaG9ydG5hbWVzIDwtIGMoIkxhYm91ciIsICJMaWIgRGVtcyIsICJJTiBDYW1wYWlnbiIsICJVS0lQIiwgIlZvdGUgTGVhdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnNlcnZhdGl2ZSBJTiIsICJEVVAiLCAiR3JlZW4gT1VUIiwgIkdyZWVuIiwgIkxhYm91ciBPVVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsYWlkIEN5bXJ1IiwgIlNOUCIpCiAgb3JnYW5pc2F0aW9uX2RmJG9yZ2FuaXNhdGlvbiA8LSBjKCJMYWJvdXIiLCAiTGliIERlbXMiLCAiT2ZmaWNpYWwgQ2FtcGFpZ24iLCAiVUtJUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPZmZpY2lhbCBDYW1wYWlnbiIsICJDb25zZXJ2YXRpdmVzIiwgIkRVUCIsICJHcmVlbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3JlZW5zIiwgIkxhYm91ciIsICJQbGFpZCBDeW1ydSIsICJTTlAiKQogIG9yZ2FuaXNhdGlvbl9kZiA8LSBvcmdhbmlzYXRpb25fZGZbb3JkZXIob3JnYW5pc2F0aW9uX2RmJEdyb3VwLjEpLF0KCmBgYAoKRmlyc3QsIHRoZSB0b3RhbCBzcGVuZHMgb2YgYWxsIHRoZSBvcmdhbmlzYXRpb25zOgoKYGBge3IsIGZpZy53aWR0aD04fQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoZ2dyZXBlbCkKCiNzaG9ydGVuZWQgbGFiZWxzIG9mIHRoZSBsYXJnZSBzcGVuZGluZyBvcmdhbmlzYXRpb24KI2Zyb20gb3JnYW5pc2F0aW9uX2RmCmJpZ19zcGVuZGVycyA8LSBjKCJCcmV4aXQgRXhwcmVzcyIsICJDb25zZXJ2YXRpdmUgSU4iLCAiTGFib3VyIiwgIkxlYXZlLkVVIiwgIkxpYiBEZW1zIiwKICAgICAgICAgICAgICAgICAgIkRhcnJlbiBHcmltZXMiLCAiSU4gQ2FtcGFpZ24iLCAiVUtJUCIsICJWb3RlIExlYXZlIikKCiNwbG90IHRoZSB0b3RhbCBzcGVuZGluZyBvZiBlYWNoIG9yZ2FuaXNhdGlvbgpnZ3Bsb3Qoc3BlbmRpbmcsIGFlcyhSZWd1bGF0ZWRFbnRpdHlOYW1lLCBUb3RhbEV4cGVuZGl0dXJlKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICAgIGdlb21fYmFyKGRhdGEgPSBvcmdhbmlzYXRpb25fZGYsIGFlcyhHcm91cC4xLCB4LCBmaWxsID0gb3JnYW5pc2F0aW9uKSwgc3RhdCA9ICJpZGVudGl0eSIpICsKICAgIGdlb21fdGV4dF9yZXBlbChkYXRhID0gdG90YWxfc3BlbmRfZGZbd2hpY2godG90YWxfc3BlbmRfZGYkeCA+IDUwMDAwMCksXSwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGJpZ19zcGVuZGVycywgYWVzKEdyb3VwLjEsIHgpLCBudWRnZV94ID0gLTQsIG51ZGdlX3kgPSA1MDAwMDAsCiAgICAgICAgICAgICAgICAgICAgbWluLnNlZ21lbnQubGVuZ3RoID0gdW5pdCgwLjEsICJsaW5lcyIpKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IE5VTEwpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNzAwMDAwMCwgMTAwMDAwMCksIGxhYmVscyA9IHBhc3RlKHNlcSgwLDcpLCAiTWlsbGlvbiIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgImRhcmtyZWQiLCAiZ3JlZW4iLCAicmVkIiwgInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaW5rIiwgImRhcmtncmVlbiIsICJnb2xkZW5yb2QiLCAicHVycGxlIikpICsKICAgIHRoZW1lX2ZpdmV0aGlydHllaWdodCgpICsKICAgIGdndGl0bGUoIkVVIFJlZmVyZW5kdW0gRXhwZW5kaXR1cmUiLAogICAgICAgICAgInRvdGFsIGV4cGVuZGl0dXJlICjCoykgZm9yIGVhY2ggcmVnaXN0ZXJlZCBlbnRpdHkgc29ydGVkIGFscGhhYmV0aWNhbGx5IikKYGBgCltnZ3JhcGhdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9nZ3JhcGgvaW5kZXguaHRtbCkgYWxzbyBjYW1lIG91dCB0b2RheQoKYGBge3IsIGZpZy53aWR0aD0xMn0KbGlicmFyeShnZ3JhcGgpCmxpYnJhcnkoZ2dmb3JjZSkKCiNhZGQgb3VyIGFlc3RoZXRpYyBkZXRhaWxzIGludG8gdGhlIG1haW4gZGF0YSBmcmFtZQp0b3RhbF9zcGVuZF9kZiA8LSBtdXRhdGUodG90YWxfc3BlbmRfZGYsIHNob3J0bmFtZXMgPSAiIiwgb3JnYW5pc2F0aW9uID0gIm5vbmUiKQp0b3RhbF9zcGVuZF9kZiRzaG9ydG5hbWVzW3doaWNoKHRvdGFsX3NwZW5kX2RmJHggPiA1MDAwMDApXSA8LSBiaWdfc3BlbmRlcnMKdG90YWxfc3BlbmRfZGYkb3JnYW5pc2F0aW9uW3doaWNoKHRvdGFsX3NwZW5kX2RmJEdyb3VwLjEgJWluJSBvcmdhbmlzYXRpb25fZGYkR3JvdXAuMSldIDwtIG9yZ2FuaXNhdGlvbl9kZiRvcmdhbmlzYXRpb24KCiN0YWtlIHRoZSBtb25leSBzcGVudCBieSBlYWNoIGJvZHkgYXMgdGhlIHNpemUgb2YgdGhlIGNpcmNsZXMgcGxvdHRlZApzaXplcyA8LSB0b3RhbF9zcGVuZF9kZiR4CiAgI3VzZSB0aGlzIHRvIHdvcmsgb3V0IHRoZSBwb3NpdGlvbiBvZiBlYWNoIGNpcmNsZQogIHBvc2l0aW9uIDwtIHBhY2tfY2lyY2xlcyhzaXplcykKICBkYXRhIDwtIGRhdGEuZnJhbWUoeCA9IHBvc2l0aW9uWywxXSwgeSA9IHBvc2l0aW9uWywyXSwgciA9IHNxcnQoc2l6ZXMvcGkpKQoKI21ha2UgdGhlIGNpcmNsZSBwbG90CmdncGxvdCgpICsKICBnZW9tX2NpcmNsZShhZXMoeDAgPSB4LCB5MCA9IHksIHIgPSByLCBmaWxsID0gdG90YWxfc3BlbmRfZGYkb3JnYW5pc2F0aW9uKSwgZGF0YSA9IGRhdGEpICsKICBnZW9tX3RleHQobGFiZWwgPSBvcmdhbmlzYXRpb25fZGYkR3JvdXAuMSkgKwogIGdlb21fY2lyY2xlKGFlcyh4MCA9IDAsIHkwID0gMCwgciA9IGF0dHIocG9zaXRpb24sICdlbmNsb3NpbmdfcmFkaXVzJykpKSArCiAgZ2VvbV9ub2RlX3RleHQoZGF0YSA9IGRhdGEsIGFlcyhsYWJlbCA9IHRvdGFsX3NwZW5kX2RmJHNob3J0bmFtZXMsIHNpemUgPSByKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAiZGFya3JlZCIsICJncmVlbiIsICJyZWQiLCAieWVsbG93IiwgImdyZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaW5rIiwgImRhcmtncmVlbiIsICJnb2xkZW5yb2QiLCAicHVycGxlIiksCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJvcmdhbmlzYXRpb24iKSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIGd1aWRlcyhzaXplID0gRkFMU0UpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJFVSBSZWZlcmVuZHVtIEV4cGVuZGl0dXJlIiwKICAgICAgICAgICJ0b3RhbCBleHBlbmRpdHVyZSAowqMpIGZvciBlYWNoIHJlZ2lzdGVyZWQgZW50aXR5IikgKwogIGNvb3JkX2ZpeGVkKCkKYGBgCgo=