2009-08-11 6 views
58

В R существует целый ряд пакетов для всех видов пространственного анализа. Это можно увидеть в CRAN Task View: Analysis of Spatial Data. Эти пакеты многочисленны и разнообразны, но все, что я хочу сделать, это несколько простых thematic maps. У меня есть данные с кодами FIPS и графством и штатом, и у меня есть файлы формы ESRI границ графства и штата и сопровождающие коды FIPS, которые позволяют соединяться с данными. Файлы формы могут быть легко преобразованы в другие форматы, если это необходимо.Разработка географических тематических карт с помощью R

Итак, что является самым прямым способом создания тематических карт с R?

Эта карта выглядит, как он был создан с продуктом ESRI Arc, но это тип вещи, я хотел бы сделать с R:

alt text http://www.infousagov.com/images/choro.jpg Карта copied from here.

+2

Обратите внимание, что этот тип карты называется choropleth, и есть некоторые довольно серьезные проблемы, а именно, что более мелкие географические районы, как правило, имеют больше людей (например, восточное побережье против Монтаны), поэтому визуальный внешний вид предвзято относится к районам с низкой плотностью населения. – hadley

+0

Кроме того, если вы имеете дело с необработанными данными ESRI, вы можете обнаружить, что в нем слишком много вершин. Грубую попытку обобщения в R можно найти по адресу http://github.com/hadley/data-counties/tree/master – hadley

+0

@hadley, я полностью согласен с вашим чувством «проблем» с choropleths. Это часто проблема с пространственным представлением данных. –

ответ

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])) 

функция Heatmap

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

О, это выглядит действительно здорово! Я надеялся, что у кого-то был такой пример кода. Благодаря! –

+0

горячая чертова! теперь с картинками! –

+4

Где вы можете получить файлы .shp? Мне нужен один для Нидерландов, но не могу найти его – Abdel

3

Графическая галерея R имеет очень similar map, который должен сделать хорошую отправную точку. Код находится здесь: www.ai.rug.nl/~hedderik/R/US2004. Вам нужно добавить легенду с функцией legend().

+0

Nice. Я продолжаю забывать, что Графическая галерея - действительно опрятный ресурс для этих образцов. – ars

+0

Обратите внимание, что первая ссылка не работает. – metasequoia

4

Взгляните на пакет PBSmapping (см borh виньетка/ручной и демки) и this O'Reilly Mashups данных в R статью (к сожалению, это не бесплатно, но это стоит 4,99 $, чтобы загрузить , согласно Revolutions blog).

+0

Его $ 5 и отсутствие DRM, что сделало меня более чем счастливым скачать по принципу в одиночку. Хорошо написано с хорошим кодом, очень рекомендую! – Stedy

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" является шейпфайл и "Veg" переменная отображается. Скорее всего, с небольшой работой. Мне кажется, мне не разрешено загружать изображение, вот ссылка на картинку:

+0

очень хорошая информация! Спасибо. Когда вы получите немного больше репутации, вы сможете вставлять изображение. –

+6

Неработающая ссылка - если бы вы могли ее обновить, то, возможно, кто-то с достаточным представителем мог бы вставить. –

17

Думаю, что я добавлю новую информацию здесь, так как с этой публикации была какая-то деятельность по этой теме. Вот две большие ссылки на «Choropleth карта R Challenge» на блоге революций

Choropleth Map R Challenge

Choropleth Challenge Results

Надеется, они полезны для людей, просматривающих этот вопрос.

Все самое лучшее,

Jay

+0

очень хорошая идея добавить это! Спасибо. –

+0

Спасибо JD. Сейчас есть тонна информации о карте, которая связана через блог Revolutions. – Jay

+0

Где вы можете получить файлы .shp? Мне нужен он для Нидерландов, но он не может его найти .. – Abdel

4

Это всего три линии!

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

Done !! Просто измените вторую линию к любому вектору из 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;