Crime data for the city of Chicago which are available from 2001 onwards on the city’s open data portal at: https://data.cityofchicago.org/. we are going use past one year of data from the current date to create a map showing the location where a crime had occurred.
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.0.2
library(tidyverse)
## -- Attaching packages ------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.1 v purrr 0.3.4
## v tibble 3.0.1 v dplyr 1.0.0
## v tidyr 1.1.0 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.5.0
## -- Conflicts ---------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
# Specify download url
url.data <-
"https://data.cityofchicago.org/api/views/x2n5-8w5q/rows.csv?accessType=DOWNLOAD"
# Read in data
crime_raw <- read_csv(url.data, na = '')
## Parsed with column specification:
## cols(
## `CASE#` = col_character(),
## `DATE OF OCCURRENCE` = col_character(),
## BLOCK = col_character(),
## IUCR = col_character(),
## `PRIMARY DESCRIPTION` = col_character(),
## `SECONDARY DESCRIPTION` = col_character(),
## `LOCATION DESCRIPTION` = col_character(),
## ARREST = col_character(),
## DOMESTIC = col_character(),
## BEAT = col_double(),
## WARD = col_double(),
## `FBI CD` = col_character(),
## `X COORDINATE` = col_double(),
## `Y COORDINATE` = col_double(),
## LATITUDE = col_double(),
## LONGITUDE = col_double(),
## LOCATION = col_character()
## )
# Reorganize data by selection specific columns
crime_raw <-
select(
crime_raw,
"BLOCK",
"PRIMARY DESCRIPTION",
"SECONDARY DESCRIPTION",
"LOCATION DESCRIPTION",
"LATITUDE",
"LONGITUDE"
)
crime_raw <- na.omit(crime_raw)
# Print table
crime_raw
## # A tibble: 231,759 x 6
## BLOCK `PRIMARY DESCRI~ `SECONDARY DESC~ `LOCATION DESCR~ LATITUDE LONGITUDE
## <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 029XX ~ CRIMINAL DAMAGE TO VEHICLE STREET 41.8 -87.7
## 2 064XX ~ CRIMINAL TRESPA~ TO LAND APARTMENT 41.8 -87.6
## 3 048XX ~ CRIMINAL DAMAGE CRIMINAL DEFACE~ RESIDENCE 42.0 -87.7
## 4 006XX ~ CRIMINAL DAMAGE TO VEHICLE STREET 41.8 -87.6
## 5 089XX ~ BATTERY DOMESTIC BATTER~ STREET 41.7 -87.6
## 6 102XX ~ THEFT $500 AND UNDER APARTMENT 41.7 -87.6
## 7 106XX ~ ROBBERY STRONG ARM - NO~ RESIDENCE 41.7 -87.6
## 8 024XX ~ MOTOR VEHICLE T~ AUTOMOBILE STREET 41.8 -87.6
## 9 096XX ~ BATTERY DOMESTIC BATTER~ RESIDENCE 41.7 -87.6
## 10 019XX ~ THEFT FROM BUILDING RESIDENCE - POR~ 41.9 -87.7
## # ... with 231,749 more rows
Plots of clusters of markers with addMarkers(clusterOptions = markerClusterOptions()) are used. You can zoom in to each cluster, the clusters will separate until you can see the individual markers. The Crime Type is added as a popup for each marker. Click on any blue marker to determine what crime was committed.
crime_raw %>%
leaflet() %>%
addTiles() %>%
#adds icon to view the world map
addEasyButton(easyButton(
icon = "fa-globe",
title = "Zoom to Level 1",
onClick = JS("function(btn, map){ map.setZoom(1); }")
)) %>%
#add location markers
addMarkers(
~ LONGITUDE,
~ LATITUDE,
popup = crime_raw$`PRIMARY DESCRIPTION` ,
clusterOptions = markerClusterOptions()
) %>%
#adds a minimap to navigate through the map
addProviderTiles(providers$Esri.WorldStreetMap) %>%
addMiniMap(tiles = providers$Esri.WorldStreetMap,
toggleDisplay = TRUE)