County data mapped on a national scale can sometimes be difficult to see. The
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
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
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.