Making Maps in R

Setting up

Prepare data from last labs

zip_codes <- st_read('../assign7/R-Spatial_I_Lab/ZIP_CODE_040114/ZIP_CODE_040114.shp')
## Reading layer `ZIP_CODE_040114' from data source 
##   `/Users/williamcornejo/Desktop/Desktop - william’s MacBook Air/school/gtech705/gtech78520/assign7/R-Spatial_I_Lab/ZIP_CODE_040114/ZIP_CODE_040114.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 263 features and 12 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 913129 ymin: 120020.9 xmax: 1067494 ymax: 272710.9
## Projected CRS: NAD83 / New York Long Island (ftUS)
health_facilities <- read.csv('../assign7/R-Spatial_I_Lab/NYS_Health_Facility 3(in).csv')
hf_df <- health_facilities[!is.na(health_facilities$Facility.Longitude), ]
hf_df <- hf_df[!is.na(hf_df$Facility.Latitude), ]
hf_df <- hf_df[!is.na(hf_df$Facility.Longitude), ]
hf_df <- hf_df[hf_df$Facility.Latitude != 0, ]
hf_df <- hf_df[hf_df$Facility.Longitude != 0, ]
hf_sf <- st_as_sf(hf_df, coords = c("Facility.Longitude", "Facility.Latitude"))

#Prepare zipcode and covid join
covid_3 <- read.csv('../assign8/R-Spatial_II_Lab/tests-by-zcta_2021_04_23.csv')

# Read zip code data as spatial
zip_codes_1 <- st_transform(zip_codes, 4326) 

# Join by zipcode
# Convert zcta to char
covid_3 <- covid_3[!is.na(covid_3$MODIFIED_ZCTA), ]
covid_3_sf <- st_as_sf(covid_3, coords = c("lon", "lat"), crs=4326)
covid_3$MODZCTA_2 <- as.character(covid_3$MODIFIED_ZCTA)
covid_3_sf$MODZCTA_2 <- as.character(covid_3_sf$MODIFIED_ZCTA)
covid_3_join <- base::merge(covid_3, zip_codes_1, by.x='MODZCTA_2', by.y='ZIPCODE')
covid_3_join <- st_as_sf(covid_3_join, coords = c("lon", "lat"), crs=4326)
covid_3_join <- covid_3_join %>% 
  rename(ZIPCODE = MODZCTA_2)
# Join with just st_join
covid_3_sf <- st_join(zip_codes_1, covid_3_sf)



# acs and census
acsData <- readLines("../assign8/R-Spatial_II_Lab/ACSDP5Y2018.DP05_data_with_overlays_2020-04-22T132935.csv") %>%
  magrittr::extract(-2) %>% 
  textConnection() %>%
  read.csv(header=TRUE, quote= "\"") %>%
  dplyr::select(GEO_ID, 
                totPop = DP05_0001E, elderlyPop = DP05_0024E, # >= 65
                malePop = DP05_0002E, femalePop = DP05_0003E,  
                whitePop = DP05_0037E, blackPop = DP05_0038E,
                asianPop = DP05_0067E, hispanicPop = DP05_0071E,
                adultPop = DP05_0021E, citizenAdult = DP05_0087E) %>%
  dplyr::mutate(censusCode = stringr::str_sub(GEO_ID, -9,-1));
nycCensus <- sf::st_read('../assign8/R-Spatial_II_Lab/2010 Census Tracts/geo_export_1dc7b645-647b-4806-b9a0-7b79660f120a.shp', stringsAsFactors = FALSE)
## Reading layer `geo_export_1dc7b645-647b-4806-b9a0-7b79660f120a' from data source `/Users/williamcornejo/Desktop/Desktop - william’s MacBook Air/school/gtech705/gtech78520/assign8/R-Spatial_II_Lab/2010 Census Tracts/geo_export_1dc7b645-647b-4806-b9a0-7b79660f120a.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 2165 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -74.25559 ymin: 40.49612 xmax: -73.70001 ymax: 40.91553
## Geodetic CRS:  WGS84(DD)
nycCensus %<>% dplyr::mutate(cntyFIPS = case_when(
  boro_name == 'Bronx' ~ '005',
  boro_name == 'Brooklyn' ~ '047',
  boro_name == 'Manhattan' ~ '061',
  boro_name == 'Queens' ~ '081',
  boro_name == 'Staten Island' ~ '085'),
  tractFIPS = paste(cntyFIPS, ct2010, sep='')
)
# Make new column from nycCensus$boroct201, where we add 1400000US3600 to it
# And name it GEO_ID, which is optional
acsData %>%
  magrittr::extract(1:10,)
