County data mapped on a national scale can sometimes be difficult to
see. The get_bls_county() and bls_map_county()
functions both have arguments that will accommodate data and maps for
specific states or groups of states.
The example below shows the most recent unemployment rates for Florida.
library(blscrapeR)
df <- get_bls_county(stateName = "Florida")
map_bls(map_data=df, fill_rate = "unemployed_rate",
stateName = "Florida")Also, the states can be called together to form larger districts. Below is an example of the most recent unemployment rates for the southeastern states of Florida, Georgia and Alabama.
# Map the unemployment rate for the Southeastern United States.
df <- get_bls_county(stateName = c("Florida", "Georgia", "Alabama"))
map_bls(map_data=df, fill_rate = "unemployed_rate", projection = "lambert",
stateName = c("Florida", "Georgia", "Alabama"))If you don’t like any of the pre-fabricated maps, that’s alright
because blscrapeR provides the fortified map data, which
includes longitude, latitude and
FIPS codes. This data set is suitable for any kind of
ggplot2 map you can think of.
First, call the internal map data and have a look:
library(blscrapeR)
us_map <- county_map_data
head(us_map)## long lat order hole piece group id
## 1 1225889 -1275020 1 FALSE 1 01001.1 01001
## 2 1244873 -1272331 2 FALSE 1 01001.1 01001
## 3 1244129 -1267515 3 FALSE 1 01001.1 01001
## 4 1272010 -1262889 4 FALSE 1 01001.1 01001
## 5 1276797 -1295514 5 FALSE 1 01001.1 01001
## 6 1272367 -1296730 6 FALSE 1 01001.1 01001
Notice the id column looks a lot like one of the FIPS
codes returned by the get_bls_county() function? This is
actually a concatenation of the state + county FIPS codes. The first two
numbers are the state FIPS and the last four are the county FIPS. These
boundaries currently represent 20015/2016 and will be updated
accordingly so they always represent the current year.
Next, produce your custom map:
library(blscrapeR)
library(ggplot2)
# Get the most recent unemployment rate for each county on a national level.
df <- get_bls_county()
# Get map data
us_map <- county_map_data
# Insert larger breaks in unemployment rates
df$rate_d <- cut(df$unemployed_rate, breaks = c(seq(0, 10, by = 2), 35))
# Plot
ggplot() +
geom_map(data=us_map, map=us_map,
aes(x=long, y=lat, map_id=id, group=group),
fill="#ffffff", color="#0e0e0e", size=0.15) +
geom_map(data=df, map=us_map, aes_string(map_id="fips", fill=df$rate_d),
color="#0e0e0e", size=0.15) +
scale_fill_brewer()+
coord_equal() +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
legend.title=element_blank())What’s R mapping without some interactivity? Below we’re using two
additional packages, leaflet, which is popular for creating
interactive maps and tigris, which allows us to download
the exact shape files we need for these data and includes a few other
nice tools.
# Leaflet map
library(blscrapeR)
library(tigris)
library(leaflet)
map.shape <- counties(cb = TRUE, year = 2015)
df <- get_bls_county()
# Slice the df down to only the variables we need and rename "fips" colunm
# so I can get a cleaner merge later.
df <- subset(df, select = c("unemployed_rate", "fips"))
colnames(df) <- c("unemployed_rate", "GEOID")
# Merge df with spatial object.
leafmap <- geo_join(map.shape, df, by="GEOID")
# Format popup data for leaflet map.
popup_dat <- paste0("<strong>County: </strong>",
leafmap$NAME,
"<br><strong>Value: </strong>",
leafmap$unemployed_rate)
pal <- colorQuantile("YlOrRd", NULL, n = 20)
# Render final map in leaflet.
leaflet(data = leafmap) %>% addTiles() %>%
addPolygons(fillColor = ~pal(unemployed_rate),
fillOpacity = 0.8,
color = "#BDBDC3",
weight = 1,
popup = popup_dat)Note: This is just a static image since the full map would not be as portable for the purpose of documentation.