Orchestral Manoeuvres In The Dark - Enola Gay
#data from https://data.world/datamil/world-war-ii-thor-data
setwd("/home/robert/Desktop/Code/Blog Posts Markdown/British Bombing")
bombing <- read.csv("THOR_WWII_DATA_CLEAN.csv", stringsAsFactors = FALSE)
For this, all I want are the dates, country doing the bombing and the long/lat coordinates
#filter by column name
columns <- c("COUNTRY_FLYING_MISSION", "MSNDATE", "LATITUDE", "LONGITUDE")
bombing <- bombing[which(names(bombing) %in% columns)]
#convert the dates into R date format
bombing$dates <- as.Date(bombing$MSNDATE, "%m/%d/%Y")
#select only British bombing raids
bombing <- bombing[which(bombing$COUNTRY_FLYING_MISSION == "GREAT BRITAIN"),]
#select only raids with co-ordinate data
bombing <- bombing[-c(which(is.na(bombing$LATITUDE))),]
#how many raids do we have to map
print(paste0("There are ", length(unique(bombing$dates)), " days of British bombing listed"))
[1] "There are 1651 days of British bombing listed"
This is actually pretty incredible as between the start of British bombing and it’s conclusion in 1945 there are only:
campaign_length <- max(bombing$dates) - min(bombing$dates)
print(paste0(campaign_length, " days between start of British bombing and final mission"))
[1] "2068 days between start of British bombing and final mission"
library(ggmap)
library(mapproj)
map <- get_map(location = 'Germany', zoom = 4)
ggmap(map) +
geom_point(data = bombing, aes(x = LONGITUDE, y = LATITUDE), alpha = 0.2) +
ggtitle("British Bombing 1939-1945")

There’s also substantial bombing in Ethiopia and Myanmar and also a few raids around northern Norway, the Bay of Bengal, Kazakhstan and even one in Japan. I’m going to ignore all these and just focus on the European/North Africa theater.
For this, I want to make my own map using rworldmap as the ggmap output is a little space heavy and my laptop can barely handle making gifs from it
library(rworldmap)
library(sp)
#get a world map
World <- getMap(resolution = "coarse")
#subset out the region we're interested in
EU <- which(World@data$SRES == "Western Europe (WEU)" |
World@data$SRES == "Central and Eastern Europe (EEU)" |
World@data$SRES == "Middle East and North Africa (MEA)" |
World@data$NAME == "Ukraine" | World@data$NAME == "Latvia" |
World@data$NAME == "Lithuania" | World@data$NAME == "Estonia" |
World@data$NAME== "Belarus" | World@data$NAME == "Moldova")
Europe <- World[c(EU),]
#remove various small islands that distort the map
remove <- c("Greenland", "Iran", "S. Sudan", "W. Sahara", "Sint Maarten",
"St. Barthelemy", "Br. Indian Ocean Ter.", "S. Geo. and S. Sandw. Is.",
"St. Martin", "Sudan", "Oman", "Yemen")
Europe <- Europe[-c(which(Europe@data$NAME %in% remove)),]
#show the new map
plot(Europe)

