Maps

#library(RColorBrewer) 
#library(leaflet)
#library(terra)
# for metadata/attributes- vectors or rasters
#library(raster)
library(sf)
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
#library(rnaturalearthdata)
#library(rnaturalearth)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#library(sp)
#library(leaflet)

df_simplified <- read_rds(here::here("data/processed/formaps.rds")) # org and shape data
neighborhoods <- read_rds(here::here("data/processed/neighborhood_shape_data.rds"))#neighborhood stat data (read into R)

Plot using plot() function

# Plotting simple features (sf) with plot 
plot(df_simplified$geometry.x)

plot(df_simplified$geometry.y)

Using ggplot2

Start by building the map area:

multi_polygon_sf <- st_as_sf(df_simplified) #converting to sf object
outline_plot <-ggplot() +
    geom_sf(data = multi_polygon_sf$geometry.y, fill = "lightblue", color = "blue") +
    theme_minimal() +
   labs(title = "Nonprofits and Neighborhood Demographics")
outline_plot

Neighborhood Demographics

# make data at neighborhood level to plot maps 
neighborhoods_sf <- st_as_sf(neighborhoods) # convert to sf object
neighborhoods_sf <- neighborhoods_sf %>% mutate(Percent_AA
  = round(Blk_AfAm/Population*100, digits = 2))  %>% # make our variables like before but this time at neighborhood level only

  # create new Majority_AA variable that indicates if Percent_AA is greater than 50% or not %>%
  mutate(Majority_AA = case_when(
    Percent_AA > 50 ~ "Yes", 
    Percent_AA <  50 ~ "No")) %>%
  # create a new variable about this in text
   mutate(Neighborhood_type = case_when(
    Percent_AA > 50 ~ "Majority\nBlack", 
    Percent_AA <  50 ~ "Majority\nNon-Black")) %>% 
  # make this a factor and order by level appearance in the data
  mutate(Neighborhood_type = as_factor(Neighborhood_type),
         Neighborhood_type = forcats::fct_inorder(Neighborhood_type))


 neighborhood_dem <- ggplot() +geom_sf(data = neighborhoods_sf, aes(fill = Neighborhood_type))+
   scale_fill_manual(values = c("Majority\nBlack" = "#482677FF", "Majority\nNon-Black" = "#20A387FF"))+
    theme_minimal()
 neighborhood_dem

Map of High vs Low Asset Orgs

asset_plot_high_Vs_low <- neighborhood_dem + 
    geom_sf(data = multi_polygon_sf, alpha = 0.8, shape = 21, color ="black", fill = "#DCE319FF")+ facet_grid(~ASSET_High_text)+
    theme_void() +
     labs(title = "High vs Low Asset Non-Profits in Baltimore") 


asset_plot_high_Vs_low

Map of different types of orgs by asset

asset_plot_all_faceted <- neighborhood_dem + 
    geom_sf(data = multi_polygon_sf, alpha = 0.8, shape = 21, color ="black", fill = "#DCE319FF")+ facet_wrap(~NTEE_text, ncol = 3 )+
    theme_void() +
  labs(title = "Non-Profits in Baltimore by Type") 
asset_plot_all_faceted

High Asset Non-Profits in Baltimore by Type

data_to_map <-multi_polygon_sf %>% filter(ASSET_High_text == "High Asset") 

asset_plot <- neighborhood_dem + 
    geom_sf(data = data_to_map, alpha = 0.8, shape = 21, color ="black", fill = "#DCE319FF")+ facet_wrap(~NTEE_text, ncol = 3 )+
    theme_void() +
  labs(title = "High Asset Non-Profits in Baltimore by Type") 
asset_plot

