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
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
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.