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=