CiMgTWFwcwoKYGBge3J9CgojbGlicmFyeShSQ29sb3JCcmV3ZXIpIAojbGlicmFyeShsZWFmbGV0KQojbGlicmFyeSh0ZXJyYSkKIyBmb3IgbWV0YWRhdGEvYXR0cmlidXRlcy0gdmVjdG9ycyBvciByYXN0ZXJzCiNsaWJyYXJ5KHJhc3RlcikKbGlicmFyeShzZikKI2xpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpCiNsaWJyYXJ5KHJuYXR1cmFsZWFydGgpCmxpYnJhcnkodGlkeXZlcnNlKQojbGlicmFyeShzcCkKI2xpYnJhcnkobGVhZmxldCkKCmRmX3NpbXBsaWZpZWQgPC0gcmVhZF9yZHMoaGVyZTo6aGVyZSgiZGF0YS9wcm9jZXNzZWQvZm9ybWFwcy5yZHMiKSkgIyBvcmcgYW5kIHNoYXBlIGRhdGEKbmVpZ2hib3Job29kcyA8LSByZWFkX3JkcyhoZXJlOjpoZXJlKCJkYXRhL3Byb2Nlc3NlZC9uZWlnaGJvcmhvb2Rfc2hhcGVfZGF0YS5yZHMiKSkjbmVpZ2hib3Job29kIHN0YXQgZGF0YSAocmVhZCBpbnRvIFIpCgpgYGAKCgojIFBsb3QgdXNpbmcgYHBsb3QoKWAgZnVuY3Rpb24KCmBgYHtyfQojIFBsb3R0aW5nIHNpbXBsZSBmZWF0dXJlcyAoc2YpIHdpdGggcGxvdCAKcGxvdChkZl9zaW1wbGlmaWVkJGdlb21ldHJ5LngpCnBsb3QoZGZfc2ltcGxpZmllZCRnZW9tZXRyeS55KQoKYGBgCgoKCiMgVXNpbmcgZ2dwbG90MgoKU3RhcnQgYnkgYnVpbGRpbmcgdGhlIG1hcCBhcmVhOgoKYGBge3J9Cm11bHRpX3BvbHlnb25fc2YgPC0gc3RfYXNfc2YoZGZfc2ltcGxpZmllZCkgI2NvbnZlcnRpbmcgdG8gc2Ygb2JqZWN0Cm91dGxpbmVfcGxvdCA8LWdncGxvdCgpICsKICAgIGdlb21fc2YoZGF0YSA9IG11bHRpX3BvbHlnb25fc2YkZ2VvbWV0cnkueSwgZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibHVlIikgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgbGFicyh0aXRsZSA9ICJOb25wcm9maXRzIGFuZCBOZWlnaGJvcmhvb2QgRGVtb2dyYXBoaWNzIikKb3V0bGluZV9wbG90CgpgYGAKCiMgTmVpZ2hib3Job29kIERlbW9ncmFwaGljcwoKYGBge3J9CgojIG1ha2UgZGF0YSBhdCBuZWlnaGJvcmhvb2QgbGV2ZWwgdG8gcGxvdCBtYXBzIApuZWlnaGJvcmhvb2RzX3NmIDwtIHN0X2FzX3NmKG5laWdoYm9yaG9vZHMpICMgY29udmVydCB0byBzZiBvYmplY3QKbmVpZ2hib3Job29kc19zZiA8LSBuZWlnaGJvcmhvb2RzX3NmICU+JSBtdXRhdGUoUGVyY2VudF9BQQogID0gcm91bmQoQmxrX0FmQW0vUG9wdWxhdGlvbioxMDAsIGRpZ2l0cyA9IDIpKSAgJT4lICMgbWFrZSBvdXIgdmFyaWFibGVzIGxpa2UgYmVmb3JlIGJ1dCB0aGlzIHRpbWUgYXQgbmVpZ2hib3Job29kIGxldmVsIG9ubHkKCiAgIyBjcmVhdGUgbmV3IE1ham9yaXR5X0FBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGlmIFBlcmNlbnRfQUEgaXMgZ3JlYXRlciB0aGFuIDUwJSBvciBub3QgJT4lCiAgbXV0YXRlKE1ham9yaXR5X0FBID0gY2FzZV93aGVuKAogICAgUGVyY2VudF9BQSA+IDUwIH4gIlllcyIsIAogICAgUGVyY2VudF9BQSA8ICA1MCB+ICJObyIpKSAlPiUKICAjIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSBhYm91dCB0aGlzIGluIHRleHQKICAgbXV0YXRlKE5laWdoYm9yaG9vZF90eXBlID0gY2FzZV93aGVuKAogICAgUGVyY2VudF9BQSA+IDUwIH4gIk1ham9yaXR5XG5CbGFjayIsIAogICAgUGVyY2VudF9BQSA8ICA1MCB+ICJNYWpvcml0eVxuTm9uLUJsYWNrIikpICU+JSAKICAjIG1ha2UgdGhpcyBhIGZhY3RvciBhbmQgb3JkZXIgYnkgbGV2ZWwgYXBwZWFyYW5jZSBpbiB0aGUgZGF0YQogIG11dGF0ZShOZWlnaGJvcmhvb2RfdHlwZSA9IGFzX2ZhY3RvcihOZWlnaGJvcmhvb2RfdHlwZSksCiAgICAgICAgIE5laWdoYm9yaG9vZF90eXBlID0gZm9yY2F0czo6ZmN0X2lub3JkZXIoTmVpZ2hib3Job29kX3R5cGUpKQoKCiBuZWlnaGJvcmhvb2RfZGVtIDwtIGdncGxvdCgpICtnZW9tX3NmKGRhdGEgPSBuZWlnaGJvcmhvb2RzX3NmLCBhZXMoZmlsbCA9IE5laWdoYm9yaG9vZF90eXBlKSkrCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk1ham9yaXR5XG5CbGFjayIgPSAiIzQ4MjY3N0ZGIiwgIk1ham9yaXR5XG5Ob24tQmxhY2siID0gIiMyMEEzODdGRiIpKSsKICAgIHRoZW1lX21pbmltYWwoKQogbmVpZ2hib3Job29kX2RlbQoKYGBgCgoKIyBNYXAgb2YgSGlnaCB2cyBMb3cgQXNzZXQgT3JncwoKCmBgYHtyfQphc3NldF9wbG90X2hpZ2hfVnNfbG93IDwtIG5laWdoYm9yaG9vZF9kZW0gKyAKICAgIGdlb21fc2YoZGF0YSA9IG11bHRpX3BvbHlnb25fc2YsIGFscGhhID0gMC44LCBzaGFwZSA9IDIxLCBjb2xvciA9ImJsYWNrIiwgZmlsbCA9ICIjRENFMzE5RkYiKSsgZmFjZXRfZ3JpZCh+QVNTRVRfSGlnaF90ZXh0KSsKICAgIHRoZW1lX3ZvaWQoKSArCiAgICAgbGFicyh0aXRsZSA9ICJIaWdoIHZzIExvdyBBc3NldCBOb24tUHJvZml0cyBpbiBCYWx0aW1vcmUiKSAKCgphc3NldF9wbG90X2hpZ2hfVnNfbG93CgpgYGAKCgojIE1hcCBvZiBkaWZmZXJlbnQgdHlwZXMgb2Ygb3JncyBieSBhc3NldApgYGB7cn0KCmFzc2V0X3Bsb3RfYWxsX2ZhY2V0ZWQgPC0gbmVpZ2hib3Job29kX2RlbSArIAogICAgZ2VvbV9zZihkYXRhID0gbXVsdGlfcG9seWdvbl9zZiwgYWxwaGEgPSAwLjgsIHNoYXBlID0gMjEsIGNvbG9yID0iYmxhY2siLCBmaWxsID0gIiNEQ0UzMTlGRiIpKyBmYWNldF93cmFwKH5OVEVFX3RleHQsIG5jb2wgPSAzICkrCiAgICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiTm9uLVByb2ZpdHMgaW4gQmFsdGltb3JlIGJ5IFR5cGUiKSAKYXNzZXRfcGxvdF9hbGxfZmFjZXRlZApgYGAKCiMgSGlnaCBBc3NldCBOb24tUHJvZml0cyBpbiBCYWx0aW1vcmUgYnkgVHlwZQoKYGBge3J9CmRhdGFfdG9fbWFwIDwtbXVsdGlfcG9seWdvbl9zZiAlPiUgZmlsdGVyKEFTU0VUX0hpZ2hfdGV4dCA9PSAiSGlnaCBBc3NldCIpIAoKYXNzZXRfcGxvdCA8LSBuZWlnaGJvcmhvb2RfZGVtICsgCiAgICBnZW9tX3NmKGRhdGEgPSBkYXRhX3RvX21hcCwgYWxwaGEgPSAwLjgsIHNoYXBlID0gMjEsIGNvbG9yID0iYmxhY2siLCBmaWxsID0gIiNEQ0UzMTlGRiIpKyBmYWNldF93cmFwKH5OVEVFX3RleHQsIG5jb2wgPSAzICkrCiAgICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiSGlnaCBBc3NldCBOb24tUHJvZml0cyBpbiBCYWx0aW1vcmUgYnkgVHlwZSIpIAphc3NldF9wbG90CmBgYAoKCgo=