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. Tidycensus uses the Decennial or 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 can be done with separate packages such as mapview, leaflet, or ggplot2::geom_sf().


Census API Key

you need 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 caching the API key in your R environment.

TidyCensus – Get Data

Create a Simple Features (i.e. sf) 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",
                      show_col_types = FALSE)

Subset Starbucks Data to North Carolina

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

Convert the starbucksNC data frame 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) + 
          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)