2009-08-11 68 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;