[R-es] Aumentar resolución raster

Oscar Perpiñan oscar.perpinan en upm.es
Dom Feb 23 11:32:53 CET 2014


Hola,

ggplot necesita un data.frame para poder funcionar. Lo estás
construyendo con rasterToPoints. Es mejor que uses sampleRegular
porque no necesitas pintar todas las celdas del Raster. Por otra
parte, la interpolación gráfica que necesitas con datos de baja
resolución se consigue gracias a la función rasterGrob del paquete
grid, en el que ggplot2 está basado. La función geom_raster tienen la
opción interpolate=TRUE, y teóricamente la pasa a rasterGrob para que
haga el interpolado. Sin embargo, no funciona, pero existe un atajo:
https://github.com/hadley/ggplot2/issues/794.

Todo esto, aplicado a los datos de baja resolución y dicho en código,
va a continuación.

Saludos.

Oscar.

PD. Te puede ser útil la función gplot del paquete rasterVis. Es un
wrapper muy sencillo para que ggplot funcione "directamente" con un
objeto Raster*.
PD2. Si estás dispuesto a probar herramientas basadas en lattice en
lugar de ggplot2, te aconsejo que pruebes la función spplot del
paquete raster, y levelplot del paquete rasterVis. Precisamente he
publicado un ejemplo con un DEM de España y "hill shading" construido
con rasterVis::levelplot aquí:
http://oscarperpinan.github.io/spacetime-vis/images/thumbs/hillShading.png
y su código aquí
https://github.com/oscarperpinan/spacetime-vis/blob/master/raster.R#L60

-------------------------------------------------------------

datos <- replicate(10, 10*rnorm(10))
dem <- raster(datos)
e <- extent(c(-10, 10, 35,43))
extent(dem) <- e
## Hay que añadir la proyección para que terrain funcione
projection(dem) <- '+proj=longlat +datum=WGS84'

slope <- terrain(dem, opt='slope')
aspect <- terrain(dem, opt='aspect')
hill <- hillShade(slope, aspect, 40, 270)

## sampleRegular para extraer puntos.
## En este caso concreto no sirve de nada porque sólo hay 100 celdas,
## pero sí es útil para Raster normales con millones de celdas.
s <- stack(dem, hill)
names(s) <- c('dem', 'hill')
slr <- sampleRegular(s, 1e5, asRaster = TRUE)

## Construimos el data.frame completo incorporando coordenadas
coords <- xyFromCell(slr, seq_len(ncell(slr)))
dat <- as.data.frame(getValues(slr))
dat <- cbind(coords, dat)

## Dibujamos...
 ggplot(aes(x, y, fill=dem, alpha=hill), data=dat) +
    ## geom_raster(aes(fill = dem, alpha=hill), interpolate=TRUE) +
    layer(geom="raster", geom_params=list(interpolate=TRUE)) +
    scale_fill_gradientn(name="Altitude",colours = rainbow(20))+
    guides(fill = guide_colorbar()) +
    scale_alpha(range = c(0, 0.5), guide = "none") +
    scale_x_continuous(name=expression(paste("Longitud (",degree,")")),
                       expand=c(0,0)) +
    scale_y_continuous(name=expression(paste("Latitud (",degree,")")),
                       expand=c(0,0)) +
    coord_equal()



Más información sobre la lista de distribución R-help-es