##                  GEO_ID totPop elderlyPop malePop femalePop whitePop blackPop
## 1  1400000US36005000100   7080         51    6503       577     1773     4239
## 2  1400000US36005000200   4542        950    2264      2278     2165     1279
## 3  1400000US36005000400   5634        710    2807      2827     2623     1699
## 4  1400000US36005001600   5917        989    2365      3552     2406     2434
## 5  1400000US36005001900   2765         76    1363      1402      585     1041
## 6  1400000US36005002000   9409        977    4119      5290     3185     4487
## 7  1400000US36005002300   4600        648    2175      2425      479     2122
## 8  1400000US36005002400    172          0     121        51       69       89
## 9  1400000US36005002500   5887        548    2958      2929      903     1344
## 10 1400000US36005002701   2868        243    1259      1609      243      987
##    asianPop hispanicPop adultPop citizenAdult censusCode
## 1       130        2329     6909         6100  005000100
## 2       119        3367     3582         2952  005000200
## 3       226        3873     4507         4214  005000400
## 4        68        3603     4416         3851  005001600
## 5       130        1413     2008         1787  005001900
## 6        29        5905     6851         6170  005002000
## 7        27        2674     3498         3056  005002300
## 8        14           0      131           42  005002400
## 9        68        4562     4237         2722  005002500
## 10        0        1985     1848         1412  005002701
# Merge (JOIN) ACS data to the census tracts
popData <- merge(nycCensus, acsData, by.x ='tractFIPS', by.y = 'censusCode')

# Aggregate ACS to census
popData_1 <- st_transform(popData, 4326)
# Final dataframe with zipcodes, census tracts,
#c_final <- st_join(covid_3_sf_new_1, popData_1)

popData_2 <- st_join(zip_codes_1, popData_1)

task 2: Use ggplot2 and other ggplot-compatible packages to create a multi-map figure illustrating the possible relationship between COVID-19 confirmed cases or rate and another factor (e.g., the number of nursing homes, number of food stores, neighborhood racial composition, elderly population, etc.). The maps should be put side by side on one single page. Add graticule to at least one of those maps and label some of the feature on the map where applicable and appropriate.

#ggplot2
#ggplot(c_final) + geom_sf(aes(fill=COVID_CASE_RATE))
#pal_elderly <- colorQuantile("YlGnBu", 
#                        domain = c(min(acsCovidDat$eldrlyP, na.rm = T), max(acsCovidDat$eldrlyP, na.rm = T)),
#                        alpha = TRUE)
case_map <- ggplot() +
  geom_sf(data=covid_3_sf, aes(fill=COVID_CASE_RATE))+
  ggtitle("COVID-19 Case Rates") +
  coord_sf(datum = sf::st_crs(4326))+
  theme(
    axis.text = element_text(size = 10),
    axis.ticks = element_line(linewidth = 0.5),
  )
elderly_map <- ggplot() +
  geom_sf(data =popData_2, aes(fill=elderlyPop)) +
  ggtitle("Elderly Population") +
  coord_sf(datum = NA) 
#plot(c_final[c("COVID_CASE_RATE","elderlyPop")]) 

ggarrange(case_map, elderly_map, nrow = 1, ncol = 2, widths = c(1.5,1))
2 Plots

2 Plots

###task 3: Create a web-based interactive map for COVID-19 data using tmap, mapview, or leaflet package and save it as a HTML file.

library(tmap)
html_map <- tm_shape(covid_3_sf) +
  tm_polygons("COVID_CASE_RATE", 
              style="quantile", 
              title="Covid-19 Case Rate")
tmap_mode("view")
## tmap mode set to interactive viewing
html_map
# This works it just takes too long to run each time
#tmp <- tmap_leaflet(html_map)
#saveWidget(tmp, file = "covid_case_rate_map.html", 
#           selfcontained = TRUE,
#           title = "COVID-19 Interactive Map")
list.files()
## [1] "03-map-making.R"                         
## [2] "covid_case_rate_map_files"               
## [3] "lab_3_example.R"                         
## [4] "lab9_files"                              
## [5] "lab9.html"                               
## [6] "lab9.Rmd"                                
## [7] "rsconnect"                               
## [8] "Screen Shot 2025-03-29 at 8.00.01 PM.png"
knitr::include_graphics('Screen Shot 2025-03-29 at 8.00.01 PM.png')

# actually show html file