用R或Python绘制带邮政编码的热图
我有一些关于美国人口和公司信息的数据。
我想在一个州或更小的区域(比如城市)上绘制邮政编码区域。每个区域都会用特定的颜色和/或文字进行标注。输出的效果类似于http://maps.huge.info/,但是有几个要求:a) 要有标注的文字;b) 输出为PDF格式;c) 可以用R或Python编写脚本来实现。
有没有什么工具包和代码可以让我做到这一点呢?
8 个回答
3
可能有人会给你更直接的建议,但我觉得O'Reilly出版的《R语言中的数据混合》非常有趣……其中一部分是关于房屋止赎拍卖的空间映射。
10
在R语言中,有很多方法可以实现这个功能(可以查看这个空间视图);其中很多方法依赖于“maps”这个包。
看看这个关于2004年美国选举的酷炫例子。最后的效果看起来像这样:
这里有一个稍微不太好看的例子,展示了一个使用“maps”包和“lattice”的模型。
- Andrew Gelman制作了一些非常漂亮的图表,比如这个关于红州和蓝州的博客文章和后续文章。
这里有一个非常简单的例子,使用“gmaps”包,展示了每10万人中因谋杀被捕的人数按州分布的地图:
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)
39
我猜你想要的是静态地图。
(来源: eduardoleoni.com)
1) 首先,你需要去 census.gov 下载一些形状文件,这些文件包含了邮政区划和州的边界信息。
2) 然后,使用我在这个 SO问题 中分享的 plot.heat 函数。
举个例子(假设你已经把马里兰州的形状文件放在地图的子目录里):
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()