Setting the various values needed (Files Names & FIPS
codes)
nhdatafilecsv <- "NHD2016.csv"
nhfipscode <- "33"
scdatafile <- "SCGOP2016.csv"
scfipscode <- "45"
Loading all necessary packages
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.1 ✔ purrr 1.0.1
## ✔ tibble 3.1.8 ✔ dplyr 1.1.0
## ✔ tidyr 1.3.0 ✔ stringr 1.5.0
## ✔ readr 2.1.4 ✔ forcats 1.0.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(tmap)
library(tmaptools)
library(leaflet)
library(sf)
## Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(leaflet.extras)
library(dplyr)
library(rio)
library(sp)
Step 1: Reading in the NH Election Results File
nhdata <- import(nhdatafilecsv)
Eliminating columns for minor candidates and using only County,
Clinton, and Sanders
nhdata <- nhdata[, c("County", "Clinton", "Sanders")]
Step 2: Deciding what map to use
Adding columns for percents and margins:
nhdata$SandersMarginVotes <- nhdata$Sanders - nhdata$Clinton
nhdata$SandersPct <- (nhdata$Sanders) / (nhdata$Sanders + nhdata$Clinton) # Will use formatting later to multiply by a hundred
nhdata$ClintonPct <- (nhdata$Clinton) / (nhdata$Sanders + nhdata$Clinton)
nhdata$SandersMarginPctgPoints <- nhdata$SandersPct - nhdata$ClintonPct
Step 3: Getting geographic files
Reading in the shapefile for US states and countries:
# isntall.packages("raster")
# install.packages("rgdal")
library(raster)
##
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
##
## select
library(rgdal)
## Please note that rgdal will be retired during 2023,
## plan transition to sf/stars/terra functions using GDAL and PROJ
## at your earliest convenience.
## See https://r-spatial.org/r/2022/04/12/evolution.html and https://github.com/r-spatial/evolution
## rgdal: version: 1.6-5, (SVN revision 1199)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.5.3, released 2022/10/21
## Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/library/rgdal/gdal
## GDAL does not use iconv for recoding strings.
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 9.1.0, September 1st, 2022, [PJ_VERSION: 910]
## Path to PROJ shared files: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/library/rgdal/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.6-0
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading sp or rgdal.
usgeo <- shapefile("cb_2014_us_county_5m/cb_2014_us_county_5m.shp")
## Warning: [vect] Z coordinates ignored
Doing a quick plot (QTM = Quick Thematic Map) of the shapefile and
checking its structure
qtm(usgeo)

Subsetting just the NH data from the US shapefile
nhgeo <- usgeo[usgeo$STATEFP == nhfipscode,]
Tmap test plot of the New Hampshire data
qtm(nhgeo)

