2009-08-11 35 views
58

R中有很多包可用于各种空间分析。这可以通过在CRAN Task View: Analysis of Spatial Data中看到。这些软件包是众多和多样的,但我想要做的只是一些简单的thematic maps。我拥有县和州FIPS代码的数据,并且我拥有县和州边界的ESRI形状文件以及允许加入数据的随附FIPS代码。如果需要,可以将形状文件轻松转换为其他格式。用R开发地理专题地图

那么用R创建专题地图最直接的方法是什么?

这张地图看起来就像是与ESRI弧产品上创建的,但是这是我想有R做的事类型:

alt text http://www.infousagov.com/images/choro.jpg地图copied from here

+2

请注意,此类型的映射被称为等值线,并且有一些非常重大的问题,即较小的地理区域往往有更多的人(如东海岸对蒙大拿州),所以视觉外观偏向于人口密度低的地区。 – hadley 2009-08-12 01:50:19

+0

另外,如果你正在处理原始的ESRI数据,你可能会发现它有太多的顶点。在R中泛化的粗略尝试可以在http://github.com/hadley/data-counties/tree/master – hadley 2009-08-12 01:55:07

+0

@hadley找到,我完全赞同你对“问题”的看法。这通常是数据空间表示的一个问题。 – 2009-08-12 15:50:14

回答

59

以下代码对我很好。自定义一点,你就完成了。 alt text http://files.eduardoleoni.com/map.png

library(maptools) 
substitute your shapefiles here 
state.map <- readShapeSpatial("BRASIL.shp") 
counties.map <- readShapeSpatial("55mu2500gsd.shp") 
## this is the variable we will be plotting 
[email protected]$noise <- rnorm(nrow([email protected])) 

热力图功能

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([email protected][,z],na.rm=TRUE)*10)/10 
      , 
      ceiling(max([email protected][,z],na.rm=TRUE)*10)/10 
      ,.1) 
    } 
    [email protected]$zCat <- cut([email protected][,z],breaks,include.lowest=TRUE) 
    cutpoints <- levels([email protected]$zCat) 
    if (is.null(col.vec)) col.vec <- heat.colors(length(levels([email protected]$zCat))) 
    if (reverse) { 
    cutpointsColors <- rev(col.vec) 
    } else { 
    cutpointsColors <- col.vec 
    } 
    levels([email protected]$zCat) <- cutpointsColors 
    plot(counties.map,border=gray(.8), lwd=bw,axes = FALSE, las = 1,col=as.character([email protected]$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)) 
+0

哦,看起来真棒!我希望有人有这样的代码示例。谢谢! – 2009-08-11 15:58:08

+0

该死的热!现在有图片! – 2009-08-11 16:06:54

+4

哪里可以得到.shp文件?我需要一个为荷兰,但找不到它 – Abdel 2012-02-08 18:18:07

3

R Graphics Gallery有一个非常好的起点similar map。代码在这里:www.ai.rug.nl/~hedderik/R/US2004。您需要使用legend()函数添加图例。

+0

不错。我一直忘记图形库是这些样本的一个非常整洁的资源。 – ars 2009-08-13 04:36:52

+0

请注意,第一个链接已损坏。 – metasequoia 2013-08-21 04:53:38

4

看看在PBSmapping包(见borh暗角/手册和演示)和 this奥赖利数据混搭中的R文章(可惜它不是免费的,但它是值得$ 4.99下载,根据Revolutions blog)。

+0

它的5美元,没有DRM让我更乐意单独下载。用良好的代码编写,强烈推荐! – Stedy 2010-04-27 22:23:35

11

退房包

library(sp) 
library(rgdal) 

这对地理数据不错,和

library(RColorBrewer) 

对着色很有用。 This map由与上述包和该代码:

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"是shape文件和"Veg"是显示的变量。做一点工作可能会做得更好。我似乎没有被允许上传图片,这里是一个链接图片:

+0

非常好的信息!谢谢。当你获得更多的声誉时,你应该能够嵌入图像。 – 2009-09-08 20:32:45

+6

损坏的链接 - 如果你可以更新它,那么也许有足够代表的人可以嵌入。 – 2011-12-06 00:09:05

17

以为我会在这里添加一些新的信息,因为自发布以来已经有一些关于此主题的活动。下面是对革命博客两大环节,以“地区分布图 - [R挑战”:

Choropleth Map R Challenge

Choropleth Challenge Results

希望这些都是人查看此问题非常有用。

一切顺利,

周杰伦

+0

非常好的主意添加!谢谢。 – 2010-02-10 16:26:47

+0

谢谢JD。现在有大量的地图绘制信息通过Revolutions博客链接在一起。 – Jay 2010-02-10 17:02:59

+0

哪里可以得到.shp文件?我需要一个荷兰人,但是找不到它.. – Abdel 2012-02-08 18:17:47

4

这只是三线!

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

完成! 第二行就变成63元(0和657之间的每一个元素,这是颜色()成员),如果你想获得幻想

现在的任何载体,你可以写:

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

该63个元素代表了63个区的名字,你可以通过运行得到:

map("state")$names;