While I’m learning how to build a Hugo website with the blogdown
package in R, I thought I’d share this code for generating an interactive leaflet map. It has a choropleth overlay representing the number of weeks of archaeological fieldwork I’ve done in each US county. To make this map, I am relying on Tim Applehans’ incredibly helpful R package mapview
. Some of my experimentation with the mapview
spinoff package leafpop
can also be found here.
And, I guess, while I’m at it, I’m also contributing my first ever blogpost. You know, just what the world needs right now, another rand-oh whistling in the dark…
R Preamble
library(here)
library(leafpop)
library(mapview)
library(sf)
library(tidyverse)
library(USAboundaries)
Data wrangling
fieldwork <- read.csv(here("data/fieldwork.csv"), stringsAsFactors = FALSE) %>%
select(project, state, county, year, weeks)
Out of laziness, I have violated a general law of database design, including multiple values separated by commas in a single table cell. This was for convenience, mainly, as the table is organized around fieldwork projects, which often span over multiple counties and field seasons. Fortunately, tidyr
has a really helpful function separate_rows
that handles these situations. I also assume for convenience that the weeks of the project are evenly divided across counties.
fieldwork <- fieldwork %>%
separate_rows(county, sep = ", ") %>%
group_by(year, project) %>%
mutate(weeks = weeks/n()) %>%
ungroup()
fieldwork <- fieldwork %>%
group_by(state, county) %>%
summarize(weeks = sum(weeks),
project = paste("-", unique(project), collapse = "<br>"))
Now, we load a U.S. counties shapefile and join this data with fieldwork. The shapefile is loaded in as an sf
object, so it plays nicely with dplyr
.
counties <- USAboundaries::us_counties(states = unique(fieldwork$state)) %>%
select(state_abbr, name) %>%
rename("state" = state_abbr, "county" = name)
# join fieldwork and counties
fieldwork <- left_join(counties, fieldwork, by = c("state", "county"))
Map of fieldwork
And now for the map!
mapview(fieldwork,
zcol = "weeks",
map.types = c("CartoDB.Positron", "Stamen.Terrain", "OpenTopoMap"),
alpha.regions = 0.5,
na.color = "transparent",
layer.name = "Weeks",
popup = leafpop::popupTable(fieldwork, zcol = c("county", "project", "weeks")))
Total number of weeks of fieldwork: 96