Structure of the object
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 county names to plain characters in nhgeo
nhgeo$NAme <- as.character(nhgeo$NAME)
Ordering each data set by county name
nhgeo <- nhgeo[order(nhgeo$NAME),]
nhdata <- nhdata[order(nhdata$County),]
# Checking to see if the two county columns are identical:
identical(nhgeo$NAME, nhdata$County)
## [1] TRUE
Step 4: Merge geo data with results data using the merge
function
library(sf) # sf = simple features
nhmap <- merge(nhgeo, nhdata, by.x = "NAME", by.y = "County")
# examining the new data structure
str(nhmap)
## Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
## ..@ data :'data.frame': 10 obs. of 16 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 : int [1:10] 1036582289 -1883508361 1830366195 353249502 130959956 -2025747080 -1875570227 1799805954 955401980 1391587566
## .. ..$ AWATER : int [1:10] 177039345 158933434 57990901 90773891 105375486 41604851 57788894 259517418 39157548 38070546
## .. ..$ NAme : chr [1:10] "Belknap" "Carroll" "Cheshire" "Coos" ...
## .. ..$ Clinton : int [1:10] 3495 3230 5132 2013 6918 28147 12250 22829 8813 2497
## .. ..$ Sanders : int [1:10] 6005 5638 12441 3639 14245 39245 18107 31065 15881 5915
## .. ..$ SandersMarginVotes : int [1:10] 2510 2408 7309 1626 7327 11098 5857 8236 7068 3418
## .. ..$ SandersPct : num [1:10] 0.632 0.636 0.708 0.644 0.673 ...
## .. ..$ ClintonPct : num [1:10] 0.368 0.364 0.292 0.356 0.327 ...
## .. ..$ SandersMarginPctgPoints: num [1:10] 0.264 0.272 0.416 0.288 0.346 ...
## ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:33] "58419" "58420" "58421" "58422" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.4 43.5
## .. .. .. ..@ ID : chr "1101"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:73] "199379" "199380" "199381" "199382" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.2 43.9
## .. .. .. ..@ ID : chr "3078"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:161] "112007" "112008" "112009" "112010" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -72.3 42.9
## .. .. .. ..@ ID : chr "1878"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:511] "49011" "49012" "49013" "49014" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.3 44.7
## .. .. .. ..@ ID : chr "923"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:327] "33809" "33810" "33811" "33812" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.8 43.9
## .. .. .. ..@ ID : chr "686"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:45] "44340" "44341" "44342" "44343" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.7 42.9
## .. .. .. ..@ ID : chr "867"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:49] "178463" "178464" "178465" "178466" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.7 43.3
## .. .. .. ..@ ID : chr "2774"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:123] "70583" "70584" "70585" "70586" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71.1 43
## .. .. .. ..@ ID : chr "1279"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:177] "170105" "170106" "170107" "170108" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -71 43.3
## .. .. .. ..@ ID : chr "2677"
## .. .. .. ..@ 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 ...
## .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
## .. .. .. .. .. .. .. .. ..$ : chr [1:118] "204356" "204357" "204358" "204359" ...
## .. .. .. .. .. .. .. .. ..$ : chr [1:2] "x" "y"
## .. .. .. ..@ plotOrder: int 1
## .. .. .. ..@ labpt : num [1:2] -72.2 43.4
## .. .. .. ..@ ID : chr "3168"
## .. .. .. ..@ 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"
## .. .. ..$ comment: chr "GEOGCRS[\"unknown\",\n DATUM[\"North American Datum 1983\",\n ELLIPSOID[\"GRS 1980\",6378137,298.2572"| __truncated__
## ..$ comment: chr "FALSE"
Step 5: Creating a static map with tmap’s qtm() function:
qtm(nhmap, "SandersMarginVotes")
## Some legend labels were too wide. These labels have been resized to 0.63, 0.63, 0.63, 0.58, 0.54. Increase legend.width (argument of tm_layout) to make the legend wider and therefore the labels larger.

qtm(nhmap, "SandersMarginPctgPoints")

For more control over look and feel, use the tm_shape function:
tm_shape(nhmap) +
tm_fill("SandersMarginVotes", title = "Sanders Margin, Total Votes",
palette = "PRGn") +
tm_borders(alpha = 0.5) +
tm_text("NAME", size = 0.8)
## Some legend labels were too wide. These labels have been resized to 0.63, 0.63, 0.63, 0.58, 0.54. Increase legend.width (argument of tm_layout) to make the legend wider and therefore the labels larger.

Using the same code as above, but storing the static map in a
variable, and change the theme to “classic” style:
nhstaticmap <- tm_shape(nhmap) +
tm_fill("SandersMarginVotes", title = "Sanders Margin, Total Votes",
palette = "viridis") +
tm_borders(alpha = 0.5) +
tm_text("NAME", size = 0.6) +
tm_style("classic")
# The county names in my map were colliding so I changed the alpha value to 0.6
View the map
nhstaticmap
## Some legend labels were too wide. These labels have been resized to 0.63, 0.63, 0.63, 0.58, 0.54. Increase legend.width (argument of tm_layout) to make the legend wider and therefore the labels larger.

Saving the map to a jpeg file with tmap’s tmap_save():
tmap_save(nhstaticmap, filename = "nhdemprimary.jpeg")
## Map saved to /Users/ibrahim/Documents/Data Science (MC)/DATA110/R/nhdemprimary.jpeg
## Resolution: 1501.336 by 2937.385 pixels
## Size: 5.004452 by 9.791282 inches (300 dpi)
Part 6: Coding for a basic interactive map, this time for Clinton
percentages in NH
Creating a palette
clintonPalette <- colorNumeric(palette = "Blues", domain=nhmap$ClintonPct)
Creating a pop-up window
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
nhpopup <- paste0("County: ", nhmap$NAME, ". Sanders ",
percent(nhmap$SandersPct), " - Clinton ",
percent(nhmap$ClintonPct))
Step 7: Generating the interactive map:
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))
South Carolina Data
scdata <- rio::import(scdatafile)
South Carolina shapefile and quick plot of scgeo SC geospatial
object
scgeo <- usgeo[usgeo@data$STATEFP == "45",]
qtm(scgeo)

