Davidson County election analysis

The Davidson County election results have plenty of favorable trends for the Democratic candidate, Kamala Harris. First thing that is blatantly obvious thanks to our map, North Nashville leans left. With Harris running away with percentages like 88.6% in precinct 2-2, and 89% in precinct 1-7. When you look to the chart, one of the largest surprises was just how many votes she received in what is considered to be a state dominated by the Republican Party. Harris ran away with many of the precincts of Davidson County.

Code:

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)

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