I've always loved US county level mapping because it provides enough detail to give an impression of complexity but retains a level of quick readability. I thought I'd try this out in R out a with a cliche but hopefully appealing set of charts. While I'm not particularly interested in political science I've always loved the graphics that define it. There is a kind of pop art beauty in the Red-Blue charts we're all used to seeing, and I thought I'd try to mimic those using R.
First, the data had to be located. As always, it's a little more difficult securing county level data than other metrics. The basic problem for election results county data is that while the data is well sourced at a state government level the county data is not easily found for all states in one place in an accessible way. I found a few great resources when searching for this data, and I ended up using two sources which seemed to be authorities on the subject for both the 2008 and 2012 presidential elections.
2008
For the 2008 election I used a file from Ducky/Webfoot, a blogger who cleaned up a contemporary fileset provided by USA Today. Since this set was already well cleaned there was little to do but read.csv() and code.
2012
Here I relied on a set provided by the Guardian which was referenced by some interesting blog posts on the subject. The Guardian provides the data in .xls or Google fusion table format. I chose to use the .xls file, which I cleaned somewhat and re-saved as a .csv.
I began by making sure the county FIPS codes lined up with those in the R maps package. It turned out that both sets were well populated with FIPS, but 2012 seemed to be missing some detail for Alaska (here I imputed a Romney win for the 10 or so states without data) and the 2008 set needed a transformation to create the five digit county FIPS code (state level multiplied by 1000 + county)
After reading in the .csv's I assigned a color value (#A12830 and #003A6F two of my favorite hex colors) to each FIPS based on the winning candidate (classic Red and Blue, no surprises here). This allows me to do a little trick later and quickly assign each county a color. I then assigned these colors and the Candidate names to lists to help create a legend later on:
Next I created a list of colors matched and sorted on county from the county.fips data in the maps package:
elect12colors <- elect12$col [match(cnty.fips, elect12$FIPS.Code)]
After this we're ready to build the map. Here I used the png device because I wanted to make a really big zoomable image. The map() function here is pretty straightforward but I'll note that it is the "matched" color list that I'm using to assign the Red/Blue to the map in order to separate the color mapping outside of the map() function.
2008 Election R script
#R script for plotting the county level Presidential popular vote results of 2008#Read in pre-formatted csv with binary M/O values for "Won" elect08 <- read.csv("prez2008.csv") #Assign appropriate color to winning candidate#"#A12830" is a dark red, "#003A6F" a darker blue elect08$col <- ifelse(elect08$Won=="M","#A12830","#003A6F") #Transform for FIPS from 2008 data elect08$newfips <- (elect08$State.FIPS*1000)+elect08$FIPS #Create lists for legend colorsElect = c("#A12830","#003A6F") leg <- c("McCain", "Obama") #Match colors to county.FIPS positions elect08colors <- elect08$col [match(cnty.fips, elect08$newfips)] #Map values using standard map() function, output to png devicepng("elect08.png",width = 3000, height = 1920, units = "px") map("county", col = elect08colors, fill = TRUE, resolution = 0, lty = 0, projection = "polyconic")#Add white borders for readability map("county", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.2, projection="polyconic")title("2008 Presidential Election Results by County", cex.lab=5, cex.axis=5, cex.main=5, cex.sub=5)box()legend("bottomright", leg, horiz = FALSE, fill = colorsElect, cex = 4)dev.off()
2012 Election Map R Script
#R script for plotting the county level Presidential popular vote results of 2012#Read in pre-formatted csv with binary R/O values for "Won" elect12 <- read.csv("2012_Elect.csv") #Assign appropriate color to winning candidate#"#A12830" is a dark red, "#003A6F" a darker blue elect12$col <- ifelse(elect12$Won=="O","#003A6F","#A12830") #Create lists for legend colorsElect = c("#003A6F","#A12830") leg <- c("Obama", "Romney") #Match colors to county.FIPS positions elect12colors <- elect12$col [match(cnty.fips, elect12$FIPS.Code)] #Map values using standard map() function, output to png devicepng("elect12.png",width = 3000, height = 1920, units = "px") map("county", col = elect12colors, fill = TRUE, resolution = 0, lty = 0, projection = "polyconic")#Add white borders for readability map("county", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.2, projection="polyconic")title("2012 Presidential Election Results by County", cex.lab=5, cex.axis=5, cex.main=5, cex.sub=5)box()legend("bottomright", leg, horiz = FALSE, fill = colorsElect, cex = 4)dev.off()
No comments:
Post a Comment