Kuidas teha Eesti maakaarti R-is

Andres Võrk näitas hiljutises postituses, kuis Stataga maakaarti teha. Näitan, kuidas teha sama R-is.

Eestikov

Sammud järgmised:

1. Laeme Maa-ameti kodulehelt alla Eesti maakondade SHP-faili (hiljem kasutame ka omavalitsusüksuste faili, nii et selle võib kah alla laadida) ja pakime ta lahti töökataloogi (nii, et neli sealsisalduvat faili oleksid otse töökataloogis).

2. loeme sisse tarvilikud lisapakid (kogu järgnev kood on veidi enam kommenteeritud R-i failina saadaval siit).

require(“rgdal”)
require(“maptools”)
require(“ggplot2”)
require(“plyr”)
require(“rgeos”)

Kui nad installitud ei ole, aitab käsk:

install.packages(c(“rgdal”, “maptools”, “ggplot2”, “plyr”, “rgeos”))

3.  Loeme kaardiandmed sisse ja viime ta ggplotile söödavale kujule:

esmalt ütleme, et kaardifailid leiduvad töökataloogis (“./”) ja et failinimi on maakond_20131001 (ilma laiendita). Teine rida ütleb, et kasutame id-muutujana maakonnanime (andmetes muutuja MNIMI), selle abil saame hiljem igasugu muid andmeid maakonnaga siduda. Ülejäänu on tehniline – keda rohkem huvitab, leiab infot siit.

eesti = readOGR(dsn=”./”, layer=”maakond_20131001″)
eesti@data$id = eesti@data$MNIMI
eesti.points = fortify(eesti, region=”id”)
eesti.df = join(eesti.points, eesti@data, by=”id”)

3. Meil on vaja andmeid. Kasutame samu, mida Andres – osavõtuprotsenti kohalike omavalitsuste valimistel (mu andmed tulevad VVK lehelt, Andresel, ma vaatan, nad veidi erinevad :)). Oluline on siin see, et üks muutuja oleks identne kaardiandmeis olevaga. Siin on selleks maakond.

osavõtt<-data.frame(maakond=c(“Harju maakond”,”Hiiu maakond”,”Ida-Viru maakond”,”Jõgeva maakond”,”Järva maakond”,”Lääne maakond”, “Lääne-Viru maakond”, “Põlva maakond”, “Pärnu maakond”,”Rapla maakond”,”Saare maakond”,”Tartu maakond”, “Valga maakond”,”Viljandi maakond”, “Võru maakond”,”Tallinn”, “Tartu”),
osakaal=c(60.1, 55.7, 51.6, 59.8, 56.9,57.1, 53.6, 60.3, 52.5, 53.6, 49.6, 58.3,56.7, 52.7, 59,64.1, 52.6))

teeme osakaaludest sarnaselt Andrese tehtule vahemikud värvide jaoks:

osavõtt$osakaal.vahemik<-cut(osavõtt$osakaal, breaks=c(49, 52, 55, 58, 61, 65), labels=c(“49-52″,”52-55”, “55-58″,”58-61”, “61-65”))

4. Meil on vaja teada, mis koordinaatidele trükitakse need numbrid kaardil. Leiame selle jaoks maakondade tsentroid-keskpunktid ja lisame oma andmefailile.

maakondadetsentroidid = as.data.frame(gCentroid(eesti,byid=TRUE))
maakondadetsentroidid$maakond<-eesti$MNIMI
osavõtt<-join(osavõtt, maakondadetsentroidid)

5. Ja teeme graafiku enese:

p<-ggplot(osavõtt, aes(fill=osakaal.vahemik))+
geom_map(aes(map_id=maakond), map=eesti.df, color=”black”)+
expand_limits(x=eesti.df$long, y=eesti.df$lat)+
coord_fixed()+
geom_text(aes(label=osakaal,x=x, y=y), data=osavõtt)+
theme(axis.title=element_blank(), axis.text=element_blank(),line=element_blank(), panel.background=element_blank())+ ggtitle(“KOV valimistest 2013 osavõtjate osakaal maakondade kaupa”)+
scale_fill_brewer(“Osavõtt\nvalimistest (%)”) +
annotate(“text”, x = 700000, y = 6370000, label = c(“kaart: Maa-amet, 01.10.2013″), size=3)

ggsave(p, file=”Eestikov.png”, height=2, width=3, scale=3)

Meie Maa-amet on mingil mulle mõistetamatul põhjusel üks kolmest Euroopa Liidu maa-ametist, kes ei täi neid kaarte päris vabalt välja anda, vaid nõuab nii viidet Maa-ametile kui kuupäevale, mis seisuga kaart on. Seetõttu too kiri kaardi allservas. Ma loodan, et sellisel tasemel andmete juurest kaob see suht mõttetu nõue tulevikus ära.

Ülalolev kaart on sellega valmis.

Iseenesest on meil olemas ka Tallinna ja Tartu andmed, paneme need ka graafikule (tulemus selline, nagu ta siin all paistab) – see aitab ehk neid, kel vaja väiksemate omavalitsusüksustega tegeleda.

Eestikov2

