Davidson County election analysis

In the map we see that Harris shows a higher voter concentration in cities near and around Nashville. In these areas higher population density and diversity likely leads to Harris’ voter support. We can also see from the precinct chart that areas with higher population didn’t necessarily have the most voter turnout for Harris. This leads us to believe that her support came from concentrated areas of support rather than areas with the highest population.

Code:

{r include=FALSE}
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"))

DataAndMap <- left_join(VoteData2,MapInfo)

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