The tidycensus package, developed by Kyle Walker, is very convenient and easy to use package for making choropleth maps from United States Department of Census data, specifically from the Decennial and ACS Census reports. This package makes it possible to gather census variables and conveniently join those variables with “Census Geography” (i.e. aka “shapefiles”, or polygons.) Visualization, or plotting, maps can be done with separate packages.

library(tidyverse)
library(sf)
library(tidycensus)
library(leaflet)
library(mapview)

Census API Key

Use the tidycensus package to gather Census data and join that data with Census geography (i.e. geometry, i.e. shapefiles, i.e. polygons). First, you will need to get a free Census API key. Kyle Walker’s Basic usage of tidycensus documents this process.

census_api_key("YOUR API KEY GOES HERE")

.Renviron File

See also Kyle’s more detailed documentation for putting the key into your environment file. But skip that for the moment.

TidyCensus – Get Data

Create a Simple Features dataframe using tidycensus::get_acs()

The Census population variable we’ll use is “B01003_001”. More information about identifying Census variables is available at the bottom of this page.

nc_pop <- 
  get_acs(geography = "county",
          variables = "B01003_001",
          state = "NC",
          geometry = TRUE)

Make Choropleth via mapview

Identify which variable will be used to create the color ramp shading. Assign this variable with the zcol argument. The estimate variable was extracted via the tidycensus::get_acs() function.

mapview(nc_pop, zcol = "estimate")

Add another layer

Now we’ll geolocate the Starbucks stores and add those locations as a layer over our choropleth. The Starbucks locations were generated and plotted in the previous exercise. Here we regenerate the StarbuckNC object.

Load Lat/Long Data

starbucks <- read_csv("data/All_Starbucks_Locations_in_the_US_-_Map.csv")

Subset Starbucks Data to North Carolina

starbucksNC <- starbucks  %>% 
  filter(State == "NC")

Convert the starbuckNC dataframe to a spatial (sf) object and assign the same projection as the nc_pop spatial object.

starbucksNC <- st_as_sf(starbucksNC, coords = c("Longitude", "Latitude"),  crs = st_crs(nc_pop))

Generate the map with multiple layers. You can read more about additional arguments such as homebutton, legend, alpha, cex in the mapview() documentation. Read about the many more mapview functions in the full documentation.

mymap <- mapview(nc_pop, 
                 zcol = "estimate", 
                 homebutton = FALSE) + 
  mapview(starbucksNC, 
          zcol = "Name", 
          legend = FALSE, 
          alpha = 0.5, cex = 3, 
          col.regions = "orange",
          homebutton = FALSE) 

addLogo(mymap, "images/Rfun3.png",
        position = "bottomright",
        offset.x = 8,
        offset.y = 38,
        width = 100,
        height = 100)