使用R语言开发地理专题地图

59
在R中,有很多用于各种空间分析的软件包。可以在CRAN任务视图:空间数据分析中看到这一点。这些软件包众多且多样,但我只想做一些简单的专题地图。我有县和州FIPS代码的数据,还有ESRI县和州边界的形状文件以及相应的FIPS代码,可以将其与数据连接起来。如果需要,形状文件可以很容易地转换为其他格式。
那么使用R创建专题地图最直接的方法是什么?
这张地图看起来像是使用ESRI Arc产品创建的,但这是我想用R做的事情: alt text http://www.infousagov.com/images/choro.jpg 地图 从这里复制

2
请注意,这种类型的地图被称为等值线地图,而且存在一些相当大的问题,主要是较小的地理区域往往有更多的人口(例如东海岸与蒙大拿州之间),因此视觉效果偏向于人口密度低的地区。 - hadley
此外,如果您正在处理原始的ESRI数据,则可能会发现它具有过多的顶点。您可以在http://github.com/hadley/data-counties/tree/master找到R中概括的粗略尝试。 - hadley
@hadley,我完全同意你对“区域地图”存在的问题的看法。这通常是数据空间表现的一个问题。 - JD Long
@JDLong @hadley 如果你研究的是玉米而不是人,那么这可能并不是什么大问题。 - Eduardo Leoni
@leoniedu,你的观点是正确的,关于玉米的问题。我需要处理的是这样的事情:大地理区域生产的历史波动性比小地理区域的生产波动性低,这仅仅是由于样本大小不同造成的。因此,当地理区域的大小不同时,很难确定真正的生产者水平的“风险”。但这也使得工作有趣。 :) - JD Long
注:地图链接现已失效。 - metasequoia
7个回答

62
下面的代码一直为我所用。稍作修改就可以使用了。 alt text
(来源: eduardoleoni.com)
library(maptools)
substitute your shapefiles here
state.map <- readShapeSpatial("BRASIL.shp")
counties.map <- readShapeSpatial("55mu2500gsd.shp")
## this is the variable we will be plotting
counties.map@data$noise <- rnorm(nrow(counties.map@data))

热力图函数

plot.heat <- function(counties.map,state.map,z,title=NULL,breaks=NULL,reverse=FALSE,cex.legend=1,bw=.2,col.vec=NULL,plot.legend=TRUE) {
  ##Break down the value variable
  if (is.null(breaks)) {
    breaks=
      seq(
          floor(min(counties.map@data[,z],na.rm=TRUE)*10)/10
          ,
          ceiling(max(counties.map@data[,z],na.rm=TRUE)*10)/10
          ,.1)
  }
  counties.map@data$zCat <- cut(counties.map@data[,z],breaks,include.lowest=TRUE)
  cutpoints <- levels(counties.map@data$zCat)
  if (is.null(col.vec)) col.vec <- heat.colors(length(levels(counties.map@data$zCat)))
  if (reverse) {
    cutpointsColors <- rev(col.vec)
  } else {
    cutpointsColors <- col.vec
  }
  levels(counties.map@data$zCat) <- cutpointsColors
  plot(counties.map,border=gray(.8), lwd=bw,axes = FALSE, las = 1,col=as.character(counties.map@data$zCat))
  if (!is.null(state.map)) {
    plot(state.map,add=TRUE,lwd=1)
  }
  ##with(counties.map.c,text(x,y,name,cex=0.75))
  if (plot.legend) legend("bottomleft", cutpoints, fill = cutpointsColors,bty="n",title=title,cex=cex.legend)
  ##title("Cartogram")
}

绘制它

plot.heat(counties.map,state.map,z="noise",breaks=c(-Inf,-2,-1,0,1,2,Inf))

哦,这看起来真的很棒!我一直希望有人能提供像这样的代码示例。谢谢! - JD Long
4
你可以在哪里获取.shp文件?我需要荷兰的一个,但找不到。答:您可以在哪里获取.shp文件?我需要荷兰的一个,但找不到。 - Abdel
1
你好,是否可以添加外部变量而不是生成随机变量?简单来说,我想绘制预测收益率的百分比变化作为我的变量。因此,我需要修改包含地图坐标的形状文件以包含收益数据吗? - iouraich

17

既然这个话题自发布以来一直有所活跃,我想在这里添加一些新信息。以下是两个“Choropleth Map R Challenge”比赛的链接,它们都发表在Revolution博客上:

Choropleth Map R Challenge

Choropleth Challenge Results

希望这些对查看此问题的人有用。

祝一切顺利,

Jay


谢谢JD。现在Revolution博客上有大量的地图绘制信息链接。 - Jay
你可以在哪里获取 .shp 文件?我需要荷兰的一个,但找不到它... - Abdel

11

查看这些软件包

library(sp)
library(rgdal)

这些非常适合地理数据。

library(RColorBrewer)  

这个工具非常有用,可以用来着色。使用上面的包和这段代码可以制作出这张地图

VegMap <- readOGR(".", "VegMapFile")
Veg9<-brewer.pal(9,'Set2')
spplot(VegMap, "Veg", col.regions=Veg9,
 +at=c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5),
 +main='Vegetation map')

"VegMapFile" 是一个shapefile文件,而"Veg"则是其所显示的变量。通过一些小工作可能可以做得更好。我好像不能上传图片,这里放个链接:


非常好的信息!谢谢。当您获得更多声誉时,您应该能够嵌入图像。 - JD Long
6
链接失效了 - 如果您能更新它,那么也许有足够声望的人可以嵌入它。 - mindless.panda

4

这只是三行代码!

library(maps);
colors = floor(runif(63)*657);
map("state", col = colors, fill = T, resolution = 0)

完成了!! 只需将第二行更改为任何包含63个元素的向量(每个元素介于0和657之间,这些元素是colors()的成员)

现在,如果您想要更加高级的内容,可以编写:

library(maps);
library(mapproj);
colors = floor(runif(63)*657);
map("state", col = colors, fill = T, projection = "polyconic", resolution = 0);

这 63 个元素代表着 63 个地区,你可以通过运行以下命令来获取它们的名称:

map("state")$names;

4

请查看PBSmapping包(请参阅vignette/manual和演示),以及O'Reilly的Data Mashups in R文章this(不幸的是它不是免费的,但可以花费4.99美元下载,根据Revolutions blog的说法值得购买)。


它只要5美元,而且没有数字版权管理,这让我因原则而下载而感到非常高兴。写得很好,代码也很棒,强烈推荐! - Stedy

3

R Graphics Gallery有一个非常相似的地图,可以作为很好的起点。代码在这里: www.ai.rug.nl/~hedderik/R/US2004。您需要使用legend()函数添加一个图例。


很好。我老是忘记了“图形库”是这种样例的一个非常棒的资源。 - ars
请注意第一个链接已经失效。 - metasequoia

0
如果你在2020年代遇到这个问题,使用神奇的tmap包。它非常简单直接,彻底革新了在R中制作地图的方式。不要费心研究这个复杂的代码。查看vignette here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接