Adding a column with percent of votes for each candidate. Candidates
are in columns 2-7.
candidates <- colnames(scdata[2:7])
for(i in 2:7){
j = i + 7
temp <- scdata[[i]] / scdata$Total
scdata[[j]] <- temp
colnames(scdata)[j] <- paste0(colnames(scdata)[i], "Pct")
}
winner <- colnames(scdata[2:7])
Getting the winner in each precinct
for(i in 1: nrow(scdata)){
scdata$winner[i] <- names(which.max(scdata[i, 2:7]))
}
Importing spreadsheet with percent of adult population holding at
least a 4 year college degree
sced <- rio::import("SCdegree.xlsx")
Adding the election results and renaming the county column
scmap <- merge(scgeo, scdata, by.x = "NAME", by.y = "County")
Instead of just coloring the winner, let’s color by strength of win
with multiple layers
minpct <- min(c(scdata$`DonaldJ TrumpPct`, scdata$`Marco RubioPct`, scdata$`Ted CruzPct`))
maxpct <- max(c(scdata$`Donald J TrumpPct`, scdata$`Marco RubioPct`, scdata$`Ted CruzPct`))
Creating leaflet paletttes for each layer of the map
trumpPalette <- colorNumeric(palette = "Purples", domain=c(minpct, maxpct))
rubioPalette <- colorNumeric(palette = "Reds", domain = c(minpct, maxpct))
cruzPalette <- colorNumeric(palette = "Oranges", domain = c(minpct, maxpct))
winnerPalette <- colorFactor(palette=c("#984ea3", "#e41a1c"), domain = scmap$winner)
edPalette <- colorNumeric(palette = "Blues", domain=scmap$PctCollegeDegree)
Creating a pop-up
scpopup <- paste0("<b>County: ", scmap$NAME, "<br />Winner: ", scmap$winner, "</b><br /><
br />Trump: ", percent(scmap$`Donald J TrumpPct`), "<br />Rubio: ", percent(scmap$`Marco
RubioPct`), "<br />Cruz: ", percent(scmap$`Ted CruzPct`), "<br /><br />Pct w college ed:
", sced$PctCollegeDegree, "% vs state-wide avg of 25%")
Adding the projection we know from the NH map we’ll need for this
data on a Leaflet map:
scmap <- sp::spTransform(scmap, "+proj=longlat +datum=WGS84")
Basic interactive map showing winner in each county
leaflet(scmap) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(stroke = TRUE,
weight = 1,
smoothFactor = 0.2,
fillOpacity = 0.75,
popup = scpopup,
color = ~winnerPalette(scmap$winner),
group = "Winners") %>%
addLegend(position = "bottomleft", colors = c("#984ea3", "#e41a1c"),
labels = c("Trump", "Rubio"))
Putting top 3 candidates in their own layers and add education
layer, store in scGOPmap variable
scGOPmap <- leaflet(scmap) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(stroke=TRUE,
weight=1,
smoothFactor = 0.2,
fillOpacity = .75,
popup=scpopup,
color= ~winnerPalette(scmap$winner),
group="Winners") %>%
addLegend(position="bottomleft", colors=c("#984ea3", "#e41a1c"),
labels=c("Trump", "Rubio")) %>%
addPolygons(stroke=TRUE,
weight=1,
smoothFactor = 0.2,
fillOpacity = .75,
popup=scpopup,
color= ~trumpPalette(scmap$`Donald J TrumpPct`),
group="Trump") %>%
addPolygons(stroke=TRUE,
weight=1,
smoothFactor = 0.2,
fillOpacity = .75,
popup=scpopup,
color= ~rubioPalette(scmap$`Marco RubioPct`),
group="Rubio") %>%
addPolygons(stroke=TRUE,
weight=1,
smoothFactor = 0.2,
fillOpacity = .75,
popup=scpopup,
color= ~cruzPalette(scmap$`Ted CruzPct`),
group="Cruz") %>%
addPolygons(stroke=TRUE,
weight=1,
smoothFactor = 0.2,
fillOpacity = .75,
popup=scpopup,
color= ~edPalette(sced$PctCollegeDegree),
group="College degs") %>%
addLayersControl(
baseGroups=c("Winners", "Trump", "Rubio", "Cruz", "College degs"),
position = "bottomleft",
options = layersControlOptions(collapsed = FALSE))
# Displaying the map
scGOPmap
Saving as a self-contained HTML file
htmlwidgets::saveWidget(scGOPmap, file="scGOPwidget2.html")
# Saving as an HTML file with dependencies in another directory:
htmlwidgets::saveWidget(widget=scGOPmap, file="scGOPprimary_withdependencies.html", selfcontained=FALSE, libdir = "js")