The NY Times has been making an amazing infographic of Covid-19 cases. With the data from this package, we should be able to more or less recreate it. Let’s do it for the lower 48 (moving Hawaii and Alaska is a pain!)
We’ll start by loading the coronavirus data at the county and state level
require(covid19nytimes) require(dplyr) covid19nytimes_states <- refresh_covid19nytimes_states() %>% filter(date == max(date)) covid19nytimes_counties <- refresh_covid19nytimes_counties()%>% filter(date == max(date))
Next, we need some county maps and state maps. For this, we’ll use the excellent tigris package. We want the centroid of counties for bubble placement.
require(sf) require(tigris) county_map <- counties(cb = TRUE, resolution = '20m', class = "sf") %>% st_centroid() state_map <- states(cb = TRUE, resolution = '5m', class = "sf") #make a state lookup table state_lookup <- state_map %>% as_tibble() %>% select(STATEFP, NAME) %>% rename(STATE_NAME = NAME)
OK, let’s filter to the lower 48 for all data sets
filter_out <- c("Alaska", "Hawaii", "Guam", "Puerto Rico", "American Samoa", "Commonwealth of the Northern Mariana Islands", "Virgin Islands") covid19nytimes_states <- covid19nytimes_states %>% filter(!(location %in% filter_out)) %>% filter(location != "Unknown") covid19nytimes_counties <- covid19nytimes_counties %>% filter(purrr::map_dbl(location, ~stringr::str_detect(., filter_out) %>% sum)==0) %>% filter(location != "Unknown") county_map <- county_map %>% left_join(state_lookup) %>% filter(!(STATE_NAME %in% filter_out)) #> Joining, by = "STATEFP" state_map <- state_map %>% filter(!(NAME %in% filter_out))
For text labels, we use centroids of states joined with maximum number of case numbers.
state_num_centroids <- covid19nytimes_states %>% filter(date == max(date)) %>% filter(data_type == "cases_total") %>% left_join(state_map, by = c("location_code" = "STATEFP")) %>% st_as_sf(crs = st_crs(state_map)) %>% st_centroid()
Now, we join the county data and the county centroid map and filter to the last date in the data set.
joined_covid_counties <- covid19nytimes_counties %>% filter(data_type == "cases_total") %>% left_join(county_map, by = c("location_code" = "GEOID")) %>% st_as_sf(crs = st_crs(county_map))
Last, let’s make the plot!
require(ggplot2) #> Loading required package: ggplot2 ggplot() + geom_sf(data = state_map, fill = "lightgrey", color = "darkgrey") + geom_sf_text(data = state_num_centroids, aes(label = value), color = "red", size = 4, alpha = 0.7) + geom_sf(data = joined_covid_counties, mapping = aes(size = value), shape = 21, alpha = 0.5, color = "red", fill = "pink") + theme_void() + scale_size_continuous(guide= "none", range = c(0.05, 35)) + coord_sf(crs = st_crs(2163)) #for that nice equal area curved look