2009-08-11 14 views
58

Istnieje wyraźnie liczba paczek w R dla wszystkich rodzajów analiz przestrzennych. Można to zauważyć w CRAN Task View: Analysis of Spatial Data. Pakiety te są liczne i różnorodne, ale wszystko, co chcę zrobić, to prosta thematic maps. Mam dane z hrabstwami i stanowymi kodami FIPS i mam pliki kształtu ESRI granic hrabstwa i stanu oraz towarzyszące im kody FIPS, które pozwalają na łączenie się z danymi. Pliki kształtu można w razie potrzeby łatwo przekonwertować na inne formaty.Tworzenie geograficznych map tematycznych z R

Jaki jest najprostszy sposób tworzenia map tematycznych z R?

Ta mapa wygląda jakby został stworzony z produktem ESRI Arc, ale jest to rodzaj rzeczy chciałbym zrobić z R:

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

+2

Należy zauważyć, że ten rodzaj mapie nazywa się choropleth, i istnieją pewne dość poważne problemy, a mianowicie, że mniejsze obszary geograficzne mają tendencję do większej liczby osób (np. wschodnie wybrzeże kontra Montana), więc wizualne Wygląd jest stronniczy w stosunku do obszarów o niskiej gęstości zaludnienia. – hadley

+0

Ponadto, jeśli masz do czynienia z surowymi danymi ESRI, możesz zauważyć, że ma on zbyt wiele wierzchołków. Surową próbę uogólnienia w R można znaleźć na stronie http://github.com/hadley/data-counties/tree/master – hadley

+0

@hadley, Całkowicie zgadzam się z twoimi odczuciami "problemów" z choropletami. Często jest to problem z przestrzenną reprezentacją danych. –

Odpowiedz

59

Poniższy kod dobrze mi służył. Dostosuj go trochę i gotowe. 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])) 

funkcja termiczna

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") 
} 

działka to

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

oh, który wygląda naprawdę świetnie! Miałem nadzieję, że ktoś ma taki przykład kodu. Dzięki! –

+0

gorąco cholera! teraz ze zdjęciami! –

+4

Skąd można pobrać pliki .shp? Potrzebuję jednego dla Holandii, ale nie mogę go znaleźć. – Abdel

3

Galeria grafiki R ma bardzo similar map, co powinno stanowić dobry punkt wyjścia. Kod znajduje się tutaj: www.ai.rug.nl/~hedderik/R/US2004. Musisz dodać legendę z funkcją legend().

+0

Nice. Ciągle zapominam, że Galeria Graficzna jest naprawdę dobrym źródłem dla tego rodzaju próbek. – ars

+0

Pamiętaj, że pierwszy link jest zepsuty. – metasequoia

4

Spójrz na opakowaniu PBSmapping (patrz borh winieta/ręczne i demo) i this O'Reilly danych Mashups w R artykuł (niestety nie jest za darmo, ale warto 4.99 $ do pobrania , zgodnie z Revolutions blog).

+0

Jego 5 USD i bez DRM, które sprawiło, że jestem bardziej niż szczęśliwy, aby pobrać na zasadzie sam. Dobrze napisany z dobrym kodem, bardzo polecam! – Stedy

11

Sprawdź pakiety

library(sp) 
library(rgdal) 

które są miłe dla danych geograficznych oraz

library(RColorBrewer) 

jest przydatny do kolorowania. This map jest wykonany z powyższych pakietów i tym kodem:

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" jest shapefile i "Veg" jest zmienna wyświetlana. Prawdopodobnie można to zrobić lepiej przy odrobinie pracy. Wydaje mi się, że nie wolno mi przesłać obrazu, tutaj jest link do obrazu:

+0

bardzo dobra informacja! Dziękuję Ci. Gdy pojawi się trochę więcej reputacji, powinieneś być w stanie osadzić obraz. –

+6

Uszkodzony link - jeśli mógłbyś go zaktualizować, to może ktoś, kto ma wystarczającą reprezentację, mógłby osadzić. –

17

Pomyślałem, że dodam tu trochę nowych informacji, ponieważ od tego czasu pojawiły się pewne działania związane z tym tematem. Oto dwa wielkie linki do "Choropleth Mapa R Challenge" na blogu Revolutions:

Choropleth Map R Challenge

Choropleth Challenge Results

Mam nadzieję, że są one przydatne dla osób odwiedzających to pytanie.

Wszystko co najlepsze,

Jay

+0

bardzo dobry pomysł, aby to dodać! Dziękuję Ci. –

+0

Dzięki JD. Na blogu Revolutions znajduje się mnóstwo informacji na temat kartograficznych map. – Jay

+0

Skąd można pobrać pliki .shp? Potrzebuję jednego dla Holandii, ale nie mogę go znaleźć .. – Abdel

4

To tylko trzy linie!

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

Zrobione! Wystarczy zmienić drugą linię do dowolnego wektora 63 elementów (każdy element pomiędzy 0 i 657, które są członkami kolorach())

Teraz, jeśli chcesz dostać fantazję można napisać:

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

w 63 elementy stanowią regiony 63, których nazwy można uzyskać przez wykonanie:

map("state")$names; 
Powiązane problemy