Another Kyle Walker Map
By Kyle Walker
December 4, 2024
Kyle Walker just published the code for this map on his blog . I’m going to try to recreate it here.
library(mapgl)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
## Linking to GEOS 3.12.2, GDAL 3.9.3, PROJ 9.4.1; sf_use_s2() is TRUE
library(tigris)
## To enable caching of data, set `options(tigris_use_cache = TRUE)`
## in your R script or .Rprofile.
options(tigris_use_cache = TRUE)
intox <- read_csv("https://raw.githubusercontent.com/walkerke/geog30323/refs/heads/master/intoxication.csv") %>%
na.omit() %>%
st_as_sf(coords = c("longitude", "latitude"), crs = 4326) %>%
st_jitter(factor = 0.0001)
## Rows: 2023 Columns: 19
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (14): Case and Offense, Reported Date, Nature Of Call, From Date, Offens...
## dbl (5): Case Number, Council District, Location Type, latitude, longitude
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ft_worth <- places(cb = TRUE, year = 2023) |>
filter(NAME == "Fort Worth")
## Retrieving Census-designated places for the entire United States
ggplot() +
geom_sf(data = ft_worth, fill = "navy", alpha = 0.2) +
geom_sf(data = intox, color = "red") +
theme_void()
ftw_map <- maplibre(
style = maptiler_style("openstreetmap"),
bounds = ft_worth
) |>
add_fill_layer(
id = "city",
source = ft_worth,
fill_color = "navy",
fill_opacity = 0.2
)
ftw_map |>
add_circle_layer(
id = "circles",
source = intox,
circle_color = "red",
circle_stroke_color = "white",
circle_stroke_width = 1,
cluster_options = cluster_options(
cluster_radius = 30,
color_stops = c("#377eb8", "#4daf4a", "#984ea3"),
count_stops = c(0, 200, 500),
circle_blur = 0.2,
circle_stroke_color = "white",
circle_stroke_width = 5
)
)
library(glue)
intox <- intox %>%
mutate(popup_content = glue('
<div style="font-family: \'Open Sans\', sans-serif; max-width: 300px; padding: 10px; background-color: #f8f9fa; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
<h3 style="color: #007bff; margin-top: 0;">Incident Details</h3>
<p>
<strong>Date:</strong> <span style="color: #495057;">{`Reported Date`}</span><br>
<strong>Address:</strong> <span style="color: #495057;">{`Block Address`}</span><br>
<strong>Location:</strong> <span style="color: #495057;">{`Location Description`}</span>
</p>
</div>
'))
ftw_map |>
add_heatmap_layer(
id = "heatmap",
source = intox,
heatmap_radius = 10,
heatmap_color = interpolate(
property = "heatmap-density",
values = seq(0, 1, 0.2),
stops = c("transparent", viridisLite::viridis(5))
),
heatmap_opacity = interpolate(
property = "zoom",
values = c(11, 14),
stops = c(1, 0)
)
) |>
add_circle_layer(
id = "circles",
source = intox,
circle_color = "red",
circle_stroke_color = "white",
circle_stroke_width = 1,
min_zoom = 12.5,
popup = "popup_content"
)
library(tidycensus)
library(mapview)
get_acs(
geography = "tract",
variables = "B19013_001",
state = "GA",
county = "Gwinnett",
year = 2023,
geometry = TRUE
) |>
mapview(zcol = "estimate",
layer.name = "Median HH income<br>2019-2023 ACS")
## Getting data from the 2019-2023 5-year ACS
##
|
| | 0%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|== | 4%
|
|=== | 4%
|
|=== | 5%
|
|==== | 5%
|
|==== | 6%
|
|===== | 7%
|
|===== | 8%
|
|====== | 8%
|
|====== | 9%
|
|======= | 9%
|
|======= | 10%
|
|======= | 11%
|
|======== | 11%
|
|======== | 12%
|
|========= | 12%
|
|========= | 13%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 15%
|
|=========== | 16%
|
|============ | 16%
|
|============ | 17%
|
|============ | 18%
|
|============= | 18%
|
|============= | 19%
|
|============== | 19%
|
|============== | 20%
|
|=============== | 21%
|
|=============== | 22%
|
|================ | 22%
|
|================ | 23%
|
|================= | 24%
|
|================= | 25%
|
|================== | 25%
|
|================== | 26%
|
|=================== | 27%
|
|=================== | 28%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 29%
|
|===================== | 30%
|
|====================== | 31%
|
|======================= | 32%
|
|======================= | 33%
|
|======================== | 34%
|
|========================= | 35%
|
|========================= | 36%
|
|========================== | 37%
|
|========================== | 38%
|
|=========================== | 38%
|
|=========================== | 39%
|
|============================ | 40%
|
|============================ | 41%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 43%
|
|=============================== | 44%
|
|=============================== | 45%
|
|================================ | 46%
|
|================================= | 47%
|
|================================= | 48%
|
|================================== | 49%
|
|=================================== | 50%
|
|=================================== | 51%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 52%
|
|===================================== | 53%
|
|====================================== | 54%
|
|====================================== | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|======================================== | 58%
|
|========================================= | 59%
|
|========================================== | 59%
|
|========================================== | 61%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 62%
|
|============================================ | 64%
|
|============================================= | 65%
|
|============================================== | 65%
|
|=============================================== | 66%
|
|=============================================== | 68%
|
|================================================ | 68%
|
|================================================= | 69%
|
|================================================= | 70%
|
|================================================== | 71%
|
|================================================== | 72%
|
|=================================================== | 72%
|
|=================================================== | 73%
|
|===================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 78%
|
|======================================================= | 79%
|
|======================================================== | 79%
|
|======================================================== | 80%
|
|========================================================= | 81%
|
|========================================================= | 82%
|
|========================================================== | 82%
|
|========================================================== | 83%
|
|=========================================================== | 84%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|============================================================= | 87%
|
|============================================================== | 88%
|
|=============================================================== | 90%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================= | 93%
|
|================================================================== | 94%
|
|================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 97%
|
|===================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 100%
- Posted on:
- December 4, 2024
- Length:
- 5 minute read, 980 words