Search code examples
rzipcodechoropleth

Choropleth zip code


I'm trying to create a choropleth of Zip Codes in part of Virginia to show some company data. I can get everything to run correctly except the last line aes(fill = growth). There, I get an error:

Error: Aesthetics must either be length one, or the same length as the dataProblems:growth

Here's my data:

My code:

library(ggplot2)
library(maptools)
library(rgdal)
library(plyr)

#set working directory
setwd("F:/Dropbox/Zip Codes")

#load Shapefile NOVA
Zips <- readOGR(dsn="F:/Dropbox/Zip Codes", layer="NOVA")

#load Company Data of Zip Codes
Company <- read.csv("Data.csv")

#set to data.frame
Company_df <- data.frame(Company)

#create growth vector
growth = Company_df[,'Growth']

#merge growth vector into Zips
Zips$growth = growth

#ggplot
Nmap = ggplot(Zips) +
aes(x = long, y = lat, group=group) +
geom_polygon() +
aes(fill = growth)
Nmap

Solution

  • I organized your directory structure a bit differently. Despite older code snippets on the internets, you don't need to bind the data to the data frame. But, you do need to fortify polygons to use with ggplot. Also, read.csv makes a data.frame, so you don't need to re-make one from that call.

    library(ggplot2)
    library(maptools)
    library(rgdal)
    library(ggthemes)
    
    setwd("~/Development/nova_choro")
    
    zips <- readOGR(dsn="zip_codes/NOVA.shp", layer="NOVA")
    company <- read.csv("data.csv")
    
    # this makes the polygons usable to ggplot2
    # and by using ZCTA5CE10 as the region id, 
    # you can then use that equivalent id field 
    # from the actual company data frame for the
    # choropleth colors
    
    zips_map <- fortify(zips, region="ZCTA5CE10")
    
    gg <- ggplot()
    # draw the base map polygons
    gg <- gg + geom_map(data=zips_map, map=zips_map,
                        aes(x=long, y=lat, map_id=id),
                        color="#7f7f7f", fill="white", size=0.25)
    # fill in the polygons
    gg <- gg + geom_map(data=company, map=zips_map,
                        aes(fill=Growth, map_id=zip_code_area),
                        color="#7f7f7f", size=0.25)
    # better color scheme
    gg <- gg + scale_fill_distiller(palette="Greens")
    # no "slashes" in the legend boxes
    gg <- gg + guides(fill=guide_legend(override.aes=list(colour=NA)))
    # use an actual projection (there may be a better one for NOVA
    gg <- gg + coord_map()
    # get rid of map chart junk
    gg <- gg + theme_map()
    gg
    

    enter image description here

    I did some checking and VA uses a modified Lambert Conic Conformal projection, so you can substitute the default Mercator coord_map with gg <- gg + coord_map("lambert", lat0=38.34427, lat1=39.14084) if you like and that should be close enough to what the official agencies use.