to plot this using ggplot, it first needs to be fortified into a data frame. The ‘bombing’ data frame also needs to be prepared to be grouped by month
library(ggplot2)
Europe_df <- fortify(Europe, region = "NAME")
bombing$months <- gsub("...$", "", bombing$dates)
then we can use gganimate to sequentially plot by a frames argument and generate an output gif of British bombing raids over 1939-1945
library(gganimate)
library(ggthemes)
#remove points outside the mapping area
bombing <- bombing[-c(which(bombing$LATITUDE > max(Europe_df$lat) | bombing$LATITUDE < min(Europe_df$lat))),]
bombing <- bombing[-c(which(bombing$LONGITUDE > max(Europe_df$long) | bombing$LONGITUDE < min(Europe_df$long))),]
#make a plot of all the raids
animation <- ggplot() +
#set up the map
geom_map(data = Europe_df, map = Europe_df,
aes(x = long, y = lat, map_id = id),
color = "black", size = 1, fill = "lightgreen") +
#add in the shapefiles
geom_map(data = Europe@data, map = Europe_df,
aes(map_id = NAME), fill = NA,
color = NA) +
#add in the bombs and a 'frame' argument for gganimate
geom_point(data = bombing, aes(x = LONGITUDE, y = LATITUDE, frame = months),
alpha = 0.3, colour = "red", size = 1.5) +
theme_map() + ggtitle("British Bombing Missions: ")
#create the output gif
gganimate(animation, "outputgif.gif", title_frame = TRUE)
Which results in quite a nice gif showing the pattern of the war through the bombing raids Britain carried out. The map is fairly low quality due to computer processing power and I haven’t figured out how to force an order on the animation (and replace the numeric dates with month names), but other than that, I’m pretty pelased with the result.
LS0tCnRpdGxlOiAiQnJpdGlzaCBCb21iaW5nIFJhaWRzIGluIFdXSUkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCltPcmNoZXN0cmFsIE1hbm9ldXZyZXMgSW4gVGhlIERhcmsgLSBFbm9sYSBHYXldKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9ZDVYSjJHaVI2Qm8pCgpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9CiNkYXRhIGZyb20gaHR0cHM6Ly9kYXRhLndvcmxkL2RhdGFtaWwvd29ybGQtd2FyLWlpLXRob3ItZGF0YQpzZXR3ZCgiL2hvbWUvcm9iZXJ0L0Rlc2t0b3AvQ29kZS9CbG9nIFBvc3RzIE1hcmtkb3duL0JyaXRpc2ggQm9tYmluZyIpCmJvbWJpbmcgPC0gcmVhZC5jc3YoIlRIT1JfV1dJSV9EQVRBX0NMRUFOLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKYGBgCgpGb3IgdGhpcywgYWxsIEkgd2FudCBhcmUgdGhlIGRhdGVzLCBjb3VudHJ5IGRvaW5nIHRoZSBib21iaW5nIGFuZCB0aGUgbG9uZy9sYXQgY29vcmRpbmF0ZXMKCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0KI2ZpbHRlciBieSBjb2x1bW4gbmFtZQpjb2x1bW5zIDwtIGMoIkNPVU5UUllfRkxZSU5HX01JU1NJT04iLCAiTVNOREFURSIsICJMQVRJVFVERSIsICJMT05HSVRVREUiKQpib21iaW5nIDwtIGJvbWJpbmdbd2hpY2gobmFtZXMoYm9tYmluZykgJWluJSBjb2x1bW5zKV0KICAjY29udmVydCB0aGUgZGF0ZXMgaW50byBSIGRhdGUgZm9ybWF0CiAgYm9tYmluZyRkYXRlcyA8LSBhcy5EYXRlKGJvbWJpbmckTVNOREFURSwgIiVtLyVkLyVZIikKCiNzZWxlY3Qgb25seSBCcml0aXNoIGJvbWJpbmcgcmFpZHMKYm9tYmluZyA8LSBib21iaW5nW3doaWNoKGJvbWJpbmckQ09VTlRSWV9GTFlJTkdfTUlTU0lPTiA9PSAiR1JFQVQgQlJJVEFJTiIpLF0KICAjc2VsZWN0IG9ubHkgcmFpZHMgd2l0aCBjby1vcmRpbmF0ZSBkYXRhCiAgYm9tYmluZyA8LSBib21iaW5nWy1jKHdoaWNoKGlzLm5hKGJvbWJpbmckTEFUSVRVREUpKSksXQogIAojaG93IG1hbnkgcmFpZHMgZG8gd2UgaGF2ZSB0byBtYXAgIApwcmludChwYXN0ZTAoIlRoZXJlIGFyZSAiLCBsZW5ndGgodW5pcXVlKGJvbWJpbmckZGF0ZXMpKSwgIiBkYXlzIG9mIEJyaXRpc2ggYm9tYmluZyBsaXN0ZWQiKSkKYGBgCgpUaGlzIGlzIGFjdHVhbGx5IHByZXR0eSBpbmNyZWRpYmxlIGFzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIEJyaXRpc2ggYm9tYmluZyBhbmQgaXQncyBjb25jbHVzaW9uIGluIDE5NDUgdGhlcmUgYXJlIG9ubHk6CgpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9CmNhbXBhaWduX2xlbmd0aCA8LSBtYXgoYm9tYmluZyRkYXRlcykgLSBtaW4oYm9tYmluZyRkYXRlcykKcHJpbnQocGFzdGUwKGNhbXBhaWduX2xlbmd0aCwgIiBkYXlzIGJldHdlZW4gc3RhcnQgb2YgQnJpdGlzaCBib21iaW5nIGFuZCBmaW5hbCBtaXNzaW9uIikpCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSwgIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KG1hcHByb2opCgptYXAgPC0gZ2V0X21hcChsb2NhdGlvbiA9ICdHZXJtYW55Jywgem9vbSA9IDQpCmdnbWFwKG1hcCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGJvbWJpbmcsIGFlcyh4ID0gTE9OR0lUVURFLCB5ID0gTEFUSVRVREUpLCBhbHBoYSA9IDAuMikgKwogIGdndGl0bGUoIkJyaXRpc2ggQm9tYmluZyAxOTM5LTE5NDUiKQpgYGAKClRoZXJlJ3MgYWxzbyBzdWJzdGFudGlhbCBib21iaW5nIGluIEV0aGlvcGlhIGFuZCBNeWFubWFyIGFuZCBhbHNvIGEgZmV3IHJhaWRzIGFyb3VuZCBub3J0aGVybiBOb3J3YXksIHRoZSBCYXkgb2YgQmVuZ2FsLCBLYXpha2hzdGFuIGFuZCBldmVuIG9uZSBpbiBKYXBhbi4gSSdtIGdvaW5nIHRvIGlnbm9yZSBhbGwgdGhlc2UgYW5kIGp1c3QgZm9jdXMgb24gdGhlIEV1cm9wZWFuL05vcnRoIEFmcmljYSB0aGVhdGVyLgoKRm9yIHRoaXMsIEkgd2FudCB0byBtYWtlIG15IG93biBtYXAgdXNpbmcgcndvcmxkbWFwIGFzIHRoZSBnZ21hcCBvdXRwdXQgaXMgYSBsaXR0bGUgc3BhY2UgaGVhdnkgYW5kIG15IGxhcHRvcCBjYW4gYmFyZWx5IGhhbmRsZSBtYWtpbmcgZ2lmcyBmcm9tIGl0CgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPSA3LCBmaWcuaGVpZ2h0PSA1fQpsaWJyYXJ5KHJ3b3JsZG1hcCkKbGlicmFyeShzcCkKCiNnZXQgYSB3b3JsZCBtYXAKV29ybGQgPC0gZ2V0TWFwKHJlc29sdXRpb24gPSAiY29hcnNlIikKICAjc3Vic2V0IG91dCB0aGUgcmVnaW9uIHdlJ3JlIGludGVyZXN0ZWQgaW4KICBFVSA8LSB3aGljaChXb3JsZEBkYXRhJFNSRVMgPT0gIldlc3Rlcm4gRXVyb3BlIChXRVUpIiB8CiAgICAgICAgICAgICAgV29ybGRAZGF0YSRTUkVTID09ICJDZW50cmFsIGFuZCBFYXN0ZXJuIEV1cm9wZSAoRUVVKSIgfAogICAgICAgICAgICAgIFdvcmxkQGRhdGEkU1JFUyA9PSAiTWlkZGxlIEVhc3QgYW5kIE5vcnRoIEFmcmljYSAoTUVBKSIgfAogICAgICAgICAgICAgIFdvcmxkQGRhdGEkTkFNRSA9PSAiVWtyYWluZSIgfCBXb3JsZEBkYXRhJE5BTUUgPT0gIkxhdHZpYSIgfAogICAgICAgICAgICAgIFdvcmxkQGRhdGEkTkFNRSA9PSAiTGl0aHVhbmlhIiB8IFdvcmxkQGRhdGEkTkFNRSA9PSAiRXN0b25pYSIgfAogICAgICAgICAgICAgIFdvcmxkQGRhdGEkTkFNRT09ICJCZWxhcnVzIiB8IFdvcmxkQGRhdGEkTkFNRSA9PSAiTW9sZG92YSIpCiAgRXVyb3BlIDwtIFdvcmxkW2MoRVUpLF0KICAKICAjcmVtb3ZlIHZhcmlvdXMgc21hbGwgaXNsYW5kcyB0aGF0IGRpc3RvcnQgdGhlIG1hcAogIHJlbW92ZSA8LSBjKCJHcmVlbmxhbmQiLCAiSXJhbiIsICJTLiBTdWRhbiIsICJXLiBTYWhhcmEiLCAiU2ludCBNYWFydGVuIiwKICAgICAgICAgICAgICAiU3QuIEJhcnRoZWxlbXkiLCAiQnIuIEluZGlhbiBPY2VhbiBUZXIuIiwgIlMuIEdlby4gYW5kIFMuIFNhbmR3LiBJcy4iLAogICAgICAgICAgICAgICJTdC4gTWFydGluIiwgIlN1ZGFuIiwgIk9tYW4iLCAiWWVtZW4iKQogIAogIEV1cm9wZSA8LSBFdXJvcGVbLWMod2hpY2goRXVyb3BlQGRhdGEkTkFNRSAlaW4lIHJlbW92ZSkpLF0KCiNzaG93IHRoZSBuZXcgbWFwICAKcGxvdChFdXJvcGUpCmBgYAp0byBwbG90IHRoaXMgdXNpbmcgZ2dwbG90LCBpdCBmaXJzdCBuZWVkcyB0byBiZSBmb3J0aWZpZWQgaW50byBhIGRhdGEgZnJhbWUuIFRoZSAnYm9tYmluZycgZGF0YSBmcmFtZSBhbHNvIG5lZWRzIHRvIGJlIHByZXBhcmVkIHRvIGJlIGdyb3VwZWQgYnkgbW9udGgKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKCkV1cm9wZV9kZiA8LSBmb3J0aWZ5KEV1cm9wZSwgcmVnaW9uID0gIk5BTUUiKQoKYm9tYmluZyRtb250aHMgPC0gZ3N1YigiLi4uJCIsICIiLCBib21iaW5nJGRhdGVzKQpgYGAKCnRoZW4gd2UgY2FuIHVzZSBnZ2FuaW1hdGUgdG8gc2VxdWVudGlhbGx5IHBsb3QgYnkgYSBmcmFtZXMgYXJndW1lbnQgYW5kIGdlbmVyYXRlIGFuIG91dHB1dCBnaWYgb2YgQnJpdGlzaCBib21iaW5nIHJhaWRzIG92ZXIgMTkzOS0xOTQ1CgpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZ2dhbmltYXRlKQpsaWJyYXJ5KGdndGhlbWVzKQoKI3JlbW92ZSBwb2ludHMgb3V0c2lkZSB0aGUgbWFwcGluZyBhcmVhCmJvbWJpbmcgPC0gYm9tYmluZ1stYyh3aGljaChib21iaW5nJExBVElUVURFID4gbWF4KEV1cm9wZV9kZiRsYXQpIHwgYm9tYmluZyRMQVRJVFVERSA8IG1pbihFdXJvcGVfZGYkbGF0KSkpLF0KYm9tYmluZyA8LSBib21iaW5nWy1jKHdoaWNoKGJvbWJpbmckTE9OR0lUVURFID4gbWF4KEV1cm9wZV9kZiRsb25nKSB8IGJvbWJpbmckTE9OR0lUVURFIDwgbWluKEV1cm9wZV9kZiRsb25nKSkpLF0KCiNtYWtlIGEgcGxvdCBvZiBhbGwgdGhlIHJhaWRzCmFuaW1hdGlvbiA8LSBnZ3Bsb3QoKSArCiAgI3NldCB1cCB0aGUgbWFwCiAgZ2VvbV9tYXAoZGF0YSA9IEV1cm9wZV9kZiwgbWFwID0gRXVyb3BlX2RmLAogICAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIG1hcF9pZCA9IGlkKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSwgZmlsbCA9ICJsaWdodGdyZWVuIikgKwogICNhZGQgaW4gdGhlIHNoYXBlZmlsZXMgIAogIGdlb21fbWFwKGRhdGEgPSBFdXJvcGVAZGF0YSwgbWFwID0gRXVyb3BlX2RmLAogICAgICAgICAgIGFlcyhtYXBfaWQgPSBOQU1FKSwgZmlsbCA9IE5BLAogICAgICAgICAgIGNvbG9yID0gTkEpICsKICAjYWRkIGluIHRoZSBib21icyBhbmQgYSAnZnJhbWUnIGFyZ3VtZW50IGZvciBnZ2FuaW1hdGUKICBnZW9tX3BvaW50KGRhdGEgPSBib21iaW5nLCBhZXMoeCA9IExPTkdJVFVERSwgeSA9IExBVElUVURFLCBmcmFtZSA9IG1vbnRocyksCiAgICAgICAgICAgICBhbHBoYSA9IDAuMywgY29sb3VyID0gInJlZCIsIHNpemUgPSAxLjUpICsKICAgIHRoZW1lX21hcCgpICsgZ2d0aXRsZSgiQnJpdGlzaCBCb21iaW5nIE1pc3Npb25zOiAiKQoKI2NyZWF0ZSB0aGUgb3V0cHV0IGdpZgpnZ2FuaW1hdGUoYW5pbWF0aW9uLCAib3V0cHV0Z2lmLmdpZiIsIHRpdGxlX2ZyYW1lID0gVFJVRSkKYGBgCgpXaGljaCByZXN1bHRzIGluIHF1aXRlIGEgbmljZSBnaWYgc2hvd2luZyB0aGUgcGF0dGVybiBvZiB0aGUgd2FyIHRocm91Z2ggdGhlIGJvbWJpbmcgcmFpZHMgQnJpdGFpbiBjYXJyaWVkIG91dC4gVGhlIG1hcCBpcyBmYWlybHkgbG93IHF1YWxpdHkgZHVlIHRvIGNvbXB1dGVyIHByb2Nlc3NpbmcgcG93ZXIgYW5kIEkgaGF2ZW4ndCBmaWd1cmVkIG91dCBob3cgdG8gZm9yY2UgYW4gb3JkZXIgb24gdGhlIGFuaW1hdGlvbiAoYW5kIHJlcGxhY2UgdGhlIG51bWVyaWMgZGF0ZXMgd2l0aCBtb250aCBuYW1lcyksIGJ1dCBvdGhlciB0aGFuIHRoYXQsIEknbSBwcmV0dHkgcGVsYXNlZCB3aXRoIHRoZSByZXN1bHQu