[R-sig-Geo] raster (graphics) support in R 2.11.0
Michael Sumner
mdsumner at gmail.com
Tue Mar 9 03:19:58 CET 2010
My apologies, I left out the data set up for Rlogo. Here is the full session:
raster.SGDF <- function (x, attr = 1, xcol = 1, ycol = 2, col = heat.colors(12),
red = NULL, green = NULL, blue = NULL, axes = FALSE, xlim = NULL,
ylim = NULL, add = FALSE, ..., asp = NA, setParUsrBB = FALSE,
interpolate = FALSE, angle = 0)
{
## function to scale values to [0, 1]
scl <- function(x) (x - min(x, na.rm = TRUE))/diff(range(x, na.rm = TRUE))
## bounding box of the image
bb <- bbox(x)
## set up the background plot if it's not already
if (!add)
plot(as(x, "Spatial"), xlim = xlim, ylim = ylim, axes = axes,
asp = asp, ..., setParUsrBB = setParUsrBB)
## 1-band case
if (is.null(red)) {
x <- x[attr]
NAs <- is.na(x[[1]])
nvalues <- length(unique(x[[1]][!NAs]))
m <- scl(t(matrix(x[[1]], x at grid@cells.dim[1], x at grid@cells.dim[2])))
m <- matrix(col[as.vector(m) * (length(col)-1) + 1], nrow(m), ncol(m))
## if missing, set to white
m[is.na(m)] <- rgb(1, 1, 1)
} else {
## 3-band RGB case
if (is.null(green) || is.null(blue))
stop("all colour bands must be given")
## band data and missing values
xd <- x at data[, c(red, green, blue)]
NAs <- is.na(xd[, 1]) | is.na(xd[, 2]) | is.na(xd[, 3])
if (any(NAs))
xd <- xd[!NAs, ]
## create RGBs (using alpha=1 by default)
RGBs <- rgb(xd, max = 255)
if (any(NAs)) {
z <- rep(NA, length(NAs))
z[!NAs] <- RGBs
RGBs <- z
}
cv <- coordinatevalues(getGridTopology(x))
m <- t(matrix(RGBs, x at grid@cells.dim[1], x at grid@cells.dim[2],
byrow = FALSE))
}
raster(m, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate =
interpolate, angle = angle)
}
library(sp) ## R 2.11.0
data(Rlogo)
d = dim(Rlogo)
cellsize = abs(c(gt[2],gt[6]))
cells.dim = c(d[1], d[2]) # c(d[2],d[1])
cellcentre.offset = c(x = gt[1] + 0.5 * cellsize[1], y = gt[4] -
(d[2] - 0.5) * abs(cellsize[2]))
grid = GridTopology(cellcentre.offset, cellsize, cells.dim)
df = as.vector(Rlogo[,,1])
for (band in 2:d[3]) df = cbind(df, as.vector(Rlogo[,,band]))
df = as.data.frame(df)
names(df) = paste("band", 1:d[3], sep="")
Rlogo <- SpatialGridDataFrame(grid = grid, data = df)
op <- par(mfrow = c(3, 1))
raster.SGDF(Rlogo, red = "band1", green = "band1", blue = "band3",
interpolate = FALSE)
raster.SGDF(Rlogo, col = grey(seq(0, 1, length = 10)), angle = 28)
raster.SGDF(Rlogo, col = grey(seq(0, 1, length = 10)), interpolate = TRUE)
par(op)
sessionInfo()
R version 2.11.0 Under development (unstable) (2010-03-07 r51225)
x86_64-pc-mingw64
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] sp_0.9-60
loaded via a namespace (and not attached):
[1] grid_2.11.0 lattice_0.18-3 tools_2.11.0
On Tue, Mar 9, 2010 at 1:13 PM, Michael Sumner <mdsumner at gmail.com> wrote:
> Hello, I've been experimenting with the new raster graphics support in
> 2.11.0 (unstable) It's nice as it can provide graphical
> interpolation, and arbitrary rotation (angle is not obviously useful
> in this context, but I've included it for experimenting).
>
> This is a version of sp:::image.SpatialGridDataFrame that sets up the
> data for the raster graphics function. I'm not sure how to handle
> missing values, here they are just set to white. Probably it's best to
> live with the warnings from raster, but it might be possible to
> determine if the device can deal with it. "Per-pixel transparency" is
> not supported on the windows() or png() device (on Windows) but it
> seems to work for pdf().
>
> The raster() function is very raw so it takes a bit of setting up to
> use. It expects an existing plot that is added to, and it can take a
> matrix of (hex) colours or a matrix or 3D array of values between 0
> and 1.
>
> Best regards,
> Mike
>
> raster.SGDF <- function (x, attr = 1, xcol = 1, ycol = 2, col = heat.colors(12),
> red = NULL, green = NULL, blue = NULL, axes = FALSE, xlim = NULL,
> ylim = NULL, add = FALSE, ..., asp = NA, setParUsrBB = FALSE,
> interpolate = FALSE, angle = 0)
> {
> ## function to scale values to [0, 1]
> scl <- function(x) (x - min(x, na.rm = TRUE))/diff(range(x, na.rm = TRUE))
> ## bounding box of the image
> bb <- bbox(x)
>
> ## set up the background plot if it's not already
> if (!add)
> plot(as(x, "Spatial"), xlim = xlim, ylim = ylim, axes = axes,
> asp = asp, ..., setParUsrBB = setParUsrBB)
>
> ## 1-band case
> if (is.null(red)) {
> x <- x[attr]
> NAs <- is.na(x[[1]])
> nvalues <- length(unique(x[[1]][!NAs]))
>
> m <- scl(t(matrix(x[[1]], x at grid@cells.dim[1], x at grid@cells.dim[2])))
> m <- matrix(col[as.vector(m) * (length(col)-1) + 1], nrow(m), ncol(m))
> ## if missing, set to white
> m[is.na(m)] <- rgb(1, 1, 1)
>
>
> } else {
> ## 3-band RGB case
>
> if (is.null(green) || is.null(blue))
> stop("all colour bands must be given")
> ## band data and missing values
> xd <- x at data[, c(red, green, blue)]
> NAs <- is.na(xd[, 1]) | is.na(xd[, 2]) | is.na(xd[, 3])
> if (any(NAs))
> xd <- xd[!NAs, ]
> ## create RGBs (using alpha=1 by default)
> RGBs <- rgb(xd, max = 255)
> if (any(NAs)) {
> z <- rep(NA, length(NAs))
> z[!NAs] <- RGBs
> RGBs <- z
> }
>
> cv <- coordinatevalues(getGridTopology(x))
> m <- t(matrix(RGBs, x at grid@cells.dim[1], x at grid@cells.dim[2],
> byrow = FALSE))
> }
> raster(m, bb[1,1], bb[2,1], bb[1,2], bb[2,2], interpolate =
> interpolate, angle = angle)
> }
> op <- par(mfrow = c(3, 1))
> raster.SGDF(Rlogo, red = "band1", green = "band1", blue = "band3",
> interpolate = FALSE)
>
> raster.SGDF(Rlogo, col = grey(seq(0, 1, length = 10)), angle = 28)
> raster.SGDF(Rlogo, col = grey(seq(0, 1, length = 10)), interpolate = TRUE)
> par(op)
>
> sessionInfo()
> R version 2.11.0 Under development (unstable) (2010-03-07 r51225)
> x86_64-pc-mingw64
>
> locale:
> [1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
> [3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
> [5] LC_TIME=English_Australia.1252
>
> attached base packages:
> [1] stats graphics grDevices utils datasets methods base
>
> other attached packages:
> [1] sp_0.9-60
>
> loaded via a namespace (and not attached):
> [1] grid_2.11.0 lattice_0.18-3 tools_2.11.0
>
More information about the R-sig-Geo
mailing list