diff --git a/README.md b/README.md index 40491eb..336561a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ module-1-cartography =========================================================== -[![](https://img.shields.io/badge/semester-spring%2021-blue.svg)](https://github.com/slu-soc5650/module-1-cartography) +[![](https://img.shields.io/badge/semester-spring%2022-blue.svg)](https://github.com/slu-soc5650/module-1-cartography) [![](https://img.shields.io/badge/release-full-brightgreen.svg)](https://github.com/slu-soc5650/module-1-cartography) [![](https://img.shields.io/github/release/slu-soc5650/module-1-cartography.svg?label=version)](https://github.com/slu-soc5650/module-1-cartography/releases) [![](https://img.shields.io/github/last-commit/slu-soc5650/module-1-cartography.svg)](https://github.com/slu-soc5650/module-1-cartography/commits/master) [![](https://img.shields.io/github/repo-size/slu-soc5650/module-1-cartography.svg)](https://github.com/slu-soc5650/module-1-cartography) ## Module 1 - Course Introduction -These materials correspond to the third course meeting of SOC 4650 and SOC 5650. +These materials correspond to Meeting 1-2 for SOC 4650 and SOC 5650. ## Lesson Quick Start ### Install Software diff --git a/assignments/lab-03-replication/docs/lab-03-replication.nb.html b/assignments/lab-03-replication/docs/lab-03-replication.nb.html deleted file mode 100644 index 7654f97..0000000 --- a/assignments/lab-03-replication/docs/lab-03-replication.nb.html +++ /dev/null @@ -1,477 +0,0 @@ - - - - - - - - - - - - - - -Lab-03 Replication - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
-

Introduction

-

This notebook provides a replication of Lab-03.

-
-
-

Dependencies

-

This notebook requires the following packages:

- - - -
# tidyverse packages
-library(ggplot2)       # static mapping
- - -
Need help? Try Stackoverflow: https://stackoverflow.com/tags/ggplot2
- - -
# mapping packages
-library(mapview)      # preview spatial data
- - -
Registered S3 method overwritten by 'htmlwidgets':
-  method           from         
-  print.htmlwidget tools:rstudio
-GDAL version >= 3.1.0 | setting mapviewOptions(fgb = TRUE)
- - -
library(sf)           # spatial tools
- - -
Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1
- - -
# other packages
-library(here)         # file path management
- - -
here() starts at /Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication
- - -
library(RColorBrewer) # color brewer palettes
-library(viridis)      # viridis color palettes
- - -
Loading required package: viridisLite
- - - -

We’ll also need a custom function that Chris has written for creating map breaks:

- - - -
source(here("source", "map_breaks.R"))
- - - -
-
-

Load Data

-

The data for this assigment are all in the data/ folder, and include a number of different layers:

- - - -
# city boundary
-stl_boundary <- st_read(here("data", "STL_BOUNDARY_City.geojson"))
- - -
Reading layer `STL_BOUNDARY_City' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_BOUNDARY_City.geojson' using driver `GeoJSON'
-Simple feature collection with 1 feature and 2 fields
-geometry type:  MULTIPOLYGON
-dimension:      XY
-bbox:           xmin: 733360 ymin: 4268394 xmax: 746157.1 ymax: 4295511
-projected CRS:  NAD83 / UTM zone 15N
- - -
# water layers
-il_hydro <- st_read(here("data", "IL_HYDRO_Mississippi.geojson"))
- - -
Reading layer `IL_HYDRO_Mississippi' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/IL_HYDRO_Mississippi.geojson' using driver `GeoJSON'
-Simple feature collection with 4 features and 8 fields
-geometry type:  POLYGON
-dimension:      XY
-bbox:           xmin: 739063 ymin: 4268279 xmax: 746617.9 ymax: 4295339
-projected CRS:  NAD83 / UTM zone 15N
- - -
stl_hydro <- st_read(here("data", "STL_HYDRO_AreaWater.geojson"))
- - -
Reading layer `STL_HYDRO_AreaWater' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_HYDRO_AreaWater.geojson' using driver `GeoJSON'
-Simple feature collection with 16 features and 2 fields
-geometry type:  POLYGON
-dimension:      XY
-bbox:           xmin: 733468.5 ymin: 4268394 xmax: 746157.1 ymax: 4295418
-projected CRS:  NAD83 / UTM zone 15N
- - -
# highways
-highways <- st_read(here("data", "STL_TRANS_PrimaryRoads", "STL_TRANS_PrimaryRoads.shp"))
- - -
Reading layer `STL_TRANS_PrimaryRoads' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp' using driver `ESRI Shapefile'
-Simple feature collection with 9 features and 4 fields
-geometry type:  MULTILINESTRING
-dimension:      XY
-bbox:           xmin: 733482 ymin: 4270554 xmax: 745666.9 ymax: 4294751
-projected CRS:  NAD83 / UTM zone 15N
- - -
# owner occupied housing
-housing <- st_read(here("data", "STL_HOUSING_OwnerOccupied.geojson"))
- - -
Reading layer `STL_HOUSING_OwnerOccupied' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_HOUSING_OwnerOccupied.geojson' using driver `GeoJSON'
-Simple feature collection with 106 features and 5 fields
-geometry type:  MULTIPOLYGON
-dimension:      XY
-bbox:           xmin: 733360 ymin: 4268410 xmax: 746170.8 ymax: 4295511
-projected CRS:  NAD83 / UTM zone 15N
- - - -

We’re now ready to map these data.

-
-
-

Part 1 - Exploration

-

In my console, I’ve used mapview::mapview() to explore each of these different data sets. All are polygon data except for the highways, which are line data.

-
-
-

Part 2 - Mapping

-

The following code chunk creates map breaks using the “fisher” approach, and then layers data on water features and highways over the census tracts showing the percent of homes that are occupied by their owners.

- - - -
## create breaks
-housing <- map_breaks(housing, var = "pct_owner_occupied", newvar = "map_breaks",
-                    style = "fisher", classes = 5, dig_lab = 2)
-
-## map binned data
-p1 <- ggplot() +
-  geom_sf(data = stl_boundary, fill = "#ffffff", color = NA) +
-  geom_sf(data = housing, mapping = aes(fill = map_breaks)) +
-  geom_sf(data = il_hydro, fill = "#d4f1f9") +
-  geom_sf(data = stl_hydro, fill = "#d4f1f9") +
-  geom_sf(data = highways, color = "#000000") +
-  geom_sf(data = stl_boundary, fill = NA, color = "#2a2a2a", size = .6) +
-  scale_fill_brewer(palette = "Greens", name = "% Owner Occupied") +
-  labs(
-    title = "% of Housing Occupied by Homeowners",
-    subtitle = "City of St. Louis, 2010",
-    caption = "Data via U.S. Census Bureau\nMap by Christopher Prener, PhD"
-  )
-
-p1
- - - -

The map shows that owner occupied rates are highest in the southwest portion of St. Louis. We’ll save it using the following code:

- - - -
ggsave(plot = p1, filename = here("results", "owner_occupied_housing.png"))
- - - -

The map is now saved for dissemination!

- -
- -
LS0tCnRpdGxlOiAiTGFiLTAzIFJlcGxpY2F0aW9uIgphdXRob3I6ICJDaHJpc3RvcGhlciBQcmVuZXIsIFBoLkQuIgpkYXRlOiAnKGByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZIilgKScKb3V0cHV0OiAKICBnaXRodWJfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0IAphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKIyMgSW50cm9kdWN0aW9uClRoaXMgbm90ZWJvb2sgcHJvdmlkZXMgYSByZXBsaWNhdGlvbiBvZiBMYWItMDMuCgojIyBEZXBlbmRlbmNpZXMKVGhpcyBub3RlYm9vayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgoKYGBge3IgbG9hZC1wYWNrYWdlc30KIyB0aWR5dmVyc2UgcGFja2FnZXMKbGlicmFyeShnZ3Bsb3QyKSAgICAgICAjIHN0YXRpYyBtYXBwaW5nCgojIG1hcHBpbmcgcGFja2FnZXMKbGlicmFyeShtYXB2aWV3KSAgICAgICMgcHJldmlldyBzcGF0aWFsIGRhdGEKbGlicmFyeShzZikgICAgICAgICAgICMgc3BhdGlhbCB0b29scwoKIyBvdGhlciBwYWNrYWdlcwpsaWJyYXJ5KGhlcmUpICAgICAgICAgIyBmaWxlIHBhdGggbWFuYWdlbWVudApsaWJyYXJ5KFJDb2xvckJyZXdlcikgIyBjb2xvciBicmV3ZXIgcGFsZXR0ZXMKbGlicmFyeSh2aXJpZGlzKSAgICAgICMgdmlyaWRpcyBjb2xvciBwYWxldHRlcwpgYGAKCldlJ2xsIGFsc28gbmVlZCBhIGN1c3RvbSBmdW5jdGlvbiB0aGF0IENocmlzIGhhcyB3cml0dGVuIGZvciBjcmVhdGluZyBtYXAgYnJlYWtzOiAKCmBgYHtyIGxvYWQtZnVuY3Rpb25zfQpzb3VyY2UoaGVyZSgic291cmNlIiwgIm1hcF9icmVha3MuUiIpKQpgYGAKCiMjIExvYWQgRGF0YQpUaGUgZGF0YSBmb3IgdGhpcyBhc3NpZ21lbnQgYXJlIGFsbCBpbiB0aGUgYGRhdGEvYCBmb2xkZXIsIGFuZCBpbmNsdWRlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBsYXllcnM6CgpgYGB7ciBsb2FkLWRhdGF9CiMgY2l0eSBib3VuZGFyeQpzdGxfYm91bmRhcnkgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgIlNUTF9CT1VOREFSWV9DaXR5Lmdlb2pzb24iKSkKCiMgd2F0ZXIgbGF5ZXJzCmlsX2h5ZHJvIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJJTF9IWURST19NaXNzaXNzaXBwaS5nZW9qc29uIikpCnN0bF9oeWRybyA8LSBzdF9yZWFkKGhlcmUoImRhdGEiLCAiU1RMX0hZRFJPX0FyZWFXYXRlci5nZW9qc29uIikpCgojIGhpZ2h3YXlzCmhpZ2h3YXlzIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJTVExfVFJBTlNfUHJpbWFyeVJvYWRzIiwgIlNUTF9UUkFOU19QcmltYXJ5Um9hZHMuc2hwIikpCgojIG93bmVyIG9jY3VwaWVkIGhvdXNpbmcKaG91c2luZyA8LSBzdF9yZWFkKGhlcmUoImRhdGEiLCAiU1RMX0hPVVNJTkdfT3duZXJPY2N1cGllZC5nZW9qc29uIikpCmBgYAoKV2UncmUgbm93IHJlYWR5IHRvIG1hcCB0aGVzZSBkYXRhLgoKIyMgUGFydCAxIC0gRXhwbG9yYXRpb24KSW4gbXkgY29uc29sZSwgSSd2ZSB1c2VkIGBtYXB2aWV3OjptYXB2aWV3KClgIHRvIGV4cGxvcmUgZWFjaCBvZiB0aGVzZSBkaWZmZXJlbnQgZGF0YSBzZXRzLiBBbGwgYXJlIHBvbHlnb24gZGF0YSBleGNlcHQgZm9yIHRoZSBoaWdod2F5cywgd2hpY2ggYXJlIGxpbmUgZGF0YS4KCiMjIFBhcnQgMiAtIE1hcHBpbmcKVGhlIGZvbGxvd2luZyBjb2RlIGNodW5rIGNyZWF0ZXMgbWFwIGJyZWFrcyB1c2luZyB0aGUgImZpc2hlciIgYXBwcm9hY2gsIGFuZCB0aGVuIGxheWVycyBkYXRhIG9uIHdhdGVyIGZlYXR1cmVzIGFuZCBoaWdod2F5cyBvdmVyIHRoZSBjZW5zdXMgdHJhY3RzIHNob3dpbmcgdGhlIHBlcmNlbnQgb2YgaG9tZXMgdGhhdCBhcmUgb2NjdXBpZWQgYnkgdGhlaXIgb3duZXJzLiAKCmBgYHtyLCBob3VzaW5nLW1hcH0KIyMgY3JlYXRlIGJyZWFrcwpob3VzaW5nIDwtIG1hcF9icmVha3MoaG91c2luZywgdmFyID0gInBjdF9vd25lcl9vY2N1cGllZCIsIG5ld3ZhciA9ICJtYXBfYnJlYWtzIiwKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9ICJmaXNoZXIiLCBjbGFzc2VzID0gNSwgZGlnX2xhYiA9IDIpCgojIyBtYXAgYmlubmVkIGRhdGEKcDEgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHN0bF9ib3VuZGFyeSwgZmlsbCA9ICIjZmZmZmZmIiwgY29sb3IgPSBOQSkgKwogIGdlb21fc2YoZGF0YSA9IGhvdXNpbmcsIG1hcHBpbmcgPSBhZXMoZmlsbCA9IG1hcF9icmVha3MpKSArCiAgZ2VvbV9zZihkYXRhID0gaWxfaHlkcm8sIGZpbGwgPSAiI2Q0ZjFmOSIpICsKICBnZW9tX3NmKGRhdGEgPSBzdGxfaHlkcm8sIGZpbGwgPSAiI2Q0ZjFmOSIpICsKICBnZW9tX3NmKGRhdGEgPSBoaWdod2F5cywgY29sb3IgPSAiIzAwMDAwMCIpICsKICBnZW9tX3NmKGRhdGEgPSBzdGxfYm91bmRhcnksIGZpbGwgPSBOQSwgY29sb3IgPSAiIzJhMmEyYSIsIHNpemUgPSAuNikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiR3JlZW5zIiwgbmFtZSA9ICIlIE93bmVyIE9jY3VwaWVkIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICIlIG9mIEhvdXNpbmcgT2NjdXBpZWQgYnkgSG9tZW93bmVycyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcywgMjAxMCIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIFUuUy4gQ2Vuc3VzIEJ1cmVhdVxuTWFwIGJ5IENocmlzdG9waGVyIFByZW5lciwgUGhEIgogICkKCnAxCmBgYAoKVGhlIG1hcCBzaG93cyB0aGF0IG93bmVyIG9jY3VwaWVkIHJhdGVzIGFyZSBoaWdoZXN0IGluIHRoZSBzb3V0aHdlc3QgcG9ydGlvbiBvZiBTdC4gTG91aXMuIFdlJ2xsIHNhdmUgaXQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlOgoKYGBge3IsIHNhdmUtcGxvdH0KZ2dzYXZlKHBsb3QgPSBwMSwgZmlsZW5hbWUgPSBoZXJlKCJyZXN1bHRzIiwgIm93bmVyX29jY3VwaWVkX2hvdXNpbmcucG5nIikpCmBgYAoKVGhlIG1hcCBpcyBub3cgc2F2ZWQgZm9yIGRpc3NlbWluYXRpb24hCg==
- - - -
- - - - - - - - - - - - - - - - diff --git a/assignments/lab-03-replication/README.md b/assignments/lab-1-3-replication/README.md similarity index 100% rename from assignments/lab-03-replication/README.md rename to assignments/lab-1-3-replication/README.md diff --git a/assignments/lab-03-replication/data/IL_HYDRO_Mississippi.geojson b/assignments/lab-1-3-replication/data/IL_HYDRO_Mississippi.geojson similarity index 100% rename from assignments/lab-03-replication/data/IL_HYDRO_Mississippi.geojson rename to assignments/lab-1-3-replication/data/IL_HYDRO_Mississippi.geojson diff --git a/assignments/lab-03-replication/data/STL_BOUNDARY_City.geojson b/assignments/lab-1-3-replication/data/STL_BOUNDARY_City.geojson similarity index 100% rename from assignments/lab-03-replication/data/STL_BOUNDARY_City.geojson rename to assignments/lab-1-3-replication/data/STL_BOUNDARY_City.geojson diff --git a/assignments/lab-03-replication/data/STL_HOUSING_OwnerOccupied.geojson b/assignments/lab-1-3-replication/data/STL_HOUSING_OwnerOccupied.geojson similarity index 100% rename from assignments/lab-03-replication/data/STL_HOUSING_OwnerOccupied.geojson rename to assignments/lab-1-3-replication/data/STL_HOUSING_OwnerOccupied.geojson diff --git a/assignments/lab-03-replication/data/STL_HYDRO_AreaWater.geojson b/assignments/lab-1-3-replication/data/STL_HYDRO_AreaWater.geojson similarity index 100% rename from assignments/lab-03-replication/data/STL_HYDRO_AreaWater.geojson rename to assignments/lab-1-3-replication/data/STL_HYDRO_AreaWater.geojson diff --git a/assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.dbf b/assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.dbf similarity index 100% rename from assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.dbf rename to assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.dbf diff --git a/assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.prj b/assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.prj similarity index 100% rename from assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.prj rename to assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.prj diff --git a/assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp b/assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp similarity index 100% rename from assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp rename to assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp diff --git a/assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shx b/assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shx similarity index 100% rename from assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shx rename to assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shx diff --git a/assignments/lab-03-replication/docs/lab-03-replication.Rmd b/assignments/lab-1-3-replication/docs/lab-1-3-replication.Rmd similarity index 97% rename from assignments/lab-03-replication/docs/lab-03-replication.Rmd rename to assignments/lab-1-3-replication/docs/lab-1-3-replication.Rmd index 983be32..dda58c7 100644 --- a/assignments/lab-03-replication/docs/lab-03-replication.Rmd +++ b/assignments/lab-1-3-replication/docs/lab-1-3-replication.Rmd @@ -1,5 +1,5 @@ --- -title: "Lab-03 Replication" +title: "Lab 1-3 Replication" author: "Christopher Prener, Ph.D." date: '(`r format(Sys.time(), "%B %d, %Y")`)' output: @@ -9,7 +9,7 @@ always_allow_html: yes --- ## Introduction -This notebook provides a replication of Lab-03. +This notebook provides a replication of Lab 1-3. ## Dependencies This notebook requires the following packages: diff --git a/assignments/lab-03-replication/docs/lab-03-replication.md b/assignments/lab-1-3-replication/docs/lab-1-3-replication.md similarity index 56% rename from assignments/lab-03-replication/docs/lab-03-replication.md rename to assignments/lab-1-3-replication/docs/lab-1-3-replication.md index 2be04de..6a4da45 100644 --- a/assignments/lab-03-replication/docs/lab-03-replication.md +++ b/assignments/lab-1-3-replication/docs/lab-1-3-replication.md @@ -1,11 +1,11 @@ -Lab-03 Replication +Lab 1-3 Replication ================ Christopher Prener, Ph.D. -(February 15, 2021) +(February 07, 2022) ## Introduction -This notebook provides a replication of Lab-03. +This notebook provides a replication of Lab 1-3. ## Dependencies @@ -14,25 +14,25 @@ This notebook requires the following packages: ``` r # tidyverse packages library(ggplot2) # static mapping - -# mapping packages -library(mapview) # preview spatial data ``` - ## GDAL version >= 3.1.0 | setting mapviewOptions(fgb = TRUE) + ## Warning in register(): Can't find generic `scale_type` in package ggplot2 to + ## register S3 method. ``` r +# mapping packages +library(mapview) # preview spatial data library(sf) # spatial tools ``` - ## Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1 + ## Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE ``` r # other packages library(here) # file path management ``` - ## here() starts at /Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication + ## here() starts at /Users/prenercg/GitHub/slu-soc5650/module-1-cartography/assignments/lab-1-3-replication ``` r library(RColorBrewer) # color brewer palettes @@ -58,59 +58,69 @@ number of different layers: stl_boundary <- st_read(here("data", "STL_BOUNDARY_City.geojson")) ``` - ## Reading layer `STL_BOUNDARY_City' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_BOUNDARY_City.geojson' using driver `GeoJSON' + ## Reading layer `STL_BOUNDARY_City' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/assignments/lab-1-3-replication/data/STL_BOUNDARY_City.geojson' + ## using driver `GeoJSON' ## Simple feature collection with 1 feature and 2 fields - ## geometry type: MULTIPOLYGON - ## dimension: XY - ## bbox: xmin: 733360 ymin: 4268394 xmax: 746157.1 ymax: 4295511 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: MULTIPOLYGON + ## Dimension: XY + ## Bounding box: xmin: 733360 ymin: 4268394 xmax: 746157.1 ymax: 4295511 + ## Projected CRS: NAD83 / UTM zone 15N ``` r # water layers il_hydro <- st_read(here("data", "IL_HYDRO_Mississippi.geojson")) ``` - ## Reading layer `IL_HYDRO_Mississippi' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/IL_HYDRO_Mississippi.geojson' using driver `GeoJSON' + ## Reading layer `IL_HYDRO_Mississippi' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/assignments/lab-1-3-replication/data/IL_HYDRO_Mississippi.geojson' + ## using driver `GeoJSON' ## Simple feature collection with 4 features and 8 fields - ## geometry type: POLYGON - ## dimension: XY - ## bbox: xmin: 739063 ymin: 4268279 xmax: 746617.9 ymax: 4295339 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: POLYGON + ## Dimension: XY + ## Bounding box: xmin: 739063 ymin: 4268279 xmax: 746617.9 ymax: 4295339 + ## Projected CRS: NAD83 / UTM zone 15N ``` r stl_hydro <- st_read(here("data", "STL_HYDRO_AreaWater.geojson")) ``` - ## Reading layer `STL_HYDRO_AreaWater' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_HYDRO_AreaWater.geojson' using driver `GeoJSON' + ## Reading layer `STL_HYDRO_AreaWater' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/assignments/lab-1-3-replication/data/STL_HYDRO_AreaWater.geojson' + ## using driver `GeoJSON' ## Simple feature collection with 16 features and 2 fields - ## geometry type: POLYGON - ## dimension: XY - ## bbox: xmin: 733468.5 ymin: 4268394 xmax: 746157.1 ymax: 4295418 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: POLYGON + ## Dimension: XY + ## Bounding box: xmin: 733468.5 ymin: 4268394 xmax: 746157.1 ymax: 4295418 + ## Projected CRS: NAD83 / UTM zone 15N ``` r # highways highways <- st_read(here("data", "STL_TRANS_PrimaryRoads", "STL_TRANS_PrimaryRoads.shp")) ``` - ## Reading layer `STL_TRANS_PrimaryRoads' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp' using driver `ESRI Shapefile' + ## Reading layer `STL_TRANS_PrimaryRoads' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/assignments/lab-1-3-replication/data/STL_TRANS_PrimaryRoads/STL_TRANS_PrimaryRoads.shp' + ## using driver `ESRI Shapefile' ## Simple feature collection with 9 features and 4 fields - ## geometry type: MULTILINESTRING - ## dimension: XY - ## bbox: xmin: 733482 ymin: 4270554 xmax: 745666.9 ymax: 4294751 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: MULTILINESTRING + ## Dimension: XY + ## Bounding box: xmin: 733482 ymin: 4270554 xmax: 745666.9 ymax: 4294751 + ## Projected CRS: NAD83 / UTM zone 15N ``` r # owner occupied housing housing <- st_read(here("data", "STL_HOUSING_OwnerOccupied.geojson")) ``` - ## Reading layer `STL_HOUSING_OwnerOccupied' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/assignments/lab-03-replication/data/STL_HOUSING_OwnerOccupied.geojson' using driver `GeoJSON' + ## Reading layer `STL_HOUSING_OwnerOccupied' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/assignments/lab-1-3-replication/data/STL_HOUSING_OwnerOccupied.geojson' + ## using driver `GeoJSON' ## Simple feature collection with 106 features and 5 fields - ## geometry type: MULTIPOLYGON - ## dimension: XY - ## bbox: xmin: 733360 ymin: 4268410 xmax: 746170.8 ymax: 4295511 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: MULTIPOLYGON + ## Dimension: XY + ## Bounding box: xmin: 733360 ymin: 4268410 xmax: 746170.8 ymax: 4295511 + ## Projected CRS: NAD83 / UTM zone 15N We’re now ready to map these data. @@ -149,7 +159,7 @@ p1 <- ggplot() + p1 ``` -![](lab-03-replication_files/figure-gfm/housing-map-1.png) +![](lab-1-3-replication_files/figure-gfm/housing-map-1.png) The map shows that owner occupied rates are highest in the southwest portion of St. Louis. We’ll save it using the following code: diff --git a/assignments/lab-1-3-replication/docs/lab-1-3-replication.nb.html b/assignments/lab-1-3-replication/docs/lab-1-3-replication.nb.html new file mode 100644 index 0000000..f4b7047 --- /dev/null +++ b/assignments/lab-1-3-replication/docs/lab-1-3-replication.nb.html @@ -0,0 +1,1939 @@ + + + + + + + + + + + + + + +Lab 1-3 Replication + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+

Introduction

+

This notebook provides a replication of Lab 1-3.

+
+
+

Dependencies

+

This notebook requires the following packages:

+ + + +
# tidyverse packages
+library(ggplot2)       # static mapping
+
+# mapping packages
+library(mapview)      # preview spatial data
+library(sf)           # spatial tools
+
+# other packages
+library(here)         # file path management
+library(RColorBrewer) # color brewer palettes
+library(viridis)      # viridis color palettes
+ + + +

We’ll also need a custom function that Chris has written for creating +map breaks:

+ + + +
source(here("source", "map_breaks.R"))
+ + + +
+
+

Load Data

+

The data for this assigment are all in the data/ folder, +and include a number of different layers:

+ + + +
# city boundary
+stl_boundary <- st_read(here("data", "STL_BOUNDARY_City.geojson"))
+
+# water layers
+il_hydro <- st_read(here("data", "IL_HYDRO_Mississippi.geojson"))
+stl_hydro <- st_read(here("data", "STL_HYDRO_AreaWater.geojson"))
+
+# highways
+highways <- st_read(here("data", "STL_TRANS_PrimaryRoads", "STL_TRANS_PrimaryRoads.shp"))
+
+# owner occupied housing
+housing <- st_read(here("data", "STL_HOUSING_OwnerOccupied.geojson"))
+ + + +

We’re now ready to map these data.

+
+
+

Part 1 - Exploration

+

In my console, I’ve used mapview::mapview() to explore +each of these different data sets. All are polygon data except for the +highways, which are line data.

+
+
+

Part 2 - Mapping

+

The following code chunk creates map breaks using the “fisher” +approach, and then layers data on water features and highways over the +census tracts showing the percent of homes that are occupied by their +owners.

+ + + +
## create breaks
+housing <- map_breaks(housing, var = "pct_owner_occupied", newvar = "map_breaks",
+                    style = "fisher", classes = 5, dig_lab = 2)
+
+## map binned data
+p1 <- ggplot() +
+  geom_sf(data = stl_boundary, fill = "#ffffff", color = NA) +
+  geom_sf(data = housing, mapping = aes(fill = map_breaks)) +
+  geom_sf(data = il_hydro, fill = "#d4f1f9") +
+  geom_sf(data = stl_hydro, fill = "#d4f1f9") +
+  geom_sf(data = highways, color = "#000000") +
+  geom_sf(data = stl_boundary, fill = NA, color = "#2a2a2a", size = .6) +
+  scale_fill_brewer(palette = "Greens", name = "% Owner Occupied") +
+  labs(
+    title = "% of Housing Occupied by Homeowners",
+    subtitle = "City of St. Louis, 2010",
+    caption = "Data via U.S. Census Bureau\nMap by Christopher Prener, PhD"
+  )
+
+p1
+ + + +

The map shows that owner occupied rates are highest in the southwest +portion of St. Louis. We’ll save it using the following code:

+ + + +
ggsave(plot = p1, filename = here("results", "owner_occupied_housing.png"))
+ + + +

The map is now saved for dissemination!

+ +
+ +
LS0tCnRpdGxlOiAiTGFiIDEtMyBSZXBsaWNhdGlvbiIKYXV0aG9yOiAiQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaC5ELiIKZGF0ZTogJyhgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVCICVkLCAlWSIpYCknCm91dHB1dDogCiAgZ2l0aHViX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdCAKYWx3YXlzX2FsbG93X2h0bWw6IHllcwotLS0KCiMjIEludHJvZHVjdGlvbgpUaGlzIG5vdGVib29rIHByb3ZpZGVzIGEgcmVwbGljYXRpb24gb2YgTGFiIDEtMy4KCiMjIERlcGVuZGVuY2llcwpUaGlzIG5vdGVib29rIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6CgpgYGB7ciBsb2FkLXBhY2thZ2VzfQojIHRpZHl2ZXJzZSBwYWNrYWdlcwpsaWJyYXJ5KGdncGxvdDIpICAgICAgICMgc3RhdGljIG1hcHBpbmcKCiMgbWFwcGluZyBwYWNrYWdlcwpsaWJyYXJ5KG1hcHZpZXcpICAgICAgIyBwcmV2aWV3IHNwYXRpYWwgZGF0YQpsaWJyYXJ5KHNmKSAgICAgICAgICAgIyBzcGF0aWFsIHRvb2xzCgojIG90aGVyIHBhY2thZ2VzCmxpYnJhcnkoaGVyZSkgICAgICAgICAjIGZpbGUgcGF0aCBtYW5hZ2VtZW50CmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIGNvbG9yIGJyZXdlciBwYWxldHRlcwpsaWJyYXJ5KHZpcmlkaXMpICAgICAgIyB2aXJpZGlzIGNvbG9yIHBhbGV0dGVzCmBgYAoKV2UnbGwgYWxzbyBuZWVkIGEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgQ2hyaXMgaGFzIHdyaXR0ZW4gZm9yIGNyZWF0aW5nIG1hcCBicmVha3M6IAoKYGBge3IgbG9hZC1mdW5jdGlvbnN9CnNvdXJjZShoZXJlKCJzb3VyY2UiLCAibWFwX2JyZWFrcy5SIikpCmBgYAoKIyMgTG9hZCBEYXRhClRoZSBkYXRhIGZvciB0aGlzIGFzc2lnbWVudCBhcmUgYWxsIGluIHRoZSBgZGF0YS9gIGZvbGRlciwgYW5kIGluY2x1ZGUgYSBudW1iZXIgb2YgZGlmZmVyZW50IGxheWVyczoKCmBgYHtyIGxvYWQtZGF0YX0KIyBjaXR5IGJvdW5kYXJ5CnN0bF9ib3VuZGFyeSA8LSBzdF9yZWFkKGhlcmUoImRhdGEiLCAiU1RMX0JPVU5EQVJZX0NpdHkuZ2VvanNvbiIpKQoKIyB3YXRlciBsYXllcnMKaWxfaHlkcm8gPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgIklMX0hZRFJPX01pc3Npc3NpcHBpLmdlb2pzb24iKSkKc3RsX2h5ZHJvIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJTVExfSFlEUk9fQXJlYVdhdGVyLmdlb2pzb24iKSkKCiMgaGlnaHdheXMKaGlnaHdheXMgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgIlNUTF9UUkFOU19QcmltYXJ5Um9hZHMiLCAiU1RMX1RSQU5TX1ByaW1hcnlSb2Fkcy5zaHAiKSkKCiMgb3duZXIgb2NjdXBpZWQgaG91c2luZwpob3VzaW5nIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJTVExfSE9VU0lOR19Pd25lck9jY3VwaWVkLmdlb2pzb24iKSkKYGBgCgpXZSdyZSBub3cgcmVhZHkgdG8gbWFwIHRoZXNlIGRhdGEuCgojIyBQYXJ0IDEgLSBFeHBsb3JhdGlvbgpJbiBteSBjb25zb2xlLCBJJ3ZlIHVzZWQgYG1hcHZpZXc6Om1hcHZpZXcoKWAgdG8gZXhwbG9yZSBlYWNoIG9mIHRoZXNlIGRpZmZlcmVudCBkYXRhIHNldHMuIEFsbCBhcmUgcG9seWdvbiBkYXRhIGV4Y2VwdCBmb3IgdGhlIGhpZ2h3YXlzLCB3aGljaCBhcmUgbGluZSBkYXRhLgoKIyMgUGFydCAyIC0gTWFwcGluZwpUaGUgZm9sbG93aW5nIGNvZGUgY2h1bmsgY3JlYXRlcyBtYXAgYnJlYWtzIHVzaW5nIHRoZSAiZmlzaGVyIiBhcHByb2FjaCwgYW5kIHRoZW4gbGF5ZXJzIGRhdGEgb24gd2F0ZXIgZmVhdHVyZXMgYW5kIGhpZ2h3YXlzIG92ZXIgdGhlIGNlbnN1cyB0cmFjdHMgc2hvd2luZyB0aGUgcGVyY2VudCBvZiBob21lcyB0aGF0IGFyZSBvY2N1cGllZCBieSB0aGVpciBvd25lcnMuIAoKYGBge3IsIGhvdXNpbmctbWFwfQojIyBjcmVhdGUgYnJlYWtzCmhvdXNpbmcgPC0gbWFwX2JyZWFrcyhob3VzaW5nLCB2YXIgPSAicGN0X293bmVyX29jY3VwaWVkIiwgbmV3dmFyID0gIm1hcF9icmVha3MiLAogICAgICAgICAgICAgICAgICAgIHN0eWxlID0gImZpc2hlciIsIGNsYXNzZXMgPSA1LCBkaWdfbGFiID0gMikKCiMjIG1hcCBiaW5uZWQgZGF0YQpwMSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gc3RsX2JvdW5kYXJ5LCBmaWxsID0gIiNmZmZmZmYiLCBjb2xvciA9IE5BKSArCiAgZ2VvbV9zZihkYXRhID0gaG91c2luZywgbWFwcGluZyA9IGFlcyhmaWxsID0gbWFwX2JyZWFrcykpICsKICBnZW9tX3NmKGRhdGEgPSBpbF9oeWRybywgZmlsbCA9ICIjZDRmMWY5IikgKwogIGdlb21fc2YoZGF0YSA9IHN0bF9oeWRybywgZmlsbCA9ICIjZDRmMWY5IikgKwogIGdlb21fc2YoZGF0YSA9IGhpZ2h3YXlzLCBjb2xvciA9ICIjMDAwMDAwIikgKwogIGdlb21fc2YoZGF0YSA9IHN0bF9ib3VuZGFyeSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC42KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJHcmVlbnMiLCBuYW1lID0gIiUgT3duZXIgT2NjdXBpZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIiUgb2YgSG91c2luZyBPY2N1cGllZCBieSBIb21lb3duZXJzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzLCAyMDEwIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgVS5TLiBDZW5zdXMgQnVyZWF1XG5NYXAgYnkgQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaEQiCiAgKQoKcDEKYGBgCgpUaGUgbWFwIHNob3dzIHRoYXQgb3duZXIgb2NjdXBpZWQgcmF0ZXMgYXJlIGhpZ2hlc3QgaW4gdGhlIHNvdXRod2VzdCBwb3J0aW9uIG9mIFN0LiBMb3Vpcy4gV2UnbGwgc2F2ZSBpdCB1c2luZyB0aGUgZm9sbG93aW5nIGNvZGU6CgpgYGB7ciwgc2F2ZS1wbG90fQpnZ3NhdmUocGxvdCA9IHAxLCBmaWxlbmFtZSA9IGhlcmUoInJlc3VsdHMiLCAib3duZXJfb2NjdXBpZWRfaG91c2luZy5wbmciKSkKYGBgCgpUaGUgbWFwIGlzIG5vdyBzYXZlZCBmb3IgZGlzc2VtaW5hdGlvbiEK
+ + + +
+ + + + + + + + + + + + + + + + diff --git a/assignments/lab-03-replication/docs/lab-03-replication_files/figure-gfm/housing-map-1.png b/assignments/lab-1-3-replication/docs/lab-1-3-replication_files/figure-gfm/housing-map-1.png similarity index 100% rename from assignments/lab-03-replication/docs/lab-03-replication_files/figure-gfm/housing-map-1.png rename to assignments/lab-1-3-replication/docs/lab-1-3-replication_files/figure-gfm/housing-map-1.png diff --git a/assignments/lab-03-replication/lab-03-replication.Rproj b/assignments/lab-1-3-replication/lab-1-3-replication.Rproj similarity index 100% rename from assignments/lab-03-replication/lab-03-replication.Rproj rename to assignments/lab-1-3-replication/lab-1-3-replication.Rproj diff --git a/assignments/lab-03-replication/results/owner_occupied_housing.png b/assignments/lab-1-3-replication/results/owner_occupied_housing.png similarity index 100% rename from assignments/lab-03-replication/results/owner_occupied_housing.png rename to assignments/lab-1-3-replication/results/owner_occupied_housing.png diff --git a/assignments/lab-03-replication/source/map_breaks.R b/assignments/lab-1-3-replication/source/map_breaks.R similarity index 100% rename from assignments/lab-03-replication/source/map_breaks.R rename to assignments/lab-1-3-replication/source/map_breaks.R diff --git a/assignments/lab-03.pdf b/assignments/lab-1-3.pdf similarity index 64% rename from assignments/lab-03.pdf rename to assignments/lab-1-3.pdf index fea2a3c..b25978c 100644 Binary files a/assignments/lab-03.pdf and b/assignments/lab-1-3.pdf differ diff --git a/examples/meeting-03-complete.nb.html b/examples/meeting-03-complete.nb.html deleted file mode 100644 index 286d63b..0000000 --- a/examples/meeting-03-complete.nb.html +++ /dev/null @@ -1,561 +0,0 @@ - - - - - - - - - - - - - - -Meeting-03 Meeting Notebook - Complete - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
-

Introduction

-

This notebook provides a walk-through of the example code used in class.

-
-
-

Dependencies

-

This notebook requires the following packages:

- - - -
# tidyverse packages
-library(ggplot2)       # static mapping
-
-# mapping packages
-library(mapview)      # preview spatial data
- - -
Registered S3 methods overwritten by 'htmltools':
-  method               from         
-  print.html           tools:rstudio
-  print.shiny.tag      tools:rstudio
-  print.shiny.tag.list tools:rstudio
-Registered S3 method overwritten by 'htmlwidgets':
-  method           from         
-  print.htmlwidget tools:rstudio
-GDAL version >= 3.1.0 | setting mapviewOptions(fgb = TRUE)
- - -
library(sf)           # spatial tools
- - -
Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1
- - -
# other packages
-library(here)         # file path management
- - -
here() starts at /Users/chris/GitHub/slu-soc5650/content/module-1-cartography
- - -
library(RColorBrewer) # color brewer palettes
-library(viridis)      # viridis color palettes
- - -
Loading required package: viridisLite
- - - -

We’ll also need a custom function that Chris has written for creating map breaks:

- - - -
source(here("source", "map_breaks.R"))
- - - -

The source() function executes “R script” files, which can either be used to define functions used in a project or run a subset of other code contained in that file.

-
-
-

Load Data

-

We’ll be using two sets of data today, neighborhood boundaries and the regions of St. Louis City that are historic districts. Both data sets are included in the data/exercise_data folder:

- - - -
city <- st_read(here("data", "STL_BOUNDARY_City.geojson"))
- - -
Reading layer `STL_BOUNDARY_City' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/data/STL_BOUNDARY_City.geojson' using driver `GeoJSON'
-Simple feature collection with 1 feature and 2 fields
-geometry type:  MULTIPOLYGON
-dimension:      XY
-bbox:           xmin: 733360 ymin: 4268394 xmax: 746157.1 ymax: 4295511
-projected CRS:  NAD83 / UTM zone 15N
- - -
nhood <- st_read(here("data", "exercise_data", "STL_DEMOGRAPHICS_Nhoods", "STL_DEMOGRAPHICS_Nhoods.shp"))
- - -
Reading layer `STL_DEMOGRAPHICS_Nhoods' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/data/exercise_data/STL_DEMOGRAPHICS_Nhoods/STL_DEMOGRAPHICS_Nhoods.shp' using driver `ESRI Shapefile'
-Simple feature collection with 79 features and 5 fields
-geometry type:  MULTIPOLYGON
-dimension:      XY
-bbox:           xmin: 733361.8 ymin: 4268512 xmax: 745417.9 ymax: 4295501
-projected CRS:  UTM_Zone_15_Northern_Hemisphere
- - -
historic <- st_read(here("data", "exercise_data", "STL_HISTORICAL_Districts", "STL_HISTORICAL_Districts.shp"))
- - -
Reading layer `STL_HISTORICAL_Districts' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/data/exercise_data/STL_HISTORICAL_Districts/STL_HISTORICAL_Districts.shp' using driver `ESRI Shapefile'
-Simple feature collection with 102 features and 4 fields
-geometry type:  MULTIPOLYGON
-dimension:      XY
-bbox:           xmin: 734470.2 ymin: 4269761 xmax: 745405.8 ymax: 4288348
-projected CRS:  NAD83 / UTM zone 15N
- - - -
-
-

Manually Applying Colors

-

One task when we are working with multi-layer maps is arbitrarily setting the colors we assign to a given layer. We can use the fill argument in geom_sf outside of an aesthetic mapping to set the fill, and the color argument to set the hue of the border colors.

- - - -
p1 <- ggplot() +
-  geom_sf(data = historic, fill = "#ffe4e1", color = "#a9a9a9") +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p1
- - -

- - - -

Now, take a moment and use ColorHexa.com to change the fill to a cool color and select a darker shade of gray for the border:

- - - -
p2 <- ggplot() +
-  geom_sf(data = historic, fill = "#e1edff", color = "#838383") +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p2
- - -

- - - -
-
-

Layering with ggplot2

-

The maps we made above help identify the historic districts, but they are devoid of context because the lack the boundary for the City of St. Louis. Let’s go ahead an add that. We’ll set the fill for the city boundary to white so that our historic districts really stand out.

- - - -
p3 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff") +
-  geom_sf(data = historic, fill = "#e1edff", color = "#646464") +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p3
- - -

- - - -

Next, we’ll overlay the historic districts on the City’s neighborhood boundaries to add some additional context. We’ll set the fill for the neighborhood boundaries to NA so that they are hollow, use a light gray color, and set the size to .2 so that they are thinner than the default width. Finally, we’ll add the city data on top as well so that the City’s boundary stands out.

- - - -
p4 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff") +
-  geom_sf(data = nhood, fill = NA, color = "#a9a9a9", size = .2) +
-  geom_sf(data = historic, fill = "#e1edff", color = "#646464") +
-  geom_sf(data = city, fill = NA) +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p4
- - -

- - - -
-
-

Thematic Mapping with viridis and Color Brewer

-

The other topic for this week is to create maps that have different color ramps. Last week, we introduce the virids color palettes. We can illustrate that for review by mapping the 1950 populations of St. Louis’s neighborhoods, with the addition of a ground layer representing the city boundary:

- - - -
p5 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff", color = NA) +
-  geom_sf(data = nhood, mapping = aes(fill = pop50_den)) +
-  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
-  scale_fill_viridis(name = "Population Density\nper Square Kilometer") +
-  labs(
-    title = "1950 Neighborhood Populations",
-    subtitle = "City of St. Louis",
-    caption = "Data via NHGIS and Christopher Prener, PhD"
-  )
-
-p5
- - - -

The viridis package contains four other palettes: “magma”, “plasma”, and “inferno” all look somewhat similar, and then the alternate “cividis” palette. You can specify them with the option argument in scale_fill_viridis:

- - - -
p6 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff", color = NA) +
-  geom_sf(data = nhood, mapping = aes(fill = pop50_den)) +
-  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
-  scale_fill_viridis(option = "magma", name = "Population Density\nper Square Kilometer") +
-  labs(
-    title = "1950 Neighborhood Populations",
-    subtitle = "City of St. Louis",
-    caption = "Data via NHGIS and Christopher Prener, PhD"
-  )
-
-p6
- - - -

This map is a bit hard to read because the color ramp is continuous. We can bin our data using one of a number of algorithms - “equal”, “pretty”, “quantile”, “fisher”, and “jenks” are the best options to choose from. Typically we don’t want more than 5 or 6 breaks. We can also switch to using RColorBrewer instead.

- - - -
## create breaks
-nhood <- map_breaks(nhood, var = "pop50_den", newvar = "map_breaks",
-                    style = "quantile", classes = 5, dig_lab = 5)
-
-## map binned data
-p7 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff", color = NA) +
-  geom_sf(data = nhood, mapping = aes(fill = map_breaks)) +
-  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
-  scale_fill_brewer(palette = "RdPu", name = "Population Density\nper Square Kilometer") +
-  labs(
-    title = "1950 Neighborhood Populations",
-    subtitle = "City of St. Louis",
-    caption = "Data via NHGIS and Christopher Prener, PhD"
-  )
-
-p7
- - - -

You can use the display.brewer.all() function to get a preview of other options in the RColorBrewer package. Take a few minutes to modify p7 using different palette options and approaches to making breaks.

- -
- -
LS0tCnRpdGxlOiAiTWVldGluZy0wMyBNZWV0aW5nIE5vdGVib29rIC0gQ29tcGxldGUiCmF1dGhvcjogIkNocmlzdG9waGVyIFByZW5lciwgUGguRC4iCmRhdGU6ICcoYHIgZm9ybWF0KFN5cy50aW1lKCksICIlQiAlZCwgJVkiKWApJwpvdXRwdXQ6IAogIGdpdGh1Yl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQgCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgojIyBJbnRyb2R1Y3Rpb24KVGhpcyBub3RlYm9vayBwcm92aWRlcyBhIHdhbGstdGhyb3VnaCBvZiB0aGUgZXhhbXBsZSBjb2RlIHVzZWQgaW4gY2xhc3MuCgojIyBEZXBlbmRlbmNpZXMKVGhpcyBub3RlYm9vayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgoKYGBge3IgbG9hZC1wYWNrYWdlc30KIyB0aWR5dmVyc2UgcGFja2FnZXMKbGlicmFyeShnZ3Bsb3QyKSAgICAgICAjIHN0YXRpYyBtYXBwaW5nCgojIG1hcHBpbmcgcGFja2FnZXMKbGlicmFyeShtYXB2aWV3KSAgICAgICMgcHJldmlldyBzcGF0aWFsIGRhdGEKbGlicmFyeShzZikgICAgICAgICAgICMgc3BhdGlhbCB0b29scwoKIyBvdGhlciBwYWNrYWdlcwpsaWJyYXJ5KGhlcmUpICAgICAgICAgIyBmaWxlIHBhdGggbWFuYWdlbWVudApsaWJyYXJ5KFJDb2xvckJyZXdlcikgIyBjb2xvciBicmV3ZXIgcGFsZXR0ZXMKbGlicmFyeSh2aXJpZGlzKSAgICAgICMgdmlyaWRpcyBjb2xvciBwYWxldHRlcwpgYGAKCldlJ2xsIGFsc28gbmVlZCBhIGN1c3RvbSBmdW5jdGlvbiB0aGF0IENocmlzIGhhcyB3cml0dGVuIGZvciBjcmVhdGluZyBtYXAgYnJlYWtzOiAKCmBgYHtyIGxvYWQtZnVuY3Rpb25zfQpzb3VyY2UoaGVyZSgic291cmNlIiwgIm1hcF9icmVha3MuUiIpKQpgYGAKClRoZSBgc291cmNlKClgIGZ1bmN0aW9uIGV4ZWN1dGVzICJSIHNjcmlwdCIgZmlsZXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgdXNlZCB0byBkZWZpbmUgZnVuY3Rpb25zIHVzZWQgaW4gYSBwcm9qZWN0IG9yIHJ1biBhIHN1YnNldCBvZiBvdGhlciBjb2RlIGNvbnRhaW5lZCBpbiB0aGF0IGZpbGUuCgojIyBMb2FkIERhdGEKV2UnbGwgYmUgdXNpbmcgdHdvIHNldHMgb2YgZGF0YSB0b2RheSwgbmVpZ2hib3Job29kIGJvdW5kYXJpZXMgYW5kIHRoZSByZWdpb25zIG9mIFN0LiBMb3VpcyBDaXR5IHRoYXQgYXJlIGhpc3RvcmljIGRpc3RyaWN0cy4gQm90aCBkYXRhIHNldHMgYXJlIGluY2x1ZGVkIGluIHRoZSBgZGF0YS9leGVyY2lzZV9kYXRhYCBmb2xkZXI6CgpgYGB7ciBsb2FkLWRhdGF9CmNpdHkgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgIlNUTF9CT1VOREFSWV9DaXR5Lmdlb2pzb24iKSkKbmhvb2QgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgImV4ZXJjaXNlX2RhdGEiLCAiU1RMX0RFTU9HUkFQSElDU19OaG9vZHMiLCAiU1RMX0RFTU9HUkFQSElDU19OaG9vZHMuc2hwIikpCmhpc3RvcmljIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJleGVyY2lzZV9kYXRhIiwgIlNUTF9ISVNUT1JJQ0FMX0Rpc3RyaWN0cyIsICJTVExfSElTVE9SSUNBTF9EaXN0cmljdHMuc2hwIikpCmBgYAojIyBNYW51YWxseSBBcHBseWluZyBDb2xvcnMKT25lIHRhc2sgd2hlbiB3ZSBhcmUgd29ya2luZyB3aXRoIG11bHRpLWxheWVyIG1hcHMgaXMgYXJiaXRyYXJpbHkgc2V0dGluZyB0aGUgY29sb3JzIHdlIGFzc2lnbiB0byBhIGdpdmVuIGxheWVyLiBXZSBjYW4gdXNlIHRoZSBgZmlsbGAgYXJndW1lbnQgaW4gYGdlb21fc2ZgICpvdXRzaWRlKiBvZiBhbiBhZXN0aGV0aWMgbWFwcGluZyB0byBzZXQgdGhlIGZpbGwsIGFuZCB0aGUgYGNvbG9yYCBhcmd1bWVudCB0byBzZXQgdGhlIGh1ZSBvZiB0aGUgYm9yZGVyIGNvbG9ycy4KCmBgYHtyIGhpc3RvcmljLWRpc3RyaWN0cy0xfQpwMSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gaGlzdG9yaWMsIGZpbGwgPSAiI2ZmZTRlMSIsIGNvbG9yID0gIiNhOWE5YTkiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhpc3RvcmljIERpc3RyaWN0cyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIENpdHkgb2YgU3QuIExvdWlzIgogICkKCnAxCmBgYAoKTm93LCB0YWtlIGEgbW9tZW50IGFuZCB1c2UgW0NvbG9ySGV4YS5jb21dKGh0dHBzOi8vd3d3LmNvbG9yaGV4YS5jb20pIHRvIGNoYW5nZSB0aGUgZmlsbCB0byBhICpjb29sKiBjb2xvciBhbmQgc2VsZWN0IGEgZGFya2VyIHNoYWRlIG9mIGdyYXkgZm9yIHRoZSBib3JkZXI6CgpgYGB7ciBoaXN0b3JpYy1kaXN0cmljdHMtMn0KcDIgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGhpc3RvcmljLCBmaWxsID0gIiNlMWVkZmYiLCBjb2xvciA9ICIjODM4MzgzIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJIaXN0b3JpYyBEaXN0cmljdHMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBDaXR5IG9mIFN0LiBMb3VpcyIKICApCgpwMgpgYGAKCiMjIExheWVyaW5nIHdpdGggZ2dwbG90MgpUaGUgbWFwcyB3ZSBtYWRlIGFib3ZlIGhlbHAgaWRlbnRpZnkgdGhlIGhpc3RvcmljIGRpc3RyaWN0cywgYnV0IHRoZXkgYXJlIGRldm9pZCBvZiBjb250ZXh0IGJlY2F1c2UgdGhlIGxhY2sgdGhlIGJvdW5kYXJ5IGZvciB0aGUgQ2l0eSBvZiBTdC4gTG91aXMuIExldCdzIGdvIGFoZWFkIGFuIGFkZCB0aGF0LiBXZSdsbCBzZXQgdGhlIGZpbGwgZm9yIHRoZSBjaXR5IGJvdW5kYXJ5IHRvIHdoaXRlIHNvIHRoYXQgb3VyIGhpc3RvcmljIGRpc3RyaWN0cyByZWFsbHkgc3RhbmQgb3V0LgoKYGBge3IgaGlzdG9yaWMtZGlzdHJpY3RzLTN9CnAzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gIiNmZmZmZmYiKSArCiAgZ2VvbV9zZihkYXRhID0gaGlzdG9yaWMsIGZpbGwgPSAiI2UxZWRmZiIsIGNvbG9yID0gIiM2NDY0NjQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhpc3RvcmljIERpc3RyaWN0cyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIENpdHkgb2YgU3QuIExvdWlzIgogICkKCnAzCmBgYAoKTmV4dCwgd2UnbGwgb3ZlcmxheSB0aGUgaGlzdG9yaWMgZGlzdHJpY3RzIG9uIHRoZSBDaXR5J3MgbmVpZ2hib3Job29kIGJvdW5kYXJpZXMgdG8gYWRkIHNvbWUgYWRkaXRpb25hbCBjb250ZXh0LiBXZSdsbCBzZXQgdGhlIGZpbGwgZm9yIHRoZSBuZWlnaGJvcmhvb2QgYm91bmRhcmllcyB0byBgTkFgIHNvIHRoYXQgdGhleSBhcmUgaG9sbG93LCB1c2UgYSBsaWdodCBncmF5IGNvbG9yLCBhbmQgc2V0IHRoZSBzaXplIHRvIGAuMmAgc28gdGhhdCB0aGV5IGFyZSB0aGlubmVyIHRoYW4gdGhlIGRlZmF1bHQgd2lkdGguIEZpbmFsbHksIHdlJ2xsIGFkZCB0aGUgYGNpdHlgIGRhdGEgb24gdG9wIGFzIHdlbGwgc28gdGhhdCB0aGUgQ2l0eSdzIGJvdW5kYXJ5IHN0YW5kcyBvdXQuCgpgYGB7ciBoaXN0b3JpYy1kaXN0cmljdHMtNH0KcDQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSAiI2ZmZmZmZiIpICsKICBnZW9tX3NmKGRhdGEgPSBuaG9vZCwgZmlsbCA9IE5BLCBjb2xvciA9ICIjYTlhOWE5Iiwgc2l6ZSA9IC4yKSArCiAgZ2VvbV9zZihkYXRhID0gaGlzdG9yaWMsIGZpbGwgPSAiI2UxZWRmZiIsIGNvbG9yID0gIiM2NDY0NjQiKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhpc3RvcmljIERpc3RyaWN0cyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIENpdHkgb2YgU3QuIExvdWlzIgogICkKCnA0CmBgYAoKIyMgVGhlbWF0aWMgTWFwcGluZyB3aXRoIHZpcmlkaXMgYW5kIENvbG9yIEJyZXdlcgpUaGUgb3RoZXIgdG9waWMgZm9yIHRoaXMgd2VlayBpcyB0byBjcmVhdGUgbWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGNvbG9yIHJhbXBzLiBMYXN0IHdlZWssIHdlIGludHJvZHVjZSB0aGUgYHZpcmlkc2AgY29sb3IgcGFsZXR0ZXMuIFdlIGNhbiBpbGx1c3RyYXRlIHRoYXQgZm9yIHJldmlldyBieSBtYXBwaW5nIHRoZSAxOTUwIHBvcHVsYXRpb25zIG9mIFN0LiBMb3VpcydzIG5laWdoYm9yaG9vZHMsIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgZ3JvdW5kIGxheWVyIHJlcHJlc2VudGluZyB0aGUgY2l0eSBib3VuZGFyeToKCmBgYHtyLCBuaG9vZC1wb3AtMX0KcDUgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSAiI2ZmZmZmZiIsIGNvbG9yID0gTkEpICsKICBnZW9tX3NmKGRhdGEgPSBuaG9vZCwgbWFwcGluZyA9IGFlcyhmaWxsID0gcG9wNTBfZGVuKSkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSBOQSwgY29sb3IgPSAiIzJhMmEyYSIsIHNpemUgPSAuOSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lID0gIlBvcHVsYXRpb24gRGVuc2l0eVxucGVyIFNxdWFyZSBLaWxvbWV0ZXIiKSArCiAgbGFicygKICAgIHRpdGxlID0gIjE5NTAgTmVpZ2hib3Job29kIFBvcHVsYXRpb25zIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgTkhHSVMgYW5kIENocmlzdG9waGVyIFByZW5lciwgUGhEIgogICkKCnA1CmBgYAoKVGhlIHZpcmlkaXMgcGFja2FnZSBjb250YWlucyBmb3VyIG90aGVyIHBhbGV0dGVzOiAibWFnbWEiLCAicGxhc21hIiwgYW5kICJpbmZlcm5vIiBhbGwgbG9vayBzb21ld2hhdCBzaW1pbGFyLCBhbmQgdGhlbiB0aGUgYWx0ZXJuYXRlICJjaXZpZGlzIiBwYWxldHRlLiBZb3UgY2FuIHNwZWNpZnkgdGhlbSB3aXRoIHRoZSBgb3B0aW9uYCBhcmd1bWVudCBpbiBgc2NhbGVfZmlsbF92aXJpZGlzYDoKCmBgYHtyLCBuaG9vZC1wb3AtMn0KcDYgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSAiI2ZmZmZmZiIsIGNvbG9yID0gTkEpICsKICBnZW9tX3NmKGRhdGEgPSBuaG9vZCwgbWFwcGluZyA9IGFlcyhmaWxsID0gcG9wNTBfZGVuKSkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSBOQSwgY29sb3IgPSAiIzJhMmEyYSIsIHNpemUgPSAuOSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBuYW1lID0gIlBvcHVsYXRpb24gRGVuc2l0eVxucGVyIFNxdWFyZSBLaWxvbWV0ZXIiKSArCiAgbGFicygKICAgIHRpdGxlID0gIjE5NTAgTmVpZ2hib3Job29kIFBvcHVsYXRpb25zIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgTkhHSVMgYW5kIENocmlzdG9waGVyIFByZW5lciwgUGhEIgogICkKCnA2CmBgYAoKVGhpcyBtYXAgaXMgYSBiaXQgaGFyZCB0byByZWFkIGJlY2F1c2UgdGhlIGNvbG9yIHJhbXAgaXMgY29udGludW91cy4gV2UgY2FuIGJpbiBvdXIgZGF0YSB1c2luZyBvbmUgb2YgYSBudW1iZXIgb2YgYWxnb3JpdGhtcyAtICJlcXVhbCIsICJwcmV0dHkiLCAicXVhbnRpbGUiLCAiZmlzaGVyIiwgYW5kICJqZW5rcyIgYXJlIHRoZSBiZXN0IG9wdGlvbnMgdG8gY2hvb3NlIGZyb20uIFR5cGljYWxseSB3ZSBkb24ndCB3YW50IG1vcmUgdGhhbiA1IG9yIDYgYnJlYWtzLiBXZSBjYW4gYWxzbyBzd2l0Y2ggdG8gdXNpbmcgYFJDb2xvckJyZXdlcmAgaW5zdGVhZC4KCmBgYHtyLCBuaG9vZC1wb3AtM30KIyMgY3JlYXRlIGJyZWFrcwpuaG9vZCA8LSBtYXBfYnJlYWtzKG5ob29kLCB2YXIgPSAicG9wNTBfZGVuIiwgbmV3dmFyID0gIm1hcF9icmVha3MiLAogICAgICAgICAgICAgICAgICAgIHN0eWxlID0gInF1YW50aWxlIiwgY2xhc3NlcyA9IDUsIGRpZ19sYWIgPSA1KQoKIyMgbWFwIGJpbm5lZCBkYXRhCnA3IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gIiNmZmZmZmYiLCBjb2xvciA9IE5BKSArCiAgZ2VvbV9zZihkYXRhID0gbmhvb2QsIG1hcHBpbmcgPSBhZXMoZmlsbCA9IG1hcF9icmVha3MpKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC45KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJSZFB1IiwgbmFtZSA9ICJQb3B1bGF0aW9uIERlbnNpdHlcbnBlciBTcXVhcmUgS2lsb21ldGVyIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICIxOTUwIE5laWdoYm9yaG9vZCBQb3B1bGF0aW9ucyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIE5IR0lTIGFuZCBDaHJpc3RvcGhlciBQcmVuZXIsIFBoRCIKICApCgpwNwpgYGAKCllvdSBjYW4gdXNlIHRoZSBgZGlzcGxheS5icmV3ZXIuYWxsKClgIGZ1bmN0aW9uIHRvIGdldCBhIHByZXZpZXcgb2Ygb3RoZXIgb3B0aW9ucyBpbiB0aGUgYFJDb2xvckJyZXdlcmAgcGFja2FnZS4gVGFrZSBhIGZldyBtaW51dGVzIHRvIG1vZGlmeSBgcDdgIHVzaW5nIGRpZmZlcmVudCBwYWxldHRlIG9wdGlvbnMgYW5kIGFwcHJvYWNoZXMgdG8gbWFraW5nIGJyZWFrcy4K
- - - -
- - - - - - - - - - - - - - - - diff --git a/examples/meeting-03.nb.html b/examples/meeting-03.nb.html deleted file mode 100644 index 737591e..0000000 --- a/examples/meeting-03.nb.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - - - - -Meeting-03 Meeting Notebook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
-

Introduction

-

This notebook provides a walk-through of the example code used in class.

-
-
-

Dependencies

-

This notebook requires the following packages:

- - - -
# tidyverse packages
-library(ggplot2)       # static mapping
-
-# mapping packages
-library(mapview)      # preview spatial data
-library(sf)           # spatial tools
-
-# other packages
-library(here)         # file path management
-library(RColorBrewer) # color brewer palettes
-library(viridis)      # viridis color palettes
- - - -

We’ll also need a custom function that Chris has written for creating map breaks:

- - - -
source(here("source", "map_breaks.R"))
- - - -

The source() function executes “R script” files, which can either be used to define functions used in a project or run a subset of other code contained in that file.

-
-
-

Load Data

-

We’ll be using two sets of data today, neighborhood boundaries and the regions of St. Louis City that are historic districts. Both data sets are included in the data/exercise_data folder:

- - - -
city <- st_read(here("data", "STL_BOUNDARY_City.geojson"))
-nhood <- st_read(here("data", "exercise_data", "STL_DEMOGRAPHICS_Nhoods", "STL_DEMOGRAPHICS_Nhoods.shp"))
-historic <- st_read(here("data", "exercise_data", "STL_HISTORICAL_Districts", "STL_HISTORICAL_Districts.shp"))
- - - -
-
-

Manually Applying Colors

-

One task when we are working with multi-layer maps is arbitrarily setting the colors we assign to a given layer. We can use the fill argument in geom_sf outside of an aesthetic mapping to set the fill, and the color argument to set the hue of the border colors.

- - - -
p1 <- ggplot() +
-  geom_sf(data = historic, fill = "#ffe4e1", color = "#a9a9a9") +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p1
- - - -

Now, take a moment and use ColorHexa.com to change the fill to a cool color and select a darker shade of gray for the border:

- - - -
p2 <- ggplot() +
-  geom_sf(data = historic, fill = , color = ) +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p2
- - - -
-
-

Layering with ggplot2

-

The maps we made above help identify the historic districts, but they are devoid of context because the lack the boundary for the City of St. Louis. Let’s go ahead an add that. We’ll set the fill for the city boundary to white so that our historic districts really stand out.

- - - -
p3 <- ggplot() +
-  geom_sf() +
-  geom_sf() +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p3
- - - -

Next, we’ll overlay the historic districts on the City’s neighborhood boundaries to add some additional context. We’ll set the fill for the neighborhood boundaries to NA so that they are hollow, use a light gray color, and set the size to .2 so that they are thinner than the default width. Finally, we’ll add the city data on top as well so that the City’s boundary stands out.

- - - -
p4 <- ggplot() +
-  geom_sf() +
-  geom_sf() +
-  geom_sf() +
-  geom_sf() +
-  labs(
-    title = "Historic Districts",
-    subtitle = "City of St. Louis",
-    caption = "Data via City of St. Louis"
-  )
-
-p4
- - - -
-
-

Thematic Mapping with viridis and Color Brewer

-

The other topic for this week is to create maps that have different color ramps. Last week, we introduce the virids color palettes. We can illustrate that for review by mapping the 1950 populations of St. Louis’s neighborhoods, with the addition of a ground layer representing the city boundary:

- - - -
p5 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff", color = NA) +
-  geom_sf() +
-  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
-  scale_fill_viridis(name = "Population Density\nper Square Kilometer") +
-  labs(
-    title = "1950 Neighborhood Populations",
-    subtitle = "City of St. Louis",
-    caption = "Data via NHGIS and Christopher Prener, PhD"
-  )
-
-p5
- - - -

The viridis package contains four other palettes: “magma”, “plasma”, and “inferno” all look somewhat similar, and then the alternate “cividis” palette. You can specify them with the option argument in scale_fill_viridis:

- - - -
p6 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff", color = NA) +
-  geom_sf(data = nhood, mapping = aes(fill = pop50_den)) +
-  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
-  scale_fill_viridis(option = , name = "Population Density\nper Square Kilometer") +
-  labs(
-    title = "1950 Neighborhood Populations",
-    subtitle = "City of St. Louis",
-    caption = "Data via NHGIS and Christopher Prener, PhD"
-  )
-
-p6
- - - -

This map is a bit hard to read because the color ramp is continuous. We can bin our data using one of a number of algorithms - “equal”, “pretty”, “quantile”, “fisher”, and “jenks” are the best options to choose from. Typically we don’t want more than 5 or 6 breaks. We can also switch to using RColorBrewer instead.

- - - -
## create breaks
-nhood <- map_breaks()
-
-## map binned data
-p7 <- ggplot() +
-  geom_sf(data = city, fill = "#ffffff", color = NA) +
-  geom_sf(data = nhood, mapping = aes(fill = )) +
-  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
-  scale_fill_brewer(palette = "RdPu", name = "Population Density\nper Square Kilometer") +
-  labs(
-    title = "1950 Neighborhood Populations",
-    subtitle = "City of St. Louis",
-    caption = "Data via NHGIS and Christopher Prener, PhD"
-  )
-
-p7
- - - -

You can use the display.brewer.all() function to get a preview of other options in the RColorBrewer package. Take a few minutes to modify p7 using different palette options and approaches to making breaks.

- -
- -
LS0tCnRpdGxlOiAiTWVldGluZy0wMyBNZWV0aW5nIE5vdGVib29rIgphdXRob3I6ICJDaHJpc3RvcGhlciBQcmVuZXIsIFBoLkQuIgpkYXRlOiAnKGByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZIilgKScKb3V0cHV0OiAKICBnaXRodWJfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0IAphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKIyMgSW50cm9kdWN0aW9uClRoaXMgbm90ZWJvb2sgcHJvdmlkZXMgYSB3YWxrLXRocm91Z2ggb2YgdGhlIGV4YW1wbGUgY29kZSB1c2VkIGluIGNsYXNzLgoKIyMgRGVwZW5kZW5jaWVzClRoaXMgbm90ZWJvb2sgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwYWNrYWdlczoKCmBgYHtyIGxvYWQtcGFja2FnZXN9CiMgdGlkeXZlcnNlIHBhY2thZ2VzCmxpYnJhcnkoZ2dwbG90MikgICAgICAgIyBzdGF0aWMgbWFwcGluZwoKIyBtYXBwaW5nIHBhY2thZ2VzCmxpYnJhcnkobWFwdmlldykgICAgICAjIHByZXZpZXcgc3BhdGlhbCBkYXRhCmxpYnJhcnkoc2YpICAgICAgICAgICAjIHNwYXRpYWwgdG9vbHMKCiMgb3RoZXIgcGFja2FnZXMKbGlicmFyeShoZXJlKSAgICAgICAgICMgZmlsZSBwYXRoIG1hbmFnZW1lbnQKbGlicmFyeShSQ29sb3JCcmV3ZXIpICMgY29sb3IgYnJld2VyIHBhbGV0dGVzCmxpYnJhcnkodmlyaWRpcykgICAgICAjIHZpcmlkaXMgY29sb3IgcGFsZXR0ZXMKYGBgCgpXZSdsbCBhbHNvIG5lZWQgYSBjdXN0b20gZnVuY3Rpb24gdGhhdCBDaHJpcyBoYXMgd3JpdHRlbiBmb3IgY3JlYXRpbmcgbWFwIGJyZWFrczogCgpgYGB7ciBsb2FkLWZ1bmN0aW9uc30Kc291cmNlKGhlcmUoInNvdXJjZSIsICJtYXBfYnJlYWtzLlIiKSkKYGBgCgpUaGUgYHNvdXJjZSgpYCBmdW5jdGlvbiBleGVjdXRlcyAiUiBzY3JpcHQiIGZpbGVzLCB3aGljaCBjYW4gZWl0aGVyIGJlIHVzZWQgdG8gZGVmaW5lIGZ1bmN0aW9ucyB1c2VkIGluIGEgcHJvamVjdCBvciBydW4gYSBzdWJzZXQgb2Ygb3RoZXIgY29kZSBjb250YWluZWQgaW4gdGhhdCBmaWxlLgoKIyMgTG9hZCBEYXRhCldlJ2xsIGJlIHVzaW5nIHR3byBzZXRzIG9mIGRhdGEgdG9kYXksIG5laWdoYm9yaG9vZCBib3VuZGFyaWVzIGFuZCB0aGUgcmVnaW9ucyBvZiBTdC4gTG91aXMgQ2l0eSB0aGF0IGFyZSBoaXN0b3JpYyBkaXN0cmljdHMuIEJvdGggZGF0YSBzZXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYGRhdGEvZXhlcmNpc2VfZGF0YWAgZm9sZGVyOgoKYGBge3IgbG9hZC1kYXRhfQpjaXR5IDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJTVExfQk9VTkRBUllfQ2l0eS5nZW9qc29uIikpCm5ob29kIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJleGVyY2lzZV9kYXRhIiwgIlNUTF9ERU1PR1JBUEhJQ1NfTmhvb2RzIiwgIlNUTF9ERU1PR1JBUEhJQ1NfTmhvb2RzLnNocCIpKQpoaXN0b3JpYyA8LSBzdF9yZWFkKGhlcmUoImRhdGEiLCAiZXhlcmNpc2VfZGF0YSIsICJTVExfSElTVE9SSUNBTF9EaXN0cmljdHMiLCAiU1RMX0hJU1RPUklDQUxfRGlzdHJpY3RzLnNocCIpKQpgYGAKCiMjIE1hbnVhbGx5IEFwcGx5aW5nIENvbG9ycwpPbmUgdGFzayB3aGVuIHdlIGFyZSB3b3JraW5nIHdpdGggbXVsdGktbGF5ZXIgbWFwcyBpcyBhcmJpdHJhcmlseSBzZXR0aW5nIHRoZSBjb2xvcnMgd2UgYXNzaWduIHRvIGEgZ2l2ZW4gbGF5ZXIuIFdlIGNhbiB1c2UgdGhlIGBmaWxsYCBhcmd1bWVudCBpbiBgZ2VvbV9zZmAgKm91dHNpZGUqIG9mIGFuIGFlc3RoZXRpYyBtYXBwaW5nIHRvIHNldCB0aGUgZmlsbCwgYW5kIHRoZSBgY29sb3JgIGFyZ3VtZW50IHRvIHNldCB0aGUgaHVlIG9mIHRoZSBib3JkZXIgY29sb3JzLgoKYGBge3IgaGlzdG9yaWMtZGlzdHJpY3RzLTF9CnAxIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBoaXN0b3JpYywgZmlsbCA9ICIjZmZlNGUxIiwgY29sb3IgPSAiI2E5YTlhOSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDEKYGBgCgpOb3csIHRha2UgYSBtb21lbnQgYW5kIHVzZSBbQ29sb3JIZXhhLmNvbV0oaHR0cHM6Ly93d3cuY29sb3JoZXhhLmNvbSkgdG8gY2hhbmdlIHRoZSBmaWxsIHRvIGEgKmNvb2wqIGNvbG9yIGFuZCBzZWxlY3QgYSBkYXJrZXIgc2hhZGUgb2YgZ3JheSBmb3IgdGhlIGJvcmRlcjoKCmBgYHtyIGhpc3RvcmljLWRpc3RyaWN0cy0yfQpwMiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gaGlzdG9yaWMsIGZpbGwgPSAsIGNvbG9yID0gKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhpc3RvcmljIERpc3RyaWN0cyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIENpdHkgb2YgU3QuIExvdWlzIgogICkKCnAyCmBgYAoKIyMgTGF5ZXJpbmcgd2l0aCBnZ3Bsb3QyClRoZSBtYXBzIHdlIG1hZGUgYWJvdmUgaGVscCBpZGVudGlmeSB0aGUgaGlzdG9yaWMgZGlzdHJpY3RzLCBidXQgdGhleSBhcmUgZGV2b2lkIG9mIGNvbnRleHQgYmVjYXVzZSB0aGUgbGFjayB0aGUgYm91bmRhcnkgZm9yIHRoZSBDaXR5IG9mIFN0LiBMb3Vpcy4gTGV0J3MgZ28gYWhlYWQgYW4gYWRkIHRoYXQuIFdlJ2xsIHNldCB0aGUgZmlsbCBmb3IgdGhlIGNpdHkgYm91bmRhcnkgdG8gd2hpdGUgc28gdGhhdCBvdXIgaGlzdG9yaWMgZGlzdHJpY3RzIHJlYWxseSBzdGFuZCBvdXQuCgpgYGB7ciBoaXN0b3JpYy1kaXN0cmljdHMtM30KcDMgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoKSArCiAgZ2VvbV9zZigpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDMKYGBgCgpOZXh0LCB3ZSdsbCBvdmVybGF5IHRoZSBoaXN0b3JpYyBkaXN0cmljdHMgb24gdGhlIENpdHkncyBuZWlnaGJvcmhvb2QgYm91bmRhcmllcyB0byBhZGQgc29tZSBhZGRpdGlvbmFsIGNvbnRleHQuIFdlJ2xsIHNldCB0aGUgZmlsbCBmb3IgdGhlIG5laWdoYm9yaG9vZCBib3VuZGFyaWVzIHRvIGBOQWAgc28gdGhhdCB0aGV5IGFyZSBob2xsb3csIHVzZSBhIGxpZ2h0IGdyYXkgY29sb3IsIGFuZCBzZXQgdGhlIHNpemUgdG8gYC4yYCBzbyB0aGF0IHRoZXkgYXJlIHRoaW5uZXIgdGhhbiB0aGUgZGVmYXVsdCB3aWR0aC4gRmluYWxseSwgd2UnbGwgYWRkIHRoZSBgY2l0eWAgZGF0YSBvbiB0b3AgYXMgd2VsbCBzbyB0aGF0IHRoZSBDaXR5J3MgYm91bmRhcnkgc3RhbmRzIG91dC4KCmBgYHtyIGhpc3RvcmljLWRpc3RyaWN0cy00fQpwNCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3NmKCkgKwogIGdlb21fc2YoKSArCiAgZ2VvbV9zZigpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDQKYGBgCgojIyBUaGVtYXRpYyBNYXBwaW5nIHdpdGggdmlyaWRpcyBhbmQgQ29sb3IgQnJld2VyClRoZSBvdGhlciB0b3BpYyBmb3IgdGhpcyB3ZWVrIGlzIHRvIGNyZWF0ZSBtYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29sb3IgcmFtcHMuIExhc3Qgd2Vlaywgd2UgaW50cm9kdWNlIHRoZSBgdmlyaWRzYCBjb2xvciBwYWxldHRlcy4gV2UgY2FuIGlsbHVzdHJhdGUgdGhhdCBmb3IgcmV2aWV3IGJ5IG1hcHBpbmcgdGhlIDE5NTAgcG9wdWxhdGlvbnMgb2YgU3QuIExvdWlzJ3MgbmVpZ2hib3Job29kcywgd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBncm91bmQgbGF5ZXIgcmVwcmVzZW50aW5nIHRoZSBjaXR5IGJvdW5kYXJ5OgoKYGBge3IsIG5ob29kLXBvcC0xfQpwNSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9ICIjZmZmZmZmIiwgY29sb3IgPSBOQSkgKwogIGdlb21fc2YoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC45KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWUgPSAiUG9wdWxhdGlvbiBEZW5zaXR5XG5wZXIgU3F1YXJlIEtpbG9tZXRlciIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiMTk1MCBOZWlnaGJvcmhvb2QgUG9wdWxhdGlvbnMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBOSEdJUyBhbmQgQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaEQiCiAgKQoKcDUKYGBgCgpUaGUgdmlyaWRpcyBwYWNrYWdlIGNvbnRhaW5zIGZvdXIgb3RoZXIgcGFsZXR0ZXM6ICJtYWdtYSIsICJwbGFzbWEiLCBhbmQgImluZmVybm8iIGFsbCBsb29rIHNvbWV3aGF0IHNpbWlsYXIsIGFuZCB0aGVuIHRoZSBhbHRlcm5hdGUgImNpdmlkaXMiIHBhbGV0dGUuIFlvdSBjYW4gc3BlY2lmeSB0aGVtIHdpdGggdGhlIGBvcHRpb25gIGFyZ3VtZW50IGluIGBzY2FsZV9maWxsX3ZpcmlkaXNgOgoKYGBge3IsIG5ob29kLXBvcC0yfQpwNiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9ICIjZmZmZmZmIiwgY29sb3IgPSBOQSkgKwogIGdlb21fc2YoZGF0YSA9IG5ob29kLCBtYXBwaW5nID0gYWVzKGZpbGwgPSBwb3A1MF9kZW4pKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC45KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICwgbmFtZSA9ICJQb3B1bGF0aW9uIERlbnNpdHlcbnBlciBTcXVhcmUgS2lsb21ldGVyIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICIxOTUwIE5laWdoYm9yaG9vZCBQb3B1bGF0aW9ucyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIE5IR0lTIGFuZCBDaHJpc3RvcGhlciBQcmVuZXIsIFBoRCIKICApCgpwNgpgYGAKClRoaXMgbWFwIGlzIGEgYml0IGhhcmQgdG8gcmVhZCBiZWNhdXNlIHRoZSBjb2xvciByYW1wIGlzIGNvbnRpbnVvdXMuIFdlIGNhbiBiaW4gb3VyIGRhdGEgdXNpbmcgb25lIG9mIGEgbnVtYmVyIG9mIGFsZ29yaXRobXMgLSAiZXF1YWwiLCAicHJldHR5IiwgInF1YW50aWxlIiwgImZpc2hlciIsIGFuZCAiamVua3MiIGFyZSB0aGUgYmVzdCBvcHRpb25zIHRvIGNob29zZSBmcm9tLiBUeXBpY2FsbHkgd2UgZG9uJ3Qgd2FudCBtb3JlIHRoYW4gNSBvciA2IGJyZWFrcy4gV2UgY2FuIGFsc28gc3dpdGNoIHRvIHVzaW5nIGBSQ29sb3JCcmV3ZXJgIGluc3RlYWQuCgpgYGB7ciwgbmhvb2QtcG9wLTN9CiMjIGNyZWF0ZSBicmVha3MKbmhvb2QgPC0gbWFwX2JyZWFrcygpCgojIyBtYXAgYmlubmVkIGRhdGEKcDcgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSAiI2ZmZmZmZiIsIGNvbG9yID0gTkEpICsKICBnZW9tX3NmKGRhdGEgPSBuaG9vZCwgbWFwcGluZyA9IGFlcyhmaWxsID0gKSkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSBOQSwgY29sb3IgPSAiIzJhMmEyYSIsIHNpemUgPSAuOSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUmRQdSIsIG5hbWUgPSAiUG9wdWxhdGlvbiBEZW5zaXR5XG5wZXIgU3F1YXJlIEtpbG9tZXRlciIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiMTk1MCBOZWlnaGJvcmhvb2QgUG9wdWxhdGlvbnMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBOSEdJUyBhbmQgQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaEQiCiAgKQoKcDcKYGBgCgpZb3UgY2FuIHVzZSB0aGUgYGRpc3BsYXkuYnJld2VyLmFsbCgpYCBmdW5jdGlvbiB0byBnZXQgYSBwcmV2aWV3IG9mIG90aGVyIG9wdGlvbnMgaW4gdGhlIGBSQ29sb3JCcmV3ZXJgIHBhY2thZ2UuIFRha2UgYSBmZXcgbWludXRlcyB0byBtb2RpZnkgYHA3YCB1c2luZyBkaWZmZXJlbnQgcGFsZXR0ZSBvcHRpb25zIGFuZCBhcHByb2FjaGVzIHRvIG1ha2luZyBicmVha3Mu
- - - -
- - - - - - - - - - - - - - - - diff --git a/examples/meeting-03-complete.Rmd b/examples/meeting-1-3-complete.Rmd similarity index 99% rename from examples/meeting-03-complete.Rmd rename to examples/meeting-1-3-complete.Rmd index 4ff4da6..9cbf1d1 100644 --- a/examples/meeting-03-complete.Rmd +++ b/examples/meeting-1-3-complete.Rmd @@ -1,5 +1,5 @@ --- -title: "Meeting-03 Meeting Notebook - Complete" +title: "Meeting 1-3 Notebook - Complete" author: "Christopher Prener, Ph.D." date: '(`r format(Sys.time(), "%B %d, %Y")`)' output: diff --git a/examples/meeting-03-complete.md b/examples/meeting-1-3-complete.md similarity index 77% rename from examples/meeting-03-complete.md rename to examples/meeting-1-3-complete.md index 751c37b..e653924 100644 --- a/examples/meeting-03-complete.md +++ b/examples/meeting-1-3-complete.md @@ -1,7 +1,7 @@ -Meeting-03 Meeting Notebook - Complete +Meeting 1-3 Notebook - Complete ================ Christopher Prener, Ph.D. -(February 15, 2021) +(February 07, 2022) ## Introduction @@ -14,25 +14,25 @@ This notebook requires the following packages: ``` r # tidyverse packages library(ggplot2) # static mapping - -# mapping packages -library(mapview) # preview spatial data ``` - ## GDAL version >= 3.1.0 | setting mapviewOptions(fgb = TRUE) + ## Warning in register(): Can't find generic `scale_type` in package ggplot2 to + ## register S3 method. ``` r +# mapping packages +library(mapview) # preview spatial data library(sf) # spatial tools ``` - ## Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1 + ## Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE ``` r # other packages library(here) # file path management ``` - ## here() starts at /Users/chris/GitHub/slu-soc5650/content/module-1-cartography + ## here() starts at /Users/prenercg/GitHub/slu-soc5650/module-1-cartography ``` r library(RColorBrewer) # color brewer palettes @@ -62,34 +62,40 @@ are included in the `data/exercise_data` folder: city <- st_read(here("data", "STL_BOUNDARY_City.geojson")) ``` - ## Reading layer `STL_BOUNDARY_City' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/data/STL_BOUNDARY_City.geojson' using driver `GeoJSON' + ## Reading layer `STL_BOUNDARY_City' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/data/STL_BOUNDARY_City.geojson' + ## using driver `GeoJSON' ## Simple feature collection with 1 feature and 2 fields - ## geometry type: MULTIPOLYGON - ## dimension: XY - ## bbox: xmin: 733360 ymin: 4268394 xmax: 746157.1 ymax: 4295511 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: MULTIPOLYGON + ## Dimension: XY + ## Bounding box: xmin: 733360 ymin: 4268394 xmax: 746157.1 ymax: 4295511 + ## Projected CRS: NAD83 / UTM zone 15N ``` r nhood <- st_read(here("data", "exercise_data", "STL_DEMOGRAPHICS_Nhoods", "STL_DEMOGRAPHICS_Nhoods.shp")) ``` - ## Reading layer `STL_DEMOGRAPHICS_Nhoods' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/data/exercise_data/STL_DEMOGRAPHICS_Nhoods/STL_DEMOGRAPHICS_Nhoods.shp' using driver `ESRI Shapefile' + ## Reading layer `STL_DEMOGRAPHICS_Nhoods' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/data/exercise_data/STL_DEMOGRAPHICS_Nhoods/STL_DEMOGRAPHICS_Nhoods.shp' + ## using driver `ESRI Shapefile' ## Simple feature collection with 79 features and 5 fields - ## geometry type: MULTIPOLYGON - ## dimension: XY - ## bbox: xmin: 733361.8 ymin: 4268512 xmax: 745417.9 ymax: 4295501 - ## projected CRS: UTM_Zone_15_Northern_Hemisphere + ## Geometry type: MULTIPOLYGON + ## Dimension: XY + ## Bounding box: xmin: 733361.8 ymin: 4268512 xmax: 745417.9 ymax: 4295501 + ## Projected CRS: UTM_Zone_15_Northern_Hemisphere ``` r historic <- st_read(here("data", "exercise_data", "STL_HISTORICAL_Districts", "STL_HISTORICAL_Districts.shp")) ``` - ## Reading layer `STL_HISTORICAL_Districts' from data source `/Users/chris/GitHub/slu-soc5650/content/module-1-cartography/data/exercise_data/STL_HISTORICAL_Districts/STL_HISTORICAL_Districts.shp' using driver `ESRI Shapefile' + ## Reading layer `STL_HISTORICAL_Districts' from data source + ## `/Users/prenercg/GitHub/slu-soc5650/module-1-cartography/data/exercise_data/STL_HISTORICAL_Districts/STL_HISTORICAL_Districts.shp' + ## using driver `ESRI Shapefile' ## Simple feature collection with 102 features and 4 fields - ## geometry type: MULTIPOLYGON - ## dimension: XY - ## bbox: xmin: 734470.2 ymin: 4269761 xmax: 745405.8 ymax: 4288348 - ## projected CRS: NAD83 / UTM zone 15N + ## Geometry type: MULTIPOLYGON + ## Dimension: XY + ## Bounding box: xmin: 734470.2 ymin: 4269761 xmax: 745405.8 ymax: 4288348 + ## Projected CRS: NAD83 / UTM zone 15N ## Manually Applying Colors @@ -110,7 +116,7 @@ p1 <- ggplot() + p1 ``` -![](meeting-03-complete_files/figure-gfm/historic-districts-1-1.png) +![](meeting-1-3-complete_files/figure-gfm/historic-districts-1-1.png) Now, take a moment and use [ColorHexa.com](https://www.colorhexa.com) to change the fill to a *cool* color and select a darker shade of gray for @@ -128,7 +134,7 @@ p2 <- ggplot() + p2 ``` -![](meeting-03-complete_files/figure-gfm/historic-districts-2-1.png) +![](meeting-1-3-complete_files/figure-gfm/historic-districts-2-1.png) ## Layering with ggplot2 @@ -150,7 +156,7 @@ p3 <- ggplot() + p3 ``` -![](meeting-03-complete_files/figure-gfm/historic-districts-3-1.png) +![](meeting-1-3-complete_files/figure-gfm/historic-districts-3-1.png) Next, we’ll overlay the historic districts on the City’s neighborhood boundaries to add some additional context. We’ll set the fill for the @@ -174,7 +180,7 @@ p4 <- ggplot() + p4 ``` -![](meeting-03-complete_files/figure-gfm/historic-districts-4-1.png) +![](meeting-1-3-complete_files/figure-gfm/historic-districts-4-1.png) ## Thematic Mapping with viridis and Color Brewer @@ -199,7 +205,7 @@ p5 <- ggplot() + p5 ``` -![](meeting-03-complete_files/figure-gfm/nhood-pop-1-1.png) +![](meeting-1-3-complete_files/figure-gfm/nhood-pop-1-1.png) The viridis package contains four other palettes: “magma”, “plasma”, and “inferno” all look somewhat similar, and then the alternate “cividis” @@ -221,7 +227,7 @@ p6 <- ggplot() + p6 ``` -![](meeting-03-complete_files/figure-gfm/nhood-pop-2-1.png) +![](meeting-1-3-complete_files/figure-gfm/nhood-pop-2-1.png) This map is a bit hard to read because the color ramp is continuous. We can bin our data using one of a number of algorithms - “equal”, @@ -249,7 +255,7 @@ p7 <- ggplot() + p7 ``` -![](meeting-03-complete_files/figure-gfm/nhood-pop-3-1.png) +![](meeting-1-3-complete_files/figure-gfm/nhood-pop-3-1.png) You can use the `display.brewer.all()` function to get a preview of other options in the `RColorBrewer` package. Take a few minutes to diff --git a/examples/meeting-1-3-complete.nb.html b/examples/meeting-1-3-complete.nb.html new file mode 100644 index 0000000..15ae9e5 --- /dev/null +++ b/examples/meeting-1-3-complete.nb.html @@ -0,0 +1,2053 @@ + + + + + + + + + + + + + + +Meeting 1-3 Notebook - Complete + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+

Introduction

+

This notebook provides a walk-through of the example code used in +class.

+
+
+

Dependencies

+

This notebook requires the following packages:

+ + + +
# tidyverse packages
+library(ggplot2)       # static mapping
+
+# mapping packages
+library(mapview)      # preview spatial data
+library(sf)           # spatial tools
+
+# other packages
+library(here)         # file path management
+library(RColorBrewer) # color brewer palettes
+library(viridis)      # viridis color palettes
+ + + +

We’ll also need a custom function that Chris has written for creating +map breaks:

+ + + +
source(here("source", "map_breaks.R"))
+ + + +

The source() function executes “R script” files, which +can either be used to define functions used in a project or run a subset +of other code contained in that file.

+
+
+

Load Data

+

We’ll be using two sets of data today, neighborhood boundaries and +the regions of St. Louis City that are historic districts. Both data +sets are included in the data/exercise_data folder:

+ + + +
city <- st_read(here("data", "STL_BOUNDARY_City.geojson"))
+nhood <- st_read(here("data", "exercise_data", "STL_DEMOGRAPHICS_Nhoods", "STL_DEMOGRAPHICS_Nhoods.shp"))
+historic <- st_read(here("data", "exercise_data", "STL_HISTORICAL_Districts", "STL_HISTORICAL_Districts.shp"))
+ + + +
+
+

Manually Applying Colors

+

One task when we are working with multi-layer maps is arbitrarily +setting the colors we assign to a given layer. We can use the +fill argument in geom_sf outside of +an aesthetic mapping to set the fill, and the color +argument to set the hue of the border colors.

+ + + +
p1 <- ggplot() +
+  geom_sf(data = historic, fill = "#ffe4e1", color = "#a9a9a9") +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p1
+ + + +

Now, take a moment and use ColorHexa.com to change the fill to +a cool color and select a darker shade of gray for the +border:

+ + + +
p2 <- ggplot() +
+  geom_sf(data = historic, fill = "#e1edff", color = "#838383") +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p2
+ + + +
+
+

Layering with ggplot2

+

The maps we made above help identify the historic districts, but they +are devoid of context because the lack the boundary for the City of +St. Louis. Let’s go ahead an add that. We’ll set the fill for the city +boundary to white so that our historic districts really stand out.

+ + + +
p3 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff") +
+  geom_sf(data = historic, fill = "#e1edff", color = "#646464") +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p3
+ + + +

Next, we’ll overlay the historic districts on the City’s neighborhood +boundaries to add some additional context. We’ll set the fill for the +neighborhood boundaries to NA so that they are hollow, use +a light gray color, and set the size to .2 so that they are +thinner than the default width. Finally, we’ll add the city +data on top as well so that the City’s boundary stands out.

+ + + +
p4 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff") +
+  geom_sf(data = nhood, fill = NA, color = "#a9a9a9", size = .2) +
+  geom_sf(data = historic, fill = "#e1edff", color = "#646464") +
+  geom_sf(data = city, fill = NA) +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p4
+ + + +
+
+

Thematic Mapping with viridis and Color Brewer

+

The other topic for this week is to create maps that have different +color ramps. Last week, we introduce the virids color +palettes. We can illustrate that for review by mapping the 1950 +populations of St. Louis’s neighborhoods, with the addition of a ground +layer representing the city boundary:

+ + + +
p5 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff", color = NA) +
+  geom_sf(data = nhood, mapping = aes(fill = pop50_den)) +
+  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
+  scale_fill_viridis(name = "Population Density\nper Square Kilometer") +
+  labs(
+    title = "1950 Neighborhood Populations",
+    subtitle = "City of St. Louis",
+    caption = "Data via NHGIS and Christopher Prener, PhD"
+  )
+
+p5
+ + + +

The viridis package contains four other palettes: “magma”, “plasma”, +and “inferno” all look somewhat similar, and then the alternate +“cividis” palette. You can specify them with the option +argument in scale_fill_viridis:

+ + + +
p6 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff", color = NA) +
+  geom_sf(data = nhood, mapping = aes(fill = pop50_den)) +
+  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
+  scale_fill_viridis(option = "magma", name = "Population Density\nper Square Kilometer") +
+  labs(
+    title = "1950 Neighborhood Populations",
+    subtitle = "City of St. Louis",
+    caption = "Data via NHGIS and Christopher Prener, PhD"
+  )
+
+p6
+ + + +

This map is a bit hard to read because the color ramp is continuous. +We can bin our data using one of a number of algorithms - “equal”, +“pretty”, “quantile”, “fisher”, and “jenks” are the best options to +choose from. Typically we don’t want more than 5 or 6 breaks. We can +also switch to using RColorBrewer instead.

+ + + +
## create breaks
+nhood <- map_breaks(nhood, var = "pop50_den", newvar = "map_breaks",
+                    style = "quantile", classes = 5, dig_lab = 5)
+
+## map binned data
+p7 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff", color = NA) +
+  geom_sf(data = nhood, mapping = aes(fill = map_breaks)) +
+  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
+  scale_fill_brewer(palette = "RdPu", name = "Population Density\nper Square Kilometer") +
+  labs(
+    title = "1950 Neighborhood Populations",
+    subtitle = "City of St. Louis",
+    caption = "Data via NHGIS and Christopher Prener, PhD"
+  )
+
+p7
+ + + +

You can use the display.brewer.all() function to get a +preview of other options in the RColorBrewer package. Take +a few minutes to modify p7 using different palette options +and approaches to making breaks.

+ +
+ +
LS0tCnRpdGxlOiAiTWVldGluZyAxLTMgTm90ZWJvb2sgLSBDb21wbGV0ZSIKYXV0aG9yOiAiQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaC5ELiIKZGF0ZTogJyhgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVCICVkLCAlWSIpYCknCm91dHB1dDogCiAgZ2l0aHViX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdCAKYWx3YXlzX2FsbG93X2h0bWw6IHllcwotLS0KCiMjIEludHJvZHVjdGlvbgpUaGlzIG5vdGVib29rIHByb3ZpZGVzIGEgd2Fsay10aHJvdWdoIG9mIHRoZSBleGFtcGxlIGNvZGUgdXNlZCBpbiBjbGFzcy4KCiMjIERlcGVuZGVuY2llcwpUaGlzIG5vdGVib29rIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6CgpgYGB7ciBsb2FkLXBhY2thZ2VzfQojIHRpZHl2ZXJzZSBwYWNrYWdlcwpsaWJyYXJ5KGdncGxvdDIpICAgICAgICMgc3RhdGljIG1hcHBpbmcKCiMgbWFwcGluZyBwYWNrYWdlcwpsaWJyYXJ5KG1hcHZpZXcpICAgICAgIyBwcmV2aWV3IHNwYXRpYWwgZGF0YQpsaWJyYXJ5KHNmKSAgICAgICAgICAgIyBzcGF0aWFsIHRvb2xzCgojIG90aGVyIHBhY2thZ2VzCmxpYnJhcnkoaGVyZSkgICAgICAgICAjIGZpbGUgcGF0aCBtYW5hZ2VtZW50CmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIGNvbG9yIGJyZXdlciBwYWxldHRlcwpsaWJyYXJ5KHZpcmlkaXMpICAgICAgIyB2aXJpZGlzIGNvbG9yIHBhbGV0dGVzCmBgYAoKV2UnbGwgYWxzbyBuZWVkIGEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgQ2hyaXMgaGFzIHdyaXR0ZW4gZm9yIGNyZWF0aW5nIG1hcCBicmVha3M6IAoKYGBge3IgbG9hZC1mdW5jdGlvbnN9CnNvdXJjZShoZXJlKCJzb3VyY2UiLCAibWFwX2JyZWFrcy5SIikpCmBgYAoKVGhlIGBzb3VyY2UoKWAgZnVuY3Rpb24gZXhlY3V0ZXMgIlIgc2NyaXB0IiBmaWxlcywgd2hpY2ggY2FuIGVpdGhlciBiZSB1c2VkIHRvIGRlZmluZSBmdW5jdGlvbnMgdXNlZCBpbiBhIHByb2plY3Qgb3IgcnVuIGEgc3Vic2V0IG9mIG90aGVyIGNvZGUgY29udGFpbmVkIGluIHRoYXQgZmlsZS4KCiMjIExvYWQgRGF0YQpXZSdsbCBiZSB1c2luZyB0d28gc2V0cyBvZiBkYXRhIHRvZGF5LCBuZWlnaGJvcmhvb2QgYm91bmRhcmllcyBhbmQgdGhlIHJlZ2lvbnMgb2YgU3QuIExvdWlzIENpdHkgdGhhdCBhcmUgaGlzdG9yaWMgZGlzdHJpY3RzLiBCb3RoIGRhdGEgc2V0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGBkYXRhL2V4ZXJjaXNlX2RhdGFgIGZvbGRlcjoKCmBgYHtyIGxvYWQtZGF0YX0KY2l0eSA8LSBzdF9yZWFkKGhlcmUoImRhdGEiLCAiU1RMX0JPVU5EQVJZX0NpdHkuZ2VvanNvbiIpKQpuaG9vZCA8LSBzdF9yZWFkKGhlcmUoImRhdGEiLCAiZXhlcmNpc2VfZGF0YSIsICJTVExfREVNT0dSQVBISUNTX05ob29kcyIsICJTVExfREVNT0dSQVBISUNTX05ob29kcy5zaHAiKSkKaGlzdG9yaWMgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgImV4ZXJjaXNlX2RhdGEiLCAiU1RMX0hJU1RPUklDQUxfRGlzdHJpY3RzIiwgIlNUTF9ISVNUT1JJQ0FMX0Rpc3RyaWN0cy5zaHAiKSkKYGBgCiMjIE1hbnVhbGx5IEFwcGx5aW5nIENvbG9ycwpPbmUgdGFzayB3aGVuIHdlIGFyZSB3b3JraW5nIHdpdGggbXVsdGktbGF5ZXIgbWFwcyBpcyBhcmJpdHJhcmlseSBzZXR0aW5nIHRoZSBjb2xvcnMgd2UgYXNzaWduIHRvIGEgZ2l2ZW4gbGF5ZXIuIFdlIGNhbiB1c2UgdGhlIGBmaWxsYCBhcmd1bWVudCBpbiBgZ2VvbV9zZmAgKm91dHNpZGUqIG9mIGFuIGFlc3RoZXRpYyBtYXBwaW5nIHRvIHNldCB0aGUgZmlsbCwgYW5kIHRoZSBgY29sb3JgIGFyZ3VtZW50IHRvIHNldCB0aGUgaHVlIG9mIHRoZSBib3JkZXIgY29sb3JzLgoKYGBge3IgaGlzdG9yaWMtZGlzdHJpY3RzLTF9CnAxIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBoaXN0b3JpYywgZmlsbCA9ICIjZmZlNGUxIiwgY29sb3IgPSAiI2E5YTlhOSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDEKYGBgCgpOb3csIHRha2UgYSBtb21lbnQgYW5kIHVzZSBbQ29sb3JIZXhhLmNvbV0oaHR0cHM6Ly93d3cuY29sb3JoZXhhLmNvbSkgdG8gY2hhbmdlIHRoZSBmaWxsIHRvIGEgKmNvb2wqIGNvbG9yIGFuZCBzZWxlY3QgYSBkYXJrZXIgc2hhZGUgb2YgZ3JheSBmb3IgdGhlIGJvcmRlcjoKCmBgYHtyIGhpc3RvcmljLWRpc3RyaWN0cy0yfQpwMiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gaGlzdG9yaWMsIGZpbGwgPSAiI2UxZWRmZiIsIGNvbG9yID0gIiM4MzgzODMiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhpc3RvcmljIERpc3RyaWN0cyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIENpdHkgb2YgU3QuIExvdWlzIgogICkKCnAyCmBgYAoKIyMgTGF5ZXJpbmcgd2l0aCBnZ3Bsb3QyClRoZSBtYXBzIHdlIG1hZGUgYWJvdmUgaGVscCBpZGVudGlmeSB0aGUgaGlzdG9yaWMgZGlzdHJpY3RzLCBidXQgdGhleSBhcmUgZGV2b2lkIG9mIGNvbnRleHQgYmVjYXVzZSB0aGUgbGFjayB0aGUgYm91bmRhcnkgZm9yIHRoZSBDaXR5IG9mIFN0LiBMb3Vpcy4gTGV0J3MgZ28gYWhlYWQgYW4gYWRkIHRoYXQuIFdlJ2xsIHNldCB0aGUgZmlsbCBmb3IgdGhlIGNpdHkgYm91bmRhcnkgdG8gd2hpdGUgc28gdGhhdCBvdXIgaGlzdG9yaWMgZGlzdHJpY3RzIHJlYWxseSBzdGFuZCBvdXQuCgpgYGB7ciBoaXN0b3JpYy1kaXN0cmljdHMtM30KcDMgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSAiI2ZmZmZmZiIpICsKICBnZW9tX3NmKGRhdGEgPSBoaXN0b3JpYywgZmlsbCA9ICIjZTFlZGZmIiwgY29sb3IgPSAiIzY0NjQ2NCIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDMKYGBgCgpOZXh0LCB3ZSdsbCBvdmVybGF5IHRoZSBoaXN0b3JpYyBkaXN0cmljdHMgb24gdGhlIENpdHkncyBuZWlnaGJvcmhvb2QgYm91bmRhcmllcyB0byBhZGQgc29tZSBhZGRpdGlvbmFsIGNvbnRleHQuIFdlJ2xsIHNldCB0aGUgZmlsbCBmb3IgdGhlIG5laWdoYm9yaG9vZCBib3VuZGFyaWVzIHRvIGBOQWAgc28gdGhhdCB0aGV5IGFyZSBob2xsb3csIHVzZSBhIGxpZ2h0IGdyYXkgY29sb3IsIGFuZCBzZXQgdGhlIHNpemUgdG8gYC4yYCBzbyB0aGF0IHRoZXkgYXJlIHRoaW5uZXIgdGhhbiB0aGUgZGVmYXVsdCB3aWR0aC4gRmluYWxseSwgd2UnbGwgYWRkIHRoZSBgY2l0eWAgZGF0YSBvbiB0b3AgYXMgd2VsbCBzbyB0aGF0IHRoZSBDaXR5J3MgYm91bmRhcnkgc3RhbmRzIG91dC4KCmBgYHtyIGhpc3RvcmljLWRpc3RyaWN0cy00fQpwNCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9ICIjZmZmZmZmIikgKwogIGdlb21fc2YoZGF0YSA9IG5ob29kLCBmaWxsID0gTkEsIGNvbG9yID0gIiNhOWE5YTkiLCBzaXplID0gLjIpICsKICBnZW9tX3NmKGRhdGEgPSBoaXN0b3JpYywgZmlsbCA9ICIjZTFlZGZmIiwgY29sb3IgPSAiIzY0NjQ2NCIpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gTkEpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDQKYGBgCgojIyBUaGVtYXRpYyBNYXBwaW5nIHdpdGggdmlyaWRpcyBhbmQgQ29sb3IgQnJld2VyClRoZSBvdGhlciB0b3BpYyBmb3IgdGhpcyB3ZWVrIGlzIHRvIGNyZWF0ZSBtYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgY29sb3IgcmFtcHMuIExhc3Qgd2Vlaywgd2UgaW50cm9kdWNlIHRoZSBgdmlyaWRzYCBjb2xvciBwYWxldHRlcy4gV2UgY2FuIGlsbHVzdHJhdGUgdGhhdCBmb3IgcmV2aWV3IGJ5IG1hcHBpbmcgdGhlIDE5NTAgcG9wdWxhdGlvbnMgb2YgU3QuIExvdWlzJ3MgbmVpZ2hib3Job29kcywgd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBncm91bmQgbGF5ZXIgcmVwcmVzZW50aW5nIHRoZSBjaXR5IGJvdW5kYXJ5OgoKYGBge3IsIG5ob29kLXBvcC0xfQpwNSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9ICIjZmZmZmZmIiwgY29sb3IgPSBOQSkgKwogIGdlb21fc2YoZGF0YSA9IG5ob29kLCBtYXBwaW5nID0gYWVzKGZpbGwgPSBwb3A1MF9kZW4pKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC45KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWUgPSAiUG9wdWxhdGlvbiBEZW5zaXR5XG5wZXIgU3F1YXJlIEtpbG9tZXRlciIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiMTk1MCBOZWlnaGJvcmhvb2QgUG9wdWxhdGlvbnMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBOSEdJUyBhbmQgQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaEQiCiAgKQoKcDUKYGBgCgpUaGUgdmlyaWRpcyBwYWNrYWdlIGNvbnRhaW5zIGZvdXIgb3RoZXIgcGFsZXR0ZXM6ICJtYWdtYSIsICJwbGFzbWEiLCBhbmQgImluZmVybm8iIGFsbCBsb29rIHNvbWV3aGF0IHNpbWlsYXIsIGFuZCB0aGVuIHRoZSBhbHRlcm5hdGUgImNpdmlkaXMiIHBhbGV0dGUuIFlvdSBjYW4gc3BlY2lmeSB0aGVtIHdpdGggdGhlIGBvcHRpb25gIGFyZ3VtZW50IGluIGBzY2FsZV9maWxsX3ZpcmlkaXNgOgoKYGBge3IsIG5ob29kLXBvcC0yfQpwNiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9ICIjZmZmZmZmIiwgY29sb3IgPSBOQSkgKwogIGdlb21fc2YoZGF0YSA9IG5ob29kLCBtYXBwaW5nID0gYWVzKGZpbGwgPSBwb3A1MF9kZW4pKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC45KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJtYWdtYSIsIG5hbWUgPSAiUG9wdWxhdGlvbiBEZW5zaXR5XG5wZXIgU3F1YXJlIEtpbG9tZXRlciIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiMTk1MCBOZWlnaGJvcmhvb2QgUG9wdWxhdGlvbnMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBOSEdJUyBhbmQgQ2hyaXN0b3BoZXIgUHJlbmVyLCBQaEQiCiAgKQoKcDYKYGBgCgpUaGlzIG1hcCBpcyBhIGJpdCBoYXJkIHRvIHJlYWQgYmVjYXVzZSB0aGUgY29sb3IgcmFtcCBpcyBjb250aW51b3VzLiBXZSBjYW4gYmluIG91ciBkYXRhIHVzaW5nIG9uZSBvZiBhIG51bWJlciBvZiBhbGdvcml0aG1zIC0gImVxdWFsIiwgInByZXR0eSIsICJxdWFudGlsZSIsICJmaXNoZXIiLCBhbmQgImplbmtzIiBhcmUgdGhlIGJlc3Qgb3B0aW9ucyB0byBjaG9vc2UgZnJvbS4gVHlwaWNhbGx5IHdlIGRvbid0IHdhbnQgbW9yZSB0aGFuIDUgb3IgNiBicmVha3MuIFdlIGNhbiBhbHNvIHN3aXRjaCB0byB1c2luZyBgUkNvbG9yQnJld2VyYCBpbnN0ZWFkLgoKYGBge3IsIG5ob29kLXBvcC0zfQojIyBjcmVhdGUgYnJlYWtzCm5ob29kIDwtIG1hcF9icmVha3Mobmhvb2QsIHZhciA9ICJwb3A1MF9kZW4iLCBuZXd2YXIgPSAibWFwX2JyZWFrcyIsCiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLCBjbGFzc2VzID0gNSwgZGlnX2xhYiA9IDUpCgojIyBtYXAgYmlubmVkIGRhdGEKcDcgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNpdHksIGZpbGwgPSAiI2ZmZmZmZiIsIGNvbG9yID0gTkEpICsKICBnZW9tX3NmKGRhdGEgPSBuaG9vZCwgbWFwcGluZyA9IGFlcyhmaWxsID0gbWFwX2JyZWFrcykpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gTkEsIGNvbG9yID0gIiMyYTJhMmEiLCBzaXplID0gLjkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlJkUHUiLCBuYW1lID0gIlBvcHVsYXRpb24gRGVuc2l0eVxucGVyIFNxdWFyZSBLaWxvbWV0ZXIiKSArCiAgbGFicygKICAgIHRpdGxlID0gIjE5NTAgTmVpZ2hib3Job29kIFBvcHVsYXRpb25zIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgTkhHSVMgYW5kIENocmlzdG9waGVyIFByZW5lciwgUGhEIgogICkKCnA3CmBgYAoKWW91IGNhbiB1c2UgdGhlIGBkaXNwbGF5LmJyZXdlci5hbGwoKWAgZnVuY3Rpb24gdG8gZ2V0IGEgcHJldmlldyBvZiBvdGhlciBvcHRpb25zIGluIHRoZSBgUkNvbG9yQnJld2VyYCBwYWNrYWdlLiBUYWtlIGEgZmV3IG1pbnV0ZXMgdG8gbW9kaWZ5IGBwN2AgdXNpbmcgZGlmZmVyZW50IHBhbGV0dGUgb3B0aW9ucyBhbmQgYXBwcm9hY2hlcyB0byBtYWtpbmcgYnJlYWtzLgo=
+ + + +
+ + + + + + + + + + + + + + + + diff --git a/examples/meeting-03-complete_files/figure-gfm/historic-districts-1-1.png b/examples/meeting-1-3-complete_files/figure-gfm/historic-districts-1-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/historic-districts-1-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/historic-districts-1-1.png diff --git a/examples/meeting-03-complete_files/figure-gfm/historic-districts-2-1.png b/examples/meeting-1-3-complete_files/figure-gfm/historic-districts-2-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/historic-districts-2-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/historic-districts-2-1.png diff --git a/examples/meeting-03-complete_files/figure-gfm/historic-districts-3-1.png b/examples/meeting-1-3-complete_files/figure-gfm/historic-districts-3-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/historic-districts-3-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/historic-districts-3-1.png diff --git a/examples/meeting-03-complete_files/figure-gfm/historic-districts-4-1.png b/examples/meeting-1-3-complete_files/figure-gfm/historic-districts-4-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/historic-districts-4-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/historic-districts-4-1.png diff --git a/examples/meeting-03-complete_files/figure-gfm/nhood-pop-1-1.png b/examples/meeting-1-3-complete_files/figure-gfm/nhood-pop-1-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/nhood-pop-1-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/nhood-pop-1-1.png diff --git a/examples/meeting-03-complete_files/figure-gfm/nhood-pop-2-1.png b/examples/meeting-1-3-complete_files/figure-gfm/nhood-pop-2-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/nhood-pop-2-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/nhood-pop-2-1.png diff --git a/examples/meeting-03-complete_files/figure-gfm/nhood-pop-3-1.png b/examples/meeting-1-3-complete_files/figure-gfm/nhood-pop-3-1.png similarity index 100% rename from examples/meeting-03-complete_files/figure-gfm/nhood-pop-3-1.png rename to examples/meeting-1-3-complete_files/figure-gfm/nhood-pop-3-1.png diff --git a/examples/meeting-03.Rmd b/examples/meeting-1-3.Rmd similarity index 99% rename from examples/meeting-03.Rmd rename to examples/meeting-1-3.Rmd index fd13eda..cb96824 100644 --- a/examples/meeting-03.Rmd +++ b/examples/meeting-1-3.Rmd @@ -1,5 +1,5 @@ --- -title: "Meeting-03 Meeting Notebook" +title: "Meeting 1-3 Notebook" author: "Christopher Prener, Ph.D." date: '(`r format(Sys.time(), "%B %d, %Y")`)' output: @@ -163,4 +163,4 @@ p7 <- ggplot() + p7 ``` -You can use the `display.brewer.all()` function to get a preview of other options in the `RColorBrewer` package. Take a few minutes to modify `p7` using different palette options and approaches to making breaks. \ No newline at end of file +You can use the `display.brewer.all()` function to get a preview of other options in the `RColorBrewer` package. Take a few minutes to modify `p7` using different palette options and approaches to making breaks. diff --git a/examples/meeting-1-3.nb.html b/examples/meeting-1-3.nb.html new file mode 100644 index 0000000..a68bd79 --- /dev/null +++ b/examples/meeting-1-3.nb.html @@ -0,0 +1,2052 @@ + + + + + + + + + + + + + + +Meeting 1-3 Notebook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+

Introduction

+

This notebook provides a walk-through of the example code used in +class.

+
+
+

Dependencies

+

This notebook requires the following packages:

+ + + +
# tidyverse packages
+library(ggplot2)       # static mapping
+
+# mapping packages
+library(mapview)      # preview spatial data
+library(sf)           # spatial tools
+
+# other packages
+library(here)         # file path management
+library(RColorBrewer) # color brewer palettes
+library(viridis)      # viridis color palettes
+ + + +

We’ll also need a custom function that Chris has written for creating +map breaks:

+ + + +
source(here("source", "map_breaks.R"))
+ + + +

The source() function executes “R script” files, which +can either be used to define functions used in a project or run a subset +of other code contained in that file.

+
+
+

Load Data

+

We’ll be using two sets of data today, neighborhood boundaries and +the regions of St. Louis City that are historic districts. Both data +sets are included in the data/exercise_data folder:

+ + + +
city <- st_read(here("data", "STL_BOUNDARY_City.geojson"))
+nhood <- st_read(here("data", "exercise_data", "STL_DEMOGRAPHICS_Nhoods", "STL_DEMOGRAPHICS_Nhoods.shp"))
+historic <- st_read(here("data", "exercise_data", "STL_HISTORICAL_Districts", "STL_HISTORICAL_Districts.shp"))
+ + + +
+
+

Manually Applying Colors

+

One task when we are working with multi-layer maps is arbitrarily +setting the colors we assign to a given layer. We can use the +fill argument in geom_sf outside of +an aesthetic mapping to set the fill, and the color +argument to set the hue of the border colors.

+ + + +
p1 <- ggplot() +
+  geom_sf(data = historic, fill = "#ffe4e1", color = "#a9a9a9") +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p1
+ + + +

Now, take a moment and use ColorHexa.com to change the fill to +a cool color and select a darker shade of gray for the +border:

+ + + +
p2 <- ggplot() +
+  geom_sf(data = historic, fill = , color = ) +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p2
+ + + +
+
+

Layering with ggplot2

+

The maps we made above help identify the historic districts, but they +are devoid of context because the lack the boundary for the City of +St. Louis. Let’s go ahead an add that. We’ll set the fill for the city +boundary to white so that our historic districts really stand out.

+ + + +
p3 <- ggplot() +
+  geom_sf() +
+  geom_sf() +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p3
+ + + +

Next, we’ll overlay the historic districts on the City’s neighborhood +boundaries to add some additional context. We’ll set the fill for the +neighborhood boundaries to NA so that they are hollow, use +a light gray color, and set the size to .2 so that they are +thinner than the default width. Finally, we’ll add the city +data on top as well so that the City’s boundary stands out.

+ + + +
p4 <- ggplot() +
+  geom_sf() +
+  geom_sf() +
+  geom_sf() +
+  geom_sf() +
+  labs(
+    title = "Historic Districts",
+    subtitle = "City of St. Louis",
+    caption = "Data via City of St. Louis"
+  )
+
+p4
+ + + +
+
+

Thematic Mapping with viridis and Color Brewer

+

The other topic for this week is to create maps that have different +color ramps. Last week, we introduce the virids color +palettes. We can illustrate that for review by mapping the 1950 +populations of St. Louis’s neighborhoods, with the addition of a ground +layer representing the city boundary:

+ + + +
p5 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff", color = NA) +
+  geom_sf() +
+  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
+  scale_fill_viridis(name = "Population Density\nper Square Kilometer") +
+  labs(
+    title = "1950 Neighborhood Populations",
+    subtitle = "City of St. Louis",
+    caption = "Data via NHGIS and Christopher Prener, PhD"
+  )
+
+p5
+ + + +

The viridis package contains four other palettes: “magma”, “plasma”, +and “inferno” all look somewhat similar, and then the alternate +“cividis” palette. You can specify them with the option +argument in scale_fill_viridis:

+ + + +
p6 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff", color = NA) +
+  geom_sf(data = nhood, mapping = aes(fill = pop50_den)) +
+  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
+  scale_fill_viridis(option = , name = "Population Density\nper Square Kilometer") +
+  labs(
+    title = "1950 Neighborhood Populations",
+    subtitle = "City of St. Louis",
+    caption = "Data via NHGIS and Christopher Prener, PhD"
+  )
+
+p6
+ + + +

This map is a bit hard to read because the color ramp is continuous. +We can bin our data using one of a number of algorithms - “equal”, +“pretty”, “quantile”, “fisher”, and “jenks” are the best options to +choose from. Typically we don’t want more than 5 or 6 breaks. We can +also switch to using RColorBrewer instead.

+ + + +
## create breaks
+nhood <- map_breaks()
+
+## map binned data
+p7 <- ggplot() +
+  geom_sf(data = city, fill = "#ffffff", color = NA) +
+  geom_sf(data = nhood, mapping = aes(fill = )) +
+  geom_sf(data = city, fill = NA, color = "#2a2a2a", size = .9) +
+  scale_fill_brewer(palette = "RdPu", name = "Population Density\nper Square Kilometer") +
+  labs(
+    title = "1950 Neighborhood Populations",
+    subtitle = "City of St. Louis",
+    caption = "Data via NHGIS and Christopher Prener, PhD"
+  )
+
+p7
+ + + +

You can use the display.brewer.all() function to get a +preview of other options in the RColorBrewer package. Take +a few minutes to modify p7 using different palette options +and approaches to making breaks.

+ +
+ +
LS0tCnRpdGxlOiAiTWVldGluZyAxLTMgTm90ZWJvb2siCmF1dGhvcjogIkNocmlzdG9waGVyIFByZW5lciwgUGguRC4iCmRhdGU6ICcoYHIgZm9ybWF0KFN5cy50aW1lKCksICIlQiAlZCwgJVkiKWApJwpvdXRwdXQ6IAogIGdpdGh1Yl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQgCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgojIyBJbnRyb2R1Y3Rpb24KVGhpcyBub3RlYm9vayBwcm92aWRlcyBhIHdhbGstdGhyb3VnaCBvZiB0aGUgZXhhbXBsZSBjb2RlIHVzZWQgaW4gY2xhc3MuCgojIyBEZXBlbmRlbmNpZXMKVGhpcyBub3RlYm9vayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgoKYGBge3IgbG9hZC1wYWNrYWdlc30KIyB0aWR5dmVyc2UgcGFja2FnZXMKbGlicmFyeShnZ3Bsb3QyKSAgICAgICAjIHN0YXRpYyBtYXBwaW5nCgojIG1hcHBpbmcgcGFja2FnZXMKbGlicmFyeShtYXB2aWV3KSAgICAgICMgcHJldmlldyBzcGF0aWFsIGRhdGEKbGlicmFyeShzZikgICAgICAgICAgICMgc3BhdGlhbCB0b29scwoKIyBvdGhlciBwYWNrYWdlcwpsaWJyYXJ5KGhlcmUpICAgICAgICAgIyBmaWxlIHBhdGggbWFuYWdlbWVudApsaWJyYXJ5KFJDb2xvckJyZXdlcikgIyBjb2xvciBicmV3ZXIgcGFsZXR0ZXMKbGlicmFyeSh2aXJpZGlzKSAgICAgICMgdmlyaWRpcyBjb2xvciBwYWxldHRlcwpgYGAKCldlJ2xsIGFsc28gbmVlZCBhIGN1c3RvbSBmdW5jdGlvbiB0aGF0IENocmlzIGhhcyB3cml0dGVuIGZvciBjcmVhdGluZyBtYXAgYnJlYWtzOiAKCmBgYHtyIGxvYWQtZnVuY3Rpb25zfQpzb3VyY2UoaGVyZSgic291cmNlIiwgIm1hcF9icmVha3MuUiIpKQpgYGAKClRoZSBgc291cmNlKClgIGZ1bmN0aW9uIGV4ZWN1dGVzICJSIHNjcmlwdCIgZmlsZXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgdXNlZCB0byBkZWZpbmUgZnVuY3Rpb25zIHVzZWQgaW4gYSBwcm9qZWN0IG9yIHJ1biBhIHN1YnNldCBvZiBvdGhlciBjb2RlIGNvbnRhaW5lZCBpbiB0aGF0IGZpbGUuCgojIyBMb2FkIERhdGEKV2UnbGwgYmUgdXNpbmcgdHdvIHNldHMgb2YgZGF0YSB0b2RheSwgbmVpZ2hib3Job29kIGJvdW5kYXJpZXMgYW5kIHRoZSByZWdpb25zIG9mIFN0LiBMb3VpcyBDaXR5IHRoYXQgYXJlIGhpc3RvcmljIGRpc3RyaWN0cy4gQm90aCBkYXRhIHNldHMgYXJlIGluY2x1ZGVkIGluIHRoZSBgZGF0YS9leGVyY2lzZV9kYXRhYCBmb2xkZXI6CgpgYGB7ciBsb2FkLWRhdGF9CmNpdHkgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgIlNUTF9CT1VOREFSWV9DaXR5Lmdlb2pzb24iKSkKbmhvb2QgPC0gc3RfcmVhZChoZXJlKCJkYXRhIiwgImV4ZXJjaXNlX2RhdGEiLCAiU1RMX0RFTU9HUkFQSElDU19OaG9vZHMiLCAiU1RMX0RFTU9HUkFQSElDU19OaG9vZHMuc2hwIikpCmhpc3RvcmljIDwtIHN0X3JlYWQoaGVyZSgiZGF0YSIsICJleGVyY2lzZV9kYXRhIiwgIlNUTF9ISVNUT1JJQ0FMX0Rpc3RyaWN0cyIsICJTVExfSElTVE9SSUNBTF9EaXN0cmljdHMuc2hwIikpCmBgYAoKIyMgTWFudWFsbHkgQXBwbHlpbmcgQ29sb3JzCk9uZSB0YXNrIHdoZW4gd2UgYXJlIHdvcmtpbmcgd2l0aCBtdWx0aS1sYXllciBtYXBzIGlzIGFyYml0cmFyaWx5IHNldHRpbmcgdGhlIGNvbG9ycyB3ZSBhc3NpZ24gdG8gYSBnaXZlbiBsYXllci4gV2UgY2FuIHVzZSB0aGUgYGZpbGxgIGFyZ3VtZW50IGluIGBnZW9tX3NmYCAqb3V0c2lkZSogb2YgYW4gYWVzdGhldGljIG1hcHBpbmcgdG8gc2V0IHRoZSBmaWxsLCBhbmQgdGhlIGBjb2xvcmAgYXJndW1lbnQgdG8gc2V0IHRoZSBodWUgb2YgdGhlIGJvcmRlciBjb2xvcnMuCgpgYGB7ciBoaXN0b3JpYy1kaXN0cmljdHMtMX0KcDEgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGhpc3RvcmljLCBmaWxsID0gIiNmZmU0ZTEiLCBjb2xvciA9ICIjYTlhOWE5IikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJIaXN0b3JpYyBEaXN0cmljdHMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBDaXR5IG9mIFN0LiBMb3VpcyIKICApCgpwMQpgYGAKCk5vdywgdGFrZSBhIG1vbWVudCBhbmQgdXNlIFtDb2xvckhleGEuY29tXShodHRwczovL3d3dy5jb2xvcmhleGEuY29tKSB0byBjaGFuZ2UgdGhlIGZpbGwgdG8gYSAqY29vbCogY29sb3IgYW5kIHNlbGVjdCBhIGRhcmtlciBzaGFkZSBvZiBncmF5IGZvciB0aGUgYm9yZGVyOgoKYGBge3IgaGlzdG9yaWMtZGlzdHJpY3RzLTJ9CnAyIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBoaXN0b3JpYywgZmlsbCA9ICwgY29sb3IgPSApICsKICBsYWJzKAogICAgdGl0bGUgPSAiSGlzdG9yaWMgRGlzdHJpY3RzIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgQ2l0eSBvZiBTdC4gTG91aXMiCiAgKQoKcDIKYGBgCgojIyBMYXllcmluZyB3aXRoIGdncGxvdDIKVGhlIG1hcHMgd2UgbWFkZSBhYm92ZSBoZWxwIGlkZW50aWZ5IHRoZSBoaXN0b3JpYyBkaXN0cmljdHMsIGJ1dCB0aGV5IGFyZSBkZXZvaWQgb2YgY29udGV4dCBiZWNhdXNlIHRoZSBsYWNrIHRoZSBib3VuZGFyeSBmb3IgdGhlIENpdHkgb2YgU3QuIExvdWlzLiBMZXQncyBnbyBhaGVhZCBhbiBhZGQgdGhhdC4gV2UnbGwgc2V0IHRoZSBmaWxsIGZvciB0aGUgY2l0eSBib3VuZGFyeSB0byB3aGl0ZSBzbyB0aGF0IG91ciBoaXN0b3JpYyBkaXN0cmljdHMgcmVhbGx5IHN0YW5kIG91dC4KCmBgYHtyIGhpc3RvcmljLWRpc3RyaWN0cy0zfQpwMyA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3NmKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJIaXN0b3JpYyBEaXN0cmljdHMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBDaXR5IG9mIFN0LiBMb3VpcyIKICApCgpwMwpgYGAKCk5leHQsIHdlJ2xsIG92ZXJsYXkgdGhlIGhpc3RvcmljIGRpc3RyaWN0cyBvbiB0aGUgQ2l0eSdzIG5laWdoYm9yaG9vZCBib3VuZGFyaWVzIHRvIGFkZCBzb21lIGFkZGl0aW9uYWwgY29udGV4dC4gV2UnbGwgc2V0IHRoZSBmaWxsIGZvciB0aGUgbmVpZ2hib3Job29kIGJvdW5kYXJpZXMgdG8gYE5BYCBzbyB0aGF0IHRoZXkgYXJlIGhvbGxvdywgdXNlIGEgbGlnaHQgZ3JheSBjb2xvciwgYW5kIHNldCB0aGUgc2l6ZSB0byBgLjJgIHNvIHRoYXQgdGhleSBhcmUgdGhpbm5lciB0aGFuIHRoZSBkZWZhdWx0IHdpZHRoLiBGaW5hbGx5LCB3ZSdsbCBhZGQgdGhlIGBjaXR5YCBkYXRhIG9uIHRvcCBhcyB3ZWxsIHNvIHRoYXQgdGhlIENpdHkncyBib3VuZGFyeSBzdGFuZHMgb3V0LgoKYGBge3IgaGlzdG9yaWMtZGlzdHJpY3RzLTR9CnA0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKCkgKwogIGdlb21fc2YoKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3NmKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJIaXN0b3JpYyBEaXN0cmljdHMiLAogICAgc3VidGl0bGUgPSAiQ2l0eSBvZiBTdC4gTG91aXMiLAogICAgY2FwdGlvbiA9ICJEYXRhIHZpYSBDaXR5IG9mIFN0LiBMb3VpcyIKICApCgpwNApgYGAKCiMjIFRoZW1hdGljIE1hcHBpbmcgd2l0aCB2aXJpZGlzIGFuZCBDb2xvciBCcmV3ZXIKVGhlIG90aGVyIHRvcGljIGZvciB0aGlzIHdlZWsgaXMgdG8gY3JlYXRlIG1hcHMgdGhhdCBoYXZlIGRpZmZlcmVudCBjb2xvciByYW1wcy4gTGFzdCB3ZWVrLCB3ZSBpbnRyb2R1Y2UgdGhlIGB2aXJpZHNgIGNvbG9yIHBhbGV0dGVzLiBXZSBjYW4gaWxsdXN0cmF0ZSB0aGF0IGZvciByZXZpZXcgYnkgbWFwcGluZyB0aGUgMTk1MCBwb3B1bGF0aW9ucyBvZiBTdC4gTG91aXMncyBuZWlnaGJvcmhvb2RzLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIGdyb3VuZCBsYXllciByZXByZXNlbnRpbmcgdGhlIGNpdHkgYm91bmRhcnk6CgpgYGB7ciwgbmhvb2QtcG9wLTF9CnA1IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gIiNmZmZmZmYiLCBjb2xvciA9IE5BKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gTkEsIGNvbG9yID0gIiMyYTJhMmEiLCBzaXplID0gLjkpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMobmFtZSA9ICJQb3B1bGF0aW9uIERlbnNpdHlcbnBlciBTcXVhcmUgS2lsb21ldGVyIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICIxOTUwIE5laWdoYm9yaG9vZCBQb3B1bGF0aW9ucyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIE5IR0lTIGFuZCBDaHJpc3RvcGhlciBQcmVuZXIsIFBoRCIKICApCgpwNQpgYGAKClRoZSB2aXJpZGlzIHBhY2thZ2UgY29udGFpbnMgZm91ciBvdGhlciBwYWxldHRlczogIm1hZ21hIiwgInBsYXNtYSIsIGFuZCAiaW5mZXJubyIgYWxsIGxvb2sgc29tZXdoYXQgc2ltaWxhciwgYW5kIHRoZW4gdGhlIGFsdGVybmF0ZSAiY2l2aWRpcyIgcGFsZXR0ZS4gWW91IGNhbiBzcGVjaWZ5IHRoZW0gd2l0aCB0aGUgYG9wdGlvbmAgYXJndW1lbnQgaW4gYHNjYWxlX2ZpbGxfdmlyaWRpc2A6CgpgYGB7ciwgbmhvb2QtcG9wLTJ9CnA2IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gIiNmZmZmZmYiLCBjb2xvciA9IE5BKSArCiAgZ2VvbV9zZihkYXRhID0gbmhvb2QsIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHBvcDUwX2RlbikpICsKICBnZW9tX3NmKGRhdGEgPSBjaXR5LCBmaWxsID0gTkEsIGNvbG9yID0gIiMyYTJhMmEiLCBzaXplID0gLjkpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gLCBuYW1lID0gIlBvcHVsYXRpb24gRGVuc2l0eVxucGVyIFNxdWFyZSBLaWxvbWV0ZXIiKSArCiAgbGFicygKICAgIHRpdGxlID0gIjE5NTAgTmVpZ2hib3Job29kIFBvcHVsYXRpb25zIiwKICAgIHN1YnRpdGxlID0gIkNpdHkgb2YgU3QuIExvdWlzIiwKICAgIGNhcHRpb24gPSAiRGF0YSB2aWEgTkhHSVMgYW5kIENocmlzdG9waGVyIFByZW5lciwgUGhEIgogICkKCnA2CmBgYAoKVGhpcyBtYXAgaXMgYSBiaXQgaGFyZCB0byByZWFkIGJlY2F1c2UgdGhlIGNvbG9yIHJhbXAgaXMgY29udGludW91cy4gV2UgY2FuIGJpbiBvdXIgZGF0YSB1c2luZyBvbmUgb2YgYSBudW1iZXIgb2YgYWxnb3JpdGhtcyAtICJlcXVhbCIsICJwcmV0dHkiLCAicXVhbnRpbGUiLCAiZmlzaGVyIiwgYW5kICJqZW5rcyIgYXJlIHRoZSBiZXN0IG9wdGlvbnMgdG8gY2hvb3NlIGZyb20uIFR5cGljYWxseSB3ZSBkb24ndCB3YW50IG1vcmUgdGhhbiA1IG9yIDYgYnJlYWtzLiBXZSBjYW4gYWxzbyBzd2l0Y2ggdG8gdXNpbmcgYFJDb2xvckJyZXdlcmAgaW5zdGVhZC4KCmBgYHtyLCBuaG9vZC1wb3AtM30KIyMgY3JlYXRlIGJyZWFrcwpuaG9vZCA8LSBtYXBfYnJlYWtzKCkKCiMjIG1hcCBiaW5uZWQgZGF0YQpwNyA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9ICIjZmZmZmZmIiwgY29sb3IgPSBOQSkgKwogIGdlb21fc2YoZGF0YSA9IG5ob29kLCBtYXBwaW5nID0gYWVzKGZpbGwgPSApKSArCiAgZ2VvbV9zZihkYXRhID0gY2l0eSwgZmlsbCA9IE5BLCBjb2xvciA9ICIjMmEyYTJhIiwgc2l6ZSA9IC45KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJSZFB1IiwgbmFtZSA9ICJQb3B1bGF0aW9uIERlbnNpdHlcbnBlciBTcXVhcmUgS2lsb21ldGVyIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICIxOTUwIE5laWdoYm9yaG9vZCBQb3B1bGF0aW9ucyIsCiAgICBzdWJ0aXRsZSA9ICJDaXR5IG9mIFN0LiBMb3VpcyIsCiAgICBjYXB0aW9uID0gIkRhdGEgdmlhIE5IR0lTIGFuZCBDaHJpc3RvcGhlciBQcmVuZXIsIFBoRCIKICApCgpwNwpgYGAKCllvdSBjYW4gdXNlIHRoZSBgZGlzcGxheS5icmV3ZXIuYWxsKClgIGZ1bmN0aW9uIHRvIGdldCBhIHByZXZpZXcgb2Ygb3RoZXIgb3B0aW9ucyBpbiB0aGUgYFJDb2xvckJyZXdlcmAgcGFja2FnZS4gVGFrZSBhIGZldyBtaW51dGVzIHRvIG1vZGlmeSBgcDdgIHVzaW5nIGRpZmZlcmVudCBwYWxldHRlIG9wdGlvbnMgYW5kIGFwcHJvYWNoZXMgdG8gbWFraW5nIGJyZWFrcy4K
+ + + +
+ + + + + + + + + + + + + + + +