Selleks pakime töökataloogi lahti omavalitsusüksuste .shp-faili ja loeme ta taas R-i sisse:

eestiov = readOGR(dsn=”./”, layer=”omavalitsus_20131001″)

Teeme ta ggplotile söödavaks, kasutades id-na omavalitsusüksuse nime muutujat (ONIMI neis andmeis).

eestiov@data$id = eestiov@data$ONIMI
eestiov.points = fortify(eestiov, region=”id”)
eestiov.df = join(eestiov.points, eestiov@data, by=”id”)

Jätame alles üksnes Tallinna ja Tartu

tlntrt.df<-subset(eestiov.df, id%in%c(“Tallinna linn”, “Tartu linn”))

Leiame nende asukoha (tegelikult peaks leidma nt loodenurga, praegu leiab tsentroidi)

tlntrttsentroidid = as.data.frame(gCentroid(eestiov,byid=TRUE))

tlntrttsentroidid$maakond<-eestiov$ONIMI
tlntrttsentroidid<-subset(tlntrttsentroidid, maakond%in%c(“Tallinna linn”, “Tartu linn”))

Lisame need andmed andmetabelisse “osavõtt”:

osavõtt$x[osavõtt$maakond==”Tallinna linn”]<-tlntrttsentroidid$x[tlntrttsentroidid$maakond==”Tallinna linn”]
osavõtt$y[osavõtt$maakond==”Tallinna linn”]<-tlntrttsentroidid$y[tlntrttsentroidid$maakond==”Tallinna linn”]
osavõtt$x[osavõtt$maakond==”Tartu linn”]<-tlntrttsentroidid$x[tlntrttsentroidid$maakond==”Tartu linn”]
osavõtt$y[osavõtt$maakond==”Tartu linn”]<-tlntrttsentroidid$y[tlntrttsentroidid$maakond==”Tartu linn”]

Muudame Tallinna linna Tallinnaks ja Tartu linna Tartuks

osavõtt$maakond<-revalue(osavõtt$maakond, replace=c(“Tallinna linn”=”Tallinn”, “Tartu linn”=”Tartu”))
tlntrt.df$id<-revalue(tlntrt.df$id, replace=c(“Tallinna linn”=”Tallinn”, “Tartu linn”=”Tartu”))

ja teeme graafiku

p<-ggplot(osavõtt, aes(fill=osakaal.vahemik))+
geom_map(aes(map_id=maakond), map=eesti.df, color=”grey”)+
geom_map(aes(map_id=maakond), map=tlntrt.df, color=”black”)+
expand_limits(x=eesti.df$long, y=eesti.df$lat)+
coord_fixed()+
geom_text(aes(label=maakond,x=x-5000, y=y+5000), data=subset(osavõtt, maakond%in%c(“Tallinn”, “Tartu”)), hjust=1, vjust=0)+
theme(axis.title=element_blank(), axis.text=element_blank(),line=element_blank(), panel.background=element_blank())+
ggtitle(“KOV valimistest 2013 osavõtjate osakaal maakondade kaupa”)+
scale_fill_brewer(“Osavõtt\nvalimistest (%)”) +
annotate(“text”, x = 700000, y = 6370000, label = c(“kaart: Maa-amet, 01.10.2013″), size=3, color=”grey”) 

ggsave(p, file=”Eestikov2.png”, height=2, width=3, scale=3)

R-is kaartidega töötades tasub olla tähelepanelik ses osas, et mõni ala teise “alla” ei jääks. Seda võib ette tulla (on minulgi tulnud) juhul kui üks üksus teise “sees”. Sellisel juhul tuleb see üksus sarnaselt sellega, kuis siin Tallinna ja Tartu lisasin lihtsalt hilisemas kihis uuesti lisada. Abi saab nt sellelt lingilt: https://github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles

eelnev kood .R failis: siin.

Rubriigid: Näpunäide, sildid: . Salvesta püsiviide oma järjehoidjasse.

1 Response to Kuidas teha Eesti maakaarti R-is

  1. ristohinno ütles:

    Väga hea abimaterjal 🙂 Mul endal õnnestus windowsil kodeeringu probleemide otsa joosta. Nimelt ei suutnud kood siduda SHP failides ja andmetabelis olevaid maakondi siduda, mis sisaldavad täpitähti (kaart jäi neis kohtades lihtsalt tühjaks). Ei taha kohe kuidagi ise UTF-8 kasutada. Kuna mina haldusreformi teha ei taha ja loodan, et meie piirid ikka peavad, siis tegin täienduse koodi. 🙂 Kel sama mure, saab ehk siit abi: https://github.com/RRisto/Eesti_kaart

Lisa kommentaar

Täida nõutavad väljad või kliki ikoonile, et sisse logida:

WordPress.com Logo

Sa kommenteerid kasutades oma WordPress.com kontot. Logi välja /  Muuda )

Google photo

Sa kommenteerid kasutades oma Google kontot. Logi välja /  Muuda )

Twitter picture

Sa kommenteerid kasutades oma Twitter kontot. Logi välja /  Muuda )

Facebook photo

Sa kommenteerid kasutades oma Facebook kontot. Logi välja /  Muuda )

Connecting to %s