library(dplyr)
## Warning: package 'dplyr' was built under R version 3.6.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tmap)
## Warning: package 'tmap' was built under R version 3.6.3
library(tmaptools)
library(sf)
## Warning: package 'sf' was built under R version 3.6.3
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(leaflet)
## Warning: package 'leaflet' was built under R version 3.6.3
library(leaflet.extras)
## Warning: package 'leaflet.extras' was built under R version 3.6.3
nhdatafile <- "NHD2016.xlsx"
Store data from the election results spreadsheet into a variable called nhdata
nhdata <- rio :: import(nhdatafile)
Select just the County, Clinton and Sanders columns
nhdata <- nhdata[,c("County", "Clinton", "Sanders")]
# Add columns for percents and margins
nhdata$SandersMarginVotes <- nhdata$Sanders - nhdata$Clinton
nhdata$SandersPct <- (nhdata$Sanders - nhdata$Clinton) / (nhdata$Sanders + nhdata$Clinton) # Will use formatting later to multiply by a hundred
nhdata$ClintonPct <- (nhdata$Clinton - nhdata$Sanders) / (nhdata$Sanders + nhdata$Clinton)
nhdata$SandersMarginPctgPoints <- nhdata$SandersPct - nhdata$ClintonPct
Store the name of the .shp file in a variable called usshapefile
usshapefile <- " cb_2014_us_county_5m/cb_2014_us_county_5m.shp"
Importing shapefiles into R
library(raster)
## Warning: package 'raster' was built under R version 3.6.3
## Loading required package: sp
## Warning: package 'sp' was built under R version 3.6.3
##
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
##
## select
library(rgdal)
## Warning: package 'rgdal' was built under R version 3.6.3
## rgdal: version: 1.5-12, (SVN revision 1018)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28
## Path to GDAL shared files: C:/Users/Tu/Documents/R/win-library/3.6/rgdal/gdal
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]
## Path to PROJ shared files: C:/Users/Tu/Documents/R/win-library/3.6/rgdal/proj
## Linking to sp version:1.4-2
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
usgeo <- shapefile("cb_2014_us_county_5m/cb_2014_us_county_5m.shp")
## Warning in rgdal::readOGR(dirname(x), fn, stringsAsFactors = stringsAsFactors, :
## Z-dimension discarded
Run tmap’s quick thematic map command
qtm(usgeo)
Use dplyr::filter() on the sf object as you would on a conventional data frame
nhgeo <- usgeo[usgeo@data$STATEFP=="33",]
qtm(nhgeo)
str(nhgeo$NAME)
## chr [1:10] "Grafton" "Hillsborough" "Coos" "Belknap" "Rockingham" ...
str(nhdata$County)
## chr [1:10] "Belknap" "Carroll" "Cheshire" "Coos" "Grafton" "Hillsborough" ...
Change the factors to character strings
nhgeo$NAME <- as.character(nhgeo$NAME)
Sort both data sets by county name and then compare
nhgeo <- nhgeo[order(nhgeo$NAME),]
nhdata <- nhdata[order(nhdata$County),]
identical(nhgeo$NAME,nhdata$County )
## [1] TRUE
Join the two files
nhmap <- merge(nhgeo, nhdata, by.x = "NAME", by.y = "County")
New data structure
str(nhmap)
## Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
## ..@ data :'data.frame': 10 obs. of 15 variables:
## .. ..$ NAME : chr [1:10] "Belknap" "Carroll" "Cheshire" "Coos" ...
## .. ..$ STATEFP : chr [1:10] "33" "33" "33" "33" ...
## .. ..$ COUNTYFP : chr [1:10] "001" "003" "005" "007" ...
## .. ..$ COUNTYNS : chr [1:10] "00873174" "00873175" "00873176" "00873177" ...
## .. ..$ AFFGEOID : chr [1:10] "0500000US33001" "0500000US33003" "0500000US33005" "0500000US33007" ...
## .. ..$ GEOID : chr [1:10] "33001" "33003" "33005" "33007" ...
## .. ..$ LSAD : chr [1:10] "06" "06" "06" "06" ...
## .. ..$ ALAND : chr [1:10] "1036582289" "2411458935" "1830366195" "4648216798" ...
## .. ..$ AWATER : chr [1:10] "177039345" "158933434" "57990901" "90773891" ...
## .. ..$ Clinton : num [1:10] 3495 3230 5132 2013 6918 ...
## .. ..$ Sanders : num [1:10] 6005 5638 12441 3639 14245 ...
## .. ..$ SandersMarginVotes : num [1:10] 2510 2408 7309 1626 7327 ...
## .. ..$ SandersPct : num [1:10] 0.264 0.272 0.416 0.288 0.346 ...
## .. ..$ ClintonPct : num [1:10] -0.264 -0.272 -0.416 -0.288 -0.346 ...
## .. ..$ SandersMarginPctgPoints: num [1:10] 0.528 0.543 0.832 0.575 0.692 ...
## ..@ polygons :List of 10
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.4 43.5
## .. .. .. .. .. .. ..@ area : num 0.136
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:33, 1:2] -71.7 -71.7 -71.7 -71.7 -71.7 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.4 43.5
## .. .. .. ..@ ID : chr "1100"
## .. .. .. ..@ area : num 0.136
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.2 43.9
## .. .. .. .. .. .. ..@ area : num 0.288
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:73, 1:2] -71.6 -71.4 -71.4 -71.3 -71.4 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.2 43.9
## .. .. .. ..@ ID : chr "3077"
## .. .. .. ..@ area : num 0.288
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -72.3 42.9
## .. .. .. .. .. .. ..@ area : num 0.208
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:161, 1:2] -72.6 -72.6 -72.6 -72.6 -72.6 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -72.3 42.9
## .. .. .. ..@ ID : chr "1877"
## .. .. .. ..@ area : num 0.208
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.3 44.7
## .. .. .. .. .. .. ..@ area : num 0.539
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:511, 1:2] -71.8 -71.8 -71.8 -71.7 -71.7 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.3 44.7
## .. .. .. ..@ ID : chr "922"
## .. .. .. ..@ area : num 0.539
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.8 43.9
## .. .. .. .. .. .. ..@ area : num 0.508
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:327, 1:2] -72.3 -72.3 -72.3 -72.3 -72.3 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.8 43.9
## .. .. .. ..@ ID : chr "685"
## .. .. .. ..@ area : num 0.508
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.7 42.9
## .. .. .. .. .. .. ..@ area : num 0.255
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:45, 1:2] -72.1 -72 -72 -72 -72 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.7 42.9
## .. .. .. ..@ ID : chr "866"
## .. .. .. ..@ area : num 0.255
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.7 43.3
## .. .. .. .. .. .. ..@ area : num 0.274
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:49, 1:2] -72.1 -72.1 -72 -72.1 -72.1 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.7 43.3
## .. .. .. ..@ ID : chr "2773"
## .. .. .. ..@ area : num 0.274
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71.1 43
## .. .. .. .. .. .. ..@ area : num 0.208
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:123, 1:2] -71.5 -71.4 -71.4 -71.4 -71.4 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.1 43
## .. .. .. ..@ ID : chr "1278"
## .. .. .. ..@ area : num 0.208
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -71 43.3
## .. .. .. .. .. .. ..@ area : num 0.11
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:177, 1:2] -71.2 -71.2 -71.2 -71.2 -71.1 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71 43.3
## .. .. .. ..@ ID : chr "2676"
## .. .. .. ..@ area : num 0.11
## .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
## .. .. .. ..@ Polygons :List of 1
## .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
## .. .. .. .. .. .. ..@ labpt : num [1:2] -72.2 43.4
## .. .. .. .. .. .. ..@ area : num 0.159
## .. .. .. .. .. .. ..@ hole : logi FALSE
## .. .. .. .. .. .. ..@ ringDir: int 1
## .. .. .. .. .. .. ..@ coords : num [1:118, 1:2] -72.5 -72.4 -72.4 -72.4 -72.4 ...
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -72.2 43.4
## .. .. .. ..@ ID : chr "3167"
## .. .. .. ..@ area : num 0.159
## ..@ plotOrder : int [1:10] 4 5 2 7 6 3 8 10 1 9
## ..@ bbox : num [1:2, 1:2] -72.6 42.7 -70.7 45.3
## .. ..- attr(*, "dimnames")=List of 2
## .. .. ..$ : chr [1:2] "x" "y"
## .. .. ..$ : chr [1:2] "min" "max"
## ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
## .. .. ..@ projargs: chr "+proj=longlat +datum=NAD83 +no_defs"
# creating a simple static map of Sanders' margins by county in number of votes
qtm(nhmap, "SandersMarginVotes")
## Some legend labels were too wide. These labels have been resized to 0.62, 0.62, 0.62, 0.57, 0.53. Increase legend.width (argument of tm_layout) to make the legend wider and therefore the labels larger.
# Mapping margins by percentage
qtm(nhmap, "SandersMarginPctgPoints")
Use the tm_shape() function, which uses a ggplot2-like syntax to set fill, border and other attributes
tm_shape(nhmap) +
tm_fill("SandersMarginVotes", title="Sanders Margin, Total Votes", palette = "PuBu") +
tm_borders(alpha=.5) +
tm_text("NAME", size=0.8)
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output
## Some legend labels were too wide. These labels have been resized to 0.62, 0.62, 0.62, 0.57, 0.53. Increase legend.width (argument of tm_layout) to make the legend wider and therefore the labels larger.
tm_shape(nhmap) +
tm_fill("SandersMarginVotes", title="Sanders Margin, Total Votes", palette = "PRGn") +
tm_borders(alpha=.5) +
tm_text("NAME", size=0.8) +
tm_style("classic")
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output
## Some legend labels were too wide. These labels have been resized to 0.62, 0.62, 0.62, 0.57, 0.53. Increase legend.width (argument of tm_layout) to make the legend wider and therefore the labels larger.
Save static maps created by tmap by using the tmap_save() function
nhstaticmap <- tm_shape(nhmap) +
tm_fill("SandersMarginVotes", title="Sanders Margin, Total Votes", palette = "PRGn") +
tm_borders(alpha=.5) +
tm_text("NAME", size=0.8)
tmap_save(nhstaticmap, filename="nhdemprimary.jpg", height = 8, width = 5)
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output
## Map saved to C:\Users\Tu\Dropbox\Life in US\MC\DATA 110 - Summer I 2020\Week 5\nhdemprimary.jpg
## Resolution: 1500 by 2400 pixels
## Size: 5 by 8 inches (300 dpi)
clintonPalette <- colorNumeric(palette = "Blues", domain=nhmap$ClintonPct)
library(scales)
## Warning: package 'scales' was built under R version 3.6.3
nhpopup <- paste0("County: ", nhmap$County,
"Sanders ", percent(nhmap$SandersPct), " - Clinton ", percent(nhmap$ClintonPct))
#nhmap <- rename(nhmap, County = NAME)
leaflet(nhmap) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(stroke=FALSE,
smoothFactor = 0.2,
fillOpacity = .8,
popup=nhpopup,
color= ~clintonPalette(nhmap$ClintonPct))
nhmap_projected <- sp:: spTransform(nhmap, "+proj=longlat +datum=WGS84")
leaflet(nhmap_projected) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(stroke=FALSE, smoothFactor = 0.2, fillOpacity = .8, popup=nhpopup, color= ~clintonPalette(nhmap$ClintonPct) )