-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathIntroduction-to-Visualizing-Geospatial-Data.Rmd
More file actions
99 lines (69 loc) · 6.4 KB
/
Copy pathIntroduction-to-Visualizing-Geospatial-Data.Rmd
File metadata and controls
99 lines (69 loc) · 6.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
---
title: "Introduction to Geospatial Visualization"
author: "Marley Buchman"
date: "8/10/2019"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
```
In preparation for craggy 2019 here is a very brief introduction to simple ways to visualize spatial data. This notebook will introduce some R packages and functions to visualize spatial data. The notebook will use 6 total packages, 3 of which are in the tidyverse. The three tidy functions will be used for routine data wrangling. The 3 other packages will be used to work with the spatial data. The first package is `sf` and it is my personal preferred package to use when working with spatial data. The `sf` package contains all of the spatial operation functions needed for routine spatial analysis, and the syntax meshes well with the tidyverse. The `sf` package introduces the `sf` type, and you can think of the `sf` type as a spatial data frame. It is like a normal vanilla data frame but there is an additional "geometry" column that is of list column type, and that column contains all of the spatial information.
The next package we will be using is `mapview` and it provides functionality to create interactive web maps. If you need to quickly visualize your spatial data `mapview` is a great first tool to use.
The last package is the `tigris` package and this allows us to download census spatial boundaries from the census. For this data set we will be looking at data provided at the census tract geography. The data is provided as a regular csv, so we will need a way to convert that data to a `sf` object. To do this we will download the Washington census tract shapes and join them to our data. Let's begin
```{r load packages}
## the first three packages are all loaded in library(tidyverse) as well
library(dplyr)
library(ggplot2)
library(stringr)
# spatial packages
library(sf) # working with spatial data
library(mapview) # quick and easy geospatial visualizations
library(tigris) # downloading geospatial data from the census
```
To start I will read the evictions data into memory. The data is stored in a csv so I will use `read.csv()` to read the data and assign the data frame to evictions. After reading the data into memory I will print the first five rows.
```{r load the evictions data}
evictions <- read.csv("data/evictions.csv", stringsAsFactors = FALSE)
head(evictions, n = 5)
```
The data doesn't have any spatial information other than a "GEOID" which is also referred to as a "fips code". Fips codes are a way of designating a spatial hierarchy to different geographies in the U.S. The number of digits in the fips code (most commonly seen with the column name "GEOID") corresponds to a specific census geographic specification.

The image above shows the digit designations for states, counties, tracts, and block groups. Since our data is at the census tract level we need to make sure that all of the GEOIDs have 11 digits. Since the GEOIDs are numeric, when loading data with fips codes it is common that the data will be read into memory as numeric. This is to be expected but can cause issues since the fips codes are categorical in nature. For example, the state fips code of California is "06" but the leading 0 is often dropped when loaded as a numeric. For this reason, it is usually good to convert the GEOID to character and see if all of the observations have the right amount of characters. We will do that below.
```{r check to see all observations have right amount of characters}
evictions <- dplyr::mutate(evictions, GEOID = as.character(GEOID))
dplyr::count(evictions, stringr::str_length(GEOID))
```
Now that we have confirmed that all of the GEOIDs are of the right length, it is time to get the shapes for each census tract. To do this we will use the aforementioned `tigris` package. We will call the `tracts()` function from the tigris package and pass in "WA" as the state. The output of this call will be a spatial data frame. This data type comes from the `sp` package and I will transform this into the `sf` type using the function `st_as_sf()`. This is personal preference but the `sf` package is newer and I find it much easier to use than `sp`.
```{r results='hide'}
tracts <- tigris::tracts(state = "WA")
tracts <- sf::st_as_sf(tracts)
```
Now that the census tract shapes have been assigned to the object "tracts", I will join the evictions data to the tracts data.
```{r}
evictions <- dplyr::inner_join(tracts, evictions)
```
Since the data is a time series for each tract, we will filter the data on the most recent year in the sample. When visualizing spatial data is difficult to also include a temporal dimension. You can of course visualize change over time but for this example we will just focus on the 2016 data.
```{r}
evictions_2016 <- dplyr::filter(evictions, year == "2016")
```
The evictions data for the entire state of Washington is included and we are mostly interested in King County. I will filter on King County for this purpose.
```{r}
king_county_evictions_2016 <- dplyr::filter(evictions_2016, parent.location == "King County, Washington")
```
The first visualization technique we will use is ggplot. ggplot supports `sf` objects and they can be plotted using the `geom_sf()` function. The rest of the code below is from the standard ggplot library, I will relabel the legend and plot title. Additionally, I will use the void theme.
```{r}
ggplot(data = king_county_evictions_2016) +
geom_sf(aes(fill = eviction.rate)) +
labs(title = "King County 2016",
fill = "Eviction Rate (%)") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5))
```
Next up is mapview. If you simply pass your `sf` object into mapview it will create an interactive web map using openstreetmap. This will display a choropleth of every shape in the data. A choropleth is a map of different shapes, with the color representing a single feature of the data. Here, we didn't pass any columns to mapview so it just mapped all of the data with the same color. If you click on a shape, a popup will show the data associated with that shape.
```{r}
mapview::mapview(king_county_evictions_2016)
```
If you want to map a specific column of the data you can pass in the column name quoted to the `zcol` argument.
```{r}
mapview(king_county_evictions_2016, zcol = "eviction.rate")
```
There are many different ways of visualizing spatial data but I hope this can get you started.