In the Harris-focused percentage map of Davidson County precincts, we can see that Harris performed particularly well in central and eastern precincts, where his vote share often exceeded 70%. These areas are colored darker blue, indicating high levels of support. Conversely, many western and southern precincts leaned more heavily toward Trump, seen in redder areas. The stacked bar chart reveals that while Harris won several precincts by percentage, Trump often had higher total vote counts in more populous … This combination highlights a classic electoral pattern where winning more precincts doesn’t always mean winning more votes overall.
# Required packages
if (!require("tidyverse"))
install.packages("tidyverse")
if (!require("mapview"))
install.packages("mapview")
if (!require("sf"))
install.packages("sf")
if (!require("leaflet"))
install.packages("leaflet")
if (!require("leaflet.extras2"))
install.packages("leaflet.extras2")
if (!require("plotly"))
install.packages("plotly")
library(tidyverse)
library(mapview)
library(sf)
library(leaflet)
library(leafpop)
library(readxl)
library(plotly)
# Getting the election data
VoteData <- read.csv("https://github.com/drkblake/Data/raw/refs/heads/main/Davidson_Vote_Data.csv")
# Getting the map
download.file("https://github.com/drkblake/Data/raw/refs/heads/main/Davidson_Precincts.zip","DavidsonPrecinctMap.zip")
unzip("DavidsonPrecinctMap.zip")
MapInfo <- read_sf("Davidson_Precincts.shp")
# Enhancing the data
VoteData2 <- VoteData %>%
mutate(Total = Trump + Harris + Other,
Pct_Trump = round((Trump / Total)*100,1),
Pct_Harris = round((Harris / Total)*100,1),
Pct_Other = round((Other / Total)*100,1),
Margin_Trump = Trump - Harris,
Margin_Harris = Harris - Trump,
Winner = case_when(Trump > Harris ~ "Trump",
Harris > Trump ~ "Harris",
Other > (Trump + Harris) ~ "Other",
.default = "Tie"))
# Merging the data and the map
DataAndMap <- left_join(VoteData2,MapInfo)
# Converting the merged data and map into an sf object
DataAndMap <- st_as_sf(DataAndMap)
# Harris percentage map
mypalette = colorRampPalette(c('red', 'blue'))
PctHarrisMap <- mapview(
DataAndMap,
zcol = "Pct_Harris",
col.regions = mypalette,
map.types = ("OpenStreetMap"),
layer.name = "Pct. Harris",
popup = popupTable(
DataAndMap,
feature.id = FALSE,
row.numbers = FALSE,
zcol = c(
"Precinct",
"Trump",
"Harris",
"Other",
"Total",
"Pct_Trump",
"Pct_Harris",
"Pct_Other",
"Margin_Trump",
"Margin_Harris",
"Winner"
)
)
)
PctHarrisMap
# Sort the data by the Total variable
# and make it stay sorted in the chart
ChartData <- DataAndMap %>%
arrange(Total) %>%
mutate(Precinct = factor(Precinct, levels = Precinct))
# Create and format the chart
Chart <- plot_ly(data = ChartData, orientation = 'h') %>%
add_trace(
x = ~Trump,
y = ~Precinct,
name = 'Trump',
type = 'bar',
marker = list(color = 'red') # We have made the red bars
) %>%
add_trace(
x = ~Harris,
y = ~Precinct,
name = 'Harris',
type = 'bar',
marker = list(color = 'darkblue') # We have added the blue bars
) %>%
add_trace(
x = ~Other,
y = ~Precinct,
name = 'Other',
type = 'bar',
marker = list(color = 'gray') #We have added the gray bars
) %>%
add_trace(
x = ~Other,
y = ~Precinct,
type = 'bar',
name = '',
marker = list(color = 'rgba(0,0,0,0)'),
text = ~Winner,
textposition = 'outside',
showlegend = FALSE # We have added the "winner" labels
) %>%
layout(
barmode = 'stack',
xaxis = list(title = 'Number of Votes'),
yaxis = list(title = 'Precinct',
tickfont = list(size = 10),
automargin = TRUE)) # We have made it a stacked bar chart
# Show the plot
Chart