R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Interaktiivinen kuntakartta

R:n karttaominaisuudet parantuvat vuosi vuodelta. Samaten kartta-aineiston saatavuus on viime vuosina oleellisesti parantunut Maanmittauslaitoksen ja Tilastokeskuksen alettua tarjota pohjakarttoja ilmaiseksi. Muun muassa Louhos-blogissa on jo aiemmin katsahdettu suomalaisten kuntien tietojen visualisointiin R:ssä, mutta kirjoittelin tuota muistamatta R:n karttaominaisuuksista myös lyhyen luentomateriaalin.

Täydennän luentomateriaalin vielä seuraavalla esityksellä kloropleettikarttojen muodostamisesta Tilastokeskuksen Kuntien avainluvut -tilastosta. Tilastokeskus on toki tehnyt vastaavanlaisen visualisoinnin, mutta sama onnistuu nykyisin hyvin R:lläkin.

Kartan tuottamiseen tarvitaan karttapohja ja aineisto, jotka haetaan seuraavassa skriptissä:

 
# Ladataan paketit
library(maptools)
library(pxR)
library(rio)
library(tmap)
library(RColorBrewer)
library(rgdal)
library(leafletR)
 
# Työhakemisto
setwd("C:/Users/lenovo/Desktop")
 
# Karttapohja
# http://geo.stat.fi/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=tilastointialueet:kunta1000k_2015&outputFormat=SHAPE-ZIP
 
# Luetaan shapefile
sh<-readShapeSpatial("C:\\Users\\lenovo\\Desktop\\kunta1000k_2015\\kunta1000k_2015.shp", proj4string=CRS("+init=epsg:3067"),verbose=TRUE)
 
# Konvertoidaan koordinaatisto WGS84:ksi
sh.wgs84 <- spTransform(sh, CRS("+init=epsg:4326"))
 
# Kunta-aineisto
# Suora lataus ei toimi, taulukko on virheilmoituksen mukaan rikki
# dat<-as.data.frame(read.px("https://pxnet2.stat.fi/PXWeb/Resources/PX/Databases/Kuntien_avainluvut/2017/kuntien_avainluvut_2017_aikasarja.px"))
# Ladataan käsin kaikkien kuntien avainluvut vuodelta 2015
dat<-import("C:\\Users\\lenovo\\Desktop\\Kuntien avainluvut.xlsx")
 
# Yhdistetään data ja kartta
shm<-merge(sh.wgs84, dat, by.x="nimi", by.y="Kunta")

Tämän jälkeen voidaan tuottaa esimerkiksi staattisia karttoja tmap-paketilla. Funktiolla qtm voidaan helposti piirtää valmis kartta. Jos kartan piirteitä on tarpeen määritellä tarkemmin, kannattaa kartta koota osista esimerkiksi tmap-paketin muilla funktioilla. Seuraavassa on esimerkki samasta kartasta kahdella mainitulla tavalla toteutettuna. Jälkimmäisessä esimerkissä mm. selitteen paikkaa on siirretty, ettei sen peitä varsinaista karttaa.

# Vaihtoehto 1
qtm(shm, fill="Sosiaali- ja terveystoiminta yhteensä, nettokäyttökustannukset, euroa/asukas", borders=NULL, fill.palette=brewer.pal(9, "Reds"))
 
# Vaihtoehto 2
tm_shape(shm) +
tm_fill("Sosiaali- ja terveystoiminta yhteensä, nettokäyttökustannukset, euroa/asukas", title = "", style = "fixed",
        breaks = c(0, 1000, 2000, 3000, 4000, 5000, 6000, Inf),
        palette = brewer.pal(9, "Reds")) +
#tm_borders() +
tm_layout("Sosiaali- ja terveystoiminnan nettokäyttökustannukset, 2015",
          legend.title.size = 2,
          legend.text.size = 0.6,
          legend.position = c(0.01, 0.50),  #c("left","bottom"),
          legend.bg.color = "white",
          legend.bg.alpha = 1)

Muodostuvat kartat näyttävät seuraavilta:

kartta1

kartta2

R:n leafletR-paketilla on mahdollista tuottaa interaktiivisia karttoja. Seuraavassa Suomen kuntakartta esitetään jonkin online-palveluntarjoajan karttapohjan päällä. Valitettavasti leafletR on hieman ronkeli ääkkösten suhteen. Pikaratkaisuna korvasin ne muilla merkeillä, koska en (taaskaan) saanut merkistökoodausongelmaa tyydyttävästi ratkaistua.

# Interaktiivinen kartta
shm@data$nimi2<-gsub("å", "a", gsub("Å", "a", gsub("ö", "o", gsub("ä", "a", gsub("Ö", "ö", gsub("Ä", "A", shm@data$nimi))))))
shm@data$nimi<-shm@data$nimi2
shm@data$namn<-shm@data$nimi2
shm@data$name<-shm@data$nimi2
writeOGR(shm, "shm_geojson", layer='shm', driver="GeoJSON")
popup <- c("nimi", "euroa")
shm@data$euroa<-shm@data$"Sosiaali- ja terveystoiminta yhteensä, nettokäyttökustannukset, euroa/asukas"
 
cuts <- c(1000, 2000, 3000, 4000, 5000, 6000)
sty <- styleGrad(prop="euroa",
 breaks = cuts,
 right=FALSE,
 style.par="col",
 style.val=brewer.pal(5, "Reds"),
 leg="Euroa per asukas", lwd=1, fill.alpha=0.8)
 
map <- leaflet(data = 'shm_geojson',
 dest = ".",
 style=sty,
 title = "interactive_choropleth",
 base.map = "darkmatter",
 incl.data = TRUE, 
 popup = popup)

Lopputuloksena muodostuu html-sivu, joka sisältää kartan ja sen piirtämiseen tai värittämiseen tarvittavan kartan. Alla on lopullinen interaktiivinen kartta upotettuna verkkosivulle. Tarvittaessa värien läpinäkyvyyttä voi säätää muuttamalla yllä olevan skriptin argumentin fill.alpha arvoa.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *