Davidson County election analysis

This map shows the election results from Davidson County for the 2024 election of Harris vs Trump. Towards downtown Nashville and La Vergne, more people voted for her than for Trump, and as you progress to the rural areas, more people voted for Trump. The most votes overall in this area was in the 4-2 precinct.

# 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)

# Trump percentage map

mypalette = colorRampPalette(c('blue', 'red'))

# 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

PctHarrisMap