2009-08-11 7 views
58

Il existe clairement un certain nombre de packages dans R pour toutes sortes d'analyses spatiales. Cela peut être vu dans le CRAN Task View: Analysis of Spatial Data. Ces paquets sont nombreux et divers, mais tout ce que je veux faire est un simple thematic maps. J'ai des données avec les codes FIPS des comtés et des états et j'ai des fichiers de formes ESRI des limites des comtés et des états et les codes FIPS qui les accompagnent, ce qui permet de se joindre aux données. Les fichiers de formes peuvent être facilement convertis en d'autres formats, si nécessaire.Développement de cartes thématiques géographiques avec R

Alors, quel est le moyen le plus simple de créer des cartes thématiques avec R?

Cette carte ressemble à elle a été créée avec un produit Arc Esri, mais c'est le genre de chose que je voudrais faire avec R:

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

+2

Notez que ce type de carte est appelé choroplèthes, et il y a des problèmes assez majeurs, à savoir que les zones géographiques plus petites ont tendance à avoir plus de gens (par exemple côte est vs Montana) donc le visuel l'apparence est biaisée vers les zones de faible densité de population. – hadley

+0

De plus, si vous traitez des données ESRI brutes, vous constaterez peut-être qu'il contient trop de sommets. Une tentative grossière de généralisation dans R peut être trouvée sur http://github.com/hadley/data-counties/tree/master – hadley

+0

@hadley, je suis complètement d'accord avec votre sentiment de «problèmes» avec les choroplèthes. C'est souvent un problème avec la représentation spatiale des données. –

Répondre

59

Le code suivant m'a bien servi. Personnalisez-le un peu et vous avez terminé. 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])) 

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

terrain il

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

oh ça a l'air vraiment génial! J'espérais que quelqu'un avait un exemple de code comme celui-ci. Merci! –

+0

putain de chaud! maintenant avec des images! –

+4

Où pouvez-vous obtenir les fichiers .shp? J'ai besoin d'un pour les Pays-Bas, mais je ne le trouve pas – Abdel

3

La galerie de graphiques de R a un très similar map qui devrait faire un bon point de départ. Le code est ici: www.ai.rug.nl/~hedderik/R/US2004. Vous devez ajouter une légende avec la fonction legend().

+0

Nice. Je n'arrête pas d'oublier que la Graphics Gallery est une ressource vraiment intéressante pour ce genre d'échantillons. – ars

+0

Notez que le premier lien est cassé. – metasequoia

4

Jetez un oeil à l'ensemble de PBSmapping (voir la vignette Borh/manuel et la démo) et this O'Reilly données dans Mashups R article (malheureusement il est pas gratuit, mais il vaut 4,99 $ pour télécharger selon Revolutions blog).

+0

Ses 5 $ et aucun DRM qui m'a fait plus que ravi de télécharger par principe seul. Bien écrit avec un bon code, recommande fortement! – Stedy

11

Découvrez les paquets

library(sp) 
library(rgdal) 

qui sont bien pour géodonnées et

library(RColorBrewer) 

est utile pour la coloration. This map est faite avec les packages ci-dessus et ce code:

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" est un shapefile et "Veg" est la variable affichée. Peut probablement être fait mieux avec un peu de travail. Je ne semble pas être autorisé à télécharger l'image, voici un lien vers l'image:

+0

très bonne info! Je vous remercie. Lorsque vous obtenez un peu plus de réputation, vous devriez être en mesure d'intégrer l'image. –

+6

Lien brisé - si vous pouviez le mettre à jour, alors peut-être quelqu'un avec suffisamment de rep intégré. –

17

Je pensais ajouter de nouvelles informations ici car il y a eu une activité autour de ce sujet depuis la publication. Voici deux grands liens vers "choroplèthes Carte R Challenge" sur le blog révolutions:

Choropleth Map R Challenge

Choropleth Challenge Results

Espérons que ceux-ci sont utiles pour personnes qui regardent cette question.

Tous les meilleurs,

Jay

+0

très bonne idée d'ajouter ça! Je vous remercie. –

+0

Merci JD. Il y a une tonne d'informations de traçage de cartes liées au blog Revolutions maintenant. – Jay

+0

Où pouvez-vous obtenir les fichiers .shp? J'en ai besoin pour les Pays-Bas, mais je ne le trouve pas .. – Abdel

4

Il est à seulement trois lignes!

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

Terminé !! changer seulement la deuxième ligne à tout vecteur de 63 éléments (chaque élément entre 0 et 657, qui sont membres de couleurs())

Maintenant, si vous voulez obtenir la fantaisie, vous pouvez écrire:

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

les 63 éléments représentent les 63 régions dont les noms vous pouvez obtenir en cours d'exécution:

map("state")$names; 
Questions connexes