R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

3D-karttoja R:ssä

R-NOLD -blogissa esiteltiin tapa piirtää 3D-kartta R:ssä. Idea näytti hauskalta, mutta halusin värittää kunkin kartan solun sen merenpinnasta mitatun korkeuseron perusteella samaan tapaan kuin kartoissakin tehdään. Tätä varten piti ensin keksiä miten sopivat värit saadaan generoitua. Onneksi Google auttoi jälleen kerran: R-Help -listan keskustelussa esitettiin tapa generoida värejä funktiolla surf.colors(), joka löytyy koodin lopusta.

Seuraava koodi hakee Suomen korkeustiedot ja läänirajat verkon yli, ja muuntaa ne sopivaan muotoon matriisiksi m, joka voidaan sitten visualisoida persp()-komennolla.

library(maptools)
library(raster)
alt <- getData('alt', country='FIN')
adm <- getData('GADM', country='FIN', level=1)
maralt<-crop(alt,adm)
m<-matrix(getValues(maralt), ncol=1324, nrow=1244, byrow=TRUE)
surf.colors <- function(x, col = terrain.colors(20)) {
  x.avg <- (x[-1, -1] + x[-1, -(ncol(x) - 1)] +
             x[-(nrow(x) -1), -1] + x[-(nrow(x) -1), -(ncol(x) - 1)]) / 4
  colors = col[cut(x.avg, breaks = length(col), include.lowest = T)]
  return(colors)
}
persp(m, exp=0.2, phi=65, xlab="Longitude", ylab="Latitude", zlab="Elevation", col=surf.colors(m, col=terrain.colors(40)), theta=90, border=NA, box=FALSE)

Tuloksena on kuva, jossa Suomen pinnanmuodot on esitetty värikoodattuna.

Samaa surf.colors() + persp() -tekniikkaa voi toki käyttää muiden vastaavanlaisten datojen visualisointiin. Komento surf.colors() antaa col-argumentillään mahdollisuuden vaihtaa käytettyä palettia, joiksi soveltuvat esimerkiksi RColorBrewer-paketin tuottamat tai mikseivät colorRampPalette()-komennon tuottamatkin väriyhdistelmätkin.


Vastaa

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