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ä.

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.