Animated map of US Election data

Author

Pranish

Animated Map of Us Election Data

Loading all the libraries and dataset

library(ggplot2)    #plot
Warning: package 'ggplot2' was built under R version 4.5.2
library(maps)       # map
Warning: package 'maps' was built under R version 4.5.2
library(readxl)     #reading xl files
Warning: package 'readxl' was built under R version 4.5.2
library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.5.2
Warning: package 'tibble' was built under R version 4.5.2
Warning: package 'tidyr' was built under R version 4.5.2
Warning: package 'readr' was built under R version 4.5.2
Warning: package 'purrr' was built under R version 4.5.2
Warning: package 'dplyr' was built under R version 4.5.2
Warning: package 'stringr' was built under R version 4.5.2
Warning: package 'forcats' was built under R version 4.5.2
Warning: package 'lubridate' was built under R version 4.5.2
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.6
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ lubridate 1.9.4     ✔ tibble    3.3.0
✔ purrr     1.2.0     ✔ tidyr     1.3.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
✖ purrr::map()    masks maps::map()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(magick)      #save gif
Warning: package 'magick' was built under R version 4.5.2
Linking to ImageMagick 6.9.13.29
Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
Disabled features: fontconfig, x11
library(transformr)
Warning: package 'transformr' was built under R version 4.5.2
library(gganimate)  #create an animation
Warning: package 'gganimate' was built under R version 4.5.2
library(av)
Warning: package 'av' was built under R version 4.5.2
library(mapdata)
Warning: package 'mapdata' was built under R version 4.5.2
state <- map_data("state")
ggplot(data=state, aes(x=long, y=lat, fill=region, group=group)) + 
  geom_polygon(color = "black") + 
  guides(fill=FALSE) + 
  theme(axis.title.x=element_blank(), axis.text.x=element_blank(), 
        axis.ticks.x=element_blank(),
        axis.title.y=element_blank(), axis.text.y=element_blank(), 
        axis.ticks.y=element_blank(),
        panel.background = element_rect(fill = "lightblue"),
        panel.grid.minor = element_line(color="lightblue"),
        panel.grid.major= element_line(color="lightblue"),) + 
  coord_fixed(1.3)
Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
of ggplot2 3.3.4.

elect24<-read_xlsx("C:/Users/Administrator/Downloads/Us Election data animated map/Election2024.xlsx")

comb<-left_join(elect24, state, by ="region")

ggplot(data=comb, aes(x=long, y=lat, fill=region, group=group)) + 
  geom_polygon(aes(fill=party) , color = "black") + 
  scale_fill_discrete(labels=c("REPUBLICAN","DEMOCRAT"),
                       type=c("darkblue","red"))+
  guides(fill=FALSE) + 
  theme(axis.title.x=element_blank(), axis.text.x=element_blank(), 
        axis.ticks.x=element_blank(),
        axis.title.y=element_blank(), axis.text.y=element_blank(), 
        axis.ticks.y=element_blank(),
        panel.background = element_rect(fill = "lightblue"),
        panel.grid.minor = element_line(color="lightblue"),
        panel.grid.major= element_line(color="lightblue"),) + 
  coord_fixed(1.3)

# 1. Read Data
elect <- read_xlsx("C:/Users/Administrator/Downloads/Us Election data animated map/Election.xlsx")

# 2. CRITICAL FIX: Convert region to lowercase to match 'state' data
elect$region <- tolower(elect$region) 

# 3. Join
# Use inner_join to automatically drop rows that don't match
comb <- inner_join(state, elect, by = "region")
Warning in inner_join(state, elect, by = "region"): Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 1 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship =
  "many-to-many"` to silence this warning.
# 4. Create Plot
p14 <- ggplot(data = comb, aes(x = long, y = lat, 
                               group = group, 
                               fill = party)) + 
  geom_polygon(color = "black", size = 0.1) + 
  
  # FIX: Use scale_fill_manual for specific colors
  scale_fill_manual(values = c("REPUBLICAN" = "darkblue", "DEMOCRAT" = "red")) +
  
  guides(fill = FALSE) + 
  theme_void() + # theme_void is a shortcut for removing axes/grids
  theme(
    panel.background = element_rect(fill = "lightblue"),
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  ) + 
  coord_fixed(1.3)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
# 5. Animate
anim <- p14 + 
  transition_states(year, 
                    transition_length = 1, 
                    state_length = 5) +
  ease_aes('linear') +
  ggtitle('US election results', 
          subtitle = 'Year {closest_state}')
# 6. Render and Save
# Ensure nframes is high enough for smooth playback (default is 100)
finalmap <- animate(anim, fps = 100)      
image_write(finalmap, path="C:/Users/Administrator/Downloads/Us_Election_map.gif")