I have some US demographic and firmographic data.
I would like to plot zipcode areas in a state or a smaller region (e.g. city). Each area would be annotated by color and/or text specific to that area. The output would be similar to http://maps.huge.info/ but a) with annotated text; b) pdf output; c) scriptable in R or Python.
Is there any package and code that allows me to do this?
I am assuming you want static maps.
(source: eduardoleoni.com)
1) Get the shapefiles of the zip boundaries and state boundaries at census.gov:
2) Use the plot.heat function I posted in this SO question.
For example (assumes you have the maryland shapefiles in the map subdirectory):
library(maptools)
##substitute your shapefiles here
state.map <- readShapeSpatial("maps/st24_d00.shp")
zip.map <- readShapeSpatial("maps/zt24_d00.shp")
## this is the variable we will be plotting
zip.map@data$noise <- rnorm(nrow(zip.map@data))
## put the lab point x y locations of the zip codes in the data frame for easy retrieval
labelpos <- data.frame(do.call(rbind, lapply(zip.map@polygons, function(x) x@labpt)))
names(labelpos) <- c("x","y")
zip.map@data <- data.frame(zip.map@data, labelpos)
## plot it
png(file="map.png")
## plot colors
plot.heat(zip.map,state.map,z="noise",breaks=c(-Inf,-2,-1,0,1,2,Inf))
## plot text
with(zip.map@data[sample(1:nrow(zip.map@data), 10),] , text(x,y,NAME))
dev.off()
There are many ways to do this in R (see the spatial view); many of these depend on the "maps" package.
Check out this cool example of the US 2004 election. It ends up looking like this:
Here's a slightly ugly example of a model that uses the "maps" package with "lattice".
- Andrew Gelman made some very nice plots like this. See, for instance, this blog post on red states/blue states and this follow up post.
Here's a very simple example using the "gmaps" package, which shows a map of Arrests by state for arrests per 100,000 for Murder:
require(gmaps) data(USArrests) attach(USArrests) grid.newpage() grid.frame(name="map") grid.pack("map",USALevelPlot(states=rownames(USArrests),levels=Murder,col.fun=reds),height=unit(1,'null')) grid.pack("map",gradientLegendGrob(at=quantile(Murder),col.fun=reds),side="bottom",height=unit(.2,'npc')) detach(USArrests)
Someone may have something more direct for you, but I found O'Reilly's 'Data Mashups in R' very interesting... in part, it's a spatial mapping of home foreclosure auctions.
In Python, you can use shapefiles from the US census along with the basemap
package. Here is an example of filling in states according to population.
There is a rich and sophisticated series of packages in R to plot, do analysis, and other functions related to GIS. One place to get started is the CRAN task view on Spatial Data: This is a complex and sometimes arcane world, and takes some work to understand.
If you are looking for a free, very functional mapping application, may I suggest:
MapWindow ( mapwindow.com)
Daniel Levine at TechCrunch Trends has done nice things with the maps
package in R. He has code available on his site, too.
Paul's suggestion of looking into Processing - which Ben Fry used to make zipdecode - is also a good one, if you're up for learning a (Java-like) new language.
Depending on your application, a long way around might be to use something like this:
http://googlemapsmania.blogspot.com/2006/07/new-google-maps-us-zip-code-mashups.html
To map your data. If that wasn't quite what you wanted, you can get raw zip code shapefiles from census.gov and do it manually, which is quite a pain.
Also, if you haven't seen it, this is a neat way to interact with similar data, and might offer some pointers:
Check out this excellent online visualization tool by IBM http://manyeyes.alphaworks.ibm.com/manyeyes/
EDIT FYI, ManyEyes uses the Prefuse visualization toolkit for some of its viz. Even though it is a java-based framework, they also provide a Flash/ActionScript tool for the web.
来源:https://stackoverflow.com/questions/1441717/plotting-color-map-with-zip-codes-in-r-or-python