R ggplot2 fusionner avec shapefile et csv des données pour remplir les polygones
Tous les jours, nous produisons des cartes qui montrent un niveau calculé pour une température de 30 domaines distincts de notre région, chaque zone est remplie avec une couleur différente selon le niveau. Cette cartes ressembler
Maintenant, je veux passer à la génération de la carte à R. j'ai téléchargé provinciaux et municipaux limites (vous pouvez trouver les limites de l'ensemble de l'Espagne ou ici le un sous-ensemble de ma région) et la gestion à la parcelle avec ggplot2 suivantes Hadley du exemple.
Je peux aussi produire un fichier ascii qui contient deux colonnes: l'identificateur (CODINE) et tous les jours. Vous pouvez télécharger ici.
C'est mon premier script de la tentative de complot avec les fichiers de formes R et ggplot2 il peut donc y avoir des erreurs et pour s'assurer qu'il peut être amélioré, suggestions bienvenues. Le code suivant (basé sur Hadley déjà cité) fonctionne pour moi:
> require("rgdal")
> require("maptools")
> require("ggplot2")
> require("plyr")
# Reading municipal boundaries
esp = readOGR(dsn=".", layer="lineas_limite_municipales_etrs89")
muni=subset(esp, esp$PROV1 == "46" | esp$PROV1 == "12" | esp$PROV1 == "3")
muni@data$id = rownames(muni@data)
muni.points = fortify(muni, region="id")
muni.df = join(muni.points, muni@data, by="id")
# Reading province boundaries
prov = readOGR(dsn=".", layer="poligonos_provincia_etrs89")
pr=subset(prov, prov$CODINE == "46" | prov$CODINE == "12" | prov$CODINE == "03" )
pr@data$id = rownames(pr@data)
pr.points = fortify(pr, region="id")
pr.df = join(pr.points, pr@data, by="id")
ggplot(muni.df) + aes(long,lat,group=group) + geom_path(color="blue") +
+ coord_equal()+ geom_path(data=pr.df, +
aes(x=long, y=lat, group=group),color="red", size=0.5)
Ce code parcelles d'une belle carte avec toutes les limites
Pour les polygones de remplissage par niveau, j'ai essayé de lire, puis de fusionner comme suggéré dans http://tormodboe.wordpress.com/2011/02/22/g%C3%B8y-med-kart-2/
niveau=lire.csv("niveaux.dat",header=T,sep=" ")
munlevel=merge(muni.df,niveau,by="CODINE")
mais il donne une erreur
Erreur fr fix.by(par.x, x) : "par" doit spécifier une unique colonne valide
Je ne suis pas familier avec les fichiers de formes, peut-être que j'ai besoin d'en savoir plus sur shp attributs de données pour trouver le bon choix de fusionner les deux ensembles de données. Comment puis-je fusionner les données afin que je puisse tracer les lignes (les limites municipales) et le remplir avec des niveaux?
OriginalL'auteur pacomet | 2013-11-05
Vous devez vous connecter pour publier un commentaire.
[NB: Cette question a été posée plus d'un mois, si l'OP a sans doute trouvé un autre moyen de résoudre leur problème. Je suis tombé sur elle tout en travaillant sur cette question relative à la. Cette réponse est incluse dans l'espoir qu'il sera bénéfique pour quelqu'un d'autre.]
Cela semble être ce que l'OP demande...
... et a été produit avec le code suivant:
Explication:
Les fichiers de formes importées dans R avec
readOGR(...)
sont de typeSpacialDataFrame
et ont deux sections principales: une ploygon section qui contient les coordonnées de tous les points sur chaque polygone, et un données section qui contient des informations sur chaque polygone (donc, une ligne par polygone). Ceux-ci peuvent être référencés, par exemple, à l'aide demuni@polygons
etmuni@data
. La fonction d'utilitéfortify(...)
convertit le polygone de la section d'une trame de données organisées pour comploter avecggplot
. De sorte que le flux de production de base est:Le joint doit être fait sur les champs communs, et c'est là que la plupart des problèmes viennent. Chaque polygone dans le shapefile original a un attribut ID unique. L'exécution de
fortify(...)
sur le shapefile crée une colonne,id
, qui est basée sur ce. Mais il n'y a pas de colonne ID dans la section de données. Au lieu de cela, le polygone Identifiants sont stockés en tant que noms de ligne. Alors d'abord, nous devons ajouter uneid
colonne demuni@data
comme suit:Maintenant, nous avons une
id
champ dansmuni@data
et un correspondantid
champ dansmuni.df
, afin que nous puissions faire la jointure:Pour créer la carte, nous aurons besoin de définir les couleurs de remplissage en fonction de la température. Pour ce faire nous avons besoin de joindre la
LEVEL
colonne detemp.data
àmuni.df
. Danstemp.data
il y a un champCODINE
qui identifie la municipalité. Il y a aussi, maintenant, un champ correspondantCODIGOINE
dansmuni.df
. Mais il y a un problème:CODIGOINE
estchar(5)
, avec les zéros non significatifs, alors queCODINE
est entier qui signifie que les zéros non significatifs sont manquantes (importé à partir d'Excel, peut-être?). Donc, juste de joindre ces deux champs ne produit pas de matchs. Il faut d'abord convertirCODINE
enchar(5)
avec les zéros non significatifs:Maintenant, nous pouvons rejoindre
temp.dat
àmuni.df
basée sur les champs correspondants.Nous utilisons
merge(...)
au lieu dejoin(...)
parce que les champs de jointure ont des noms différents etjoin(...)
exige qu'ils aient le même nom. (Notez, cependant, quejoin(...)
est plus rapide et devrait être utilisé si possible). Donc, finalement, nous avons un bloc de données qui contient toutes les informations pour tracer les polygones et de la températureLEVEL
qui peut être utilisé pour définir la couleur de remplissage pour chaque polygone.Quelques notes sur les OP le code original:
OP première carte (le vert en haut) identifie les "30 zones distinctes pour notre région...". Je n'ai trouvé aucun fichier de formes (shapefile l'identification de ces zones. La municipalité fichier identifie 543 municipalités, et j'ai pu voir aucun moyen de groupe dans ces zones 30. En outre, le niveau de température fichier a 542 lignes, une pour chaque municipalité (plus ou moins).
OP est de l'importation de fichiers pour la municipalité de tracer les limites. Vous n'en avez pas besoin car
geom_polygon(...)
allez dessiner (et de remplir) les polygones et lesgeom_path(...)
permettra de tracer les limites.Si cela fonctionne pour vous s'il vous plaît envisager de choisir comme réponse (coche verte).
J'ai eu quelques problème avec votre script à cause de mon shapefile. J'ai téléchargé à nouveau et maintenant le code s'exécute parfait pour mes besoins. Excellent travail @jlhoward
C'est fantastique. Merci pour cette très utile explication!
J'ai dû le faire un peu différemment. Avec
fortify(muni, region = 'id')
(sinon il ne l'utilisez pasid
variable) et avecmerge
(je suppose, une version différente dedplyr
). Voir stackoverflow.com/questions/11052544/...OriginalL'auteur jlhoward