简体   繁体   中英

Raster or RGB data cube plotting with lattice package

Suppose I have this very simple 2x2 RGB datacube that I want to plot:

set.seed(2017)
dc <- array(runif(12), dim = c(2,2,3))

I can plot this just by rasterizing the datacube:

plot(as.raster(dc), interpolate = FALSE)

在此处输入图片说明

But I would like to plot this data cube with the lattice package (for uniformity sake since I am mainly using it for other plotting too).

Is this possible? I am looking at levelplot , but am not able to make it work.

The problem you have is that lattice needs a matrix, that is a numeric matrix, and rasters of RGB become a factor matrix:

r <-as.raster(dc)
r

gives this result:

     [,1]      [,2]     
[1,] "#ECC478" "#780AAC"
[2,] "#89C546" "#4A6F01"

to use it as lattice you need to transform this into a numeric matrix, this looks long but it seems is the only way to ensure to keep the order:

m <- matrix(as.numeric(as.factor(as.vector(as.matrix(r)))), ncol= 2)

levelplot(m, panel = panel.levelplot.raster)

在此处输入图片说明

The problem you will get here is that you won't keep the same RGB colors, but it's a lattice solution.

Ok, this turned out to be quite an endeavor with levelplot .

I convert the RGB hex color values from raster to integers, and then use these values to map them to the color palette of the raster.

set.seed(2017)
dc <- array(runif(12), dim = c(2,2,3))
plot(as.raster(dc), interpolate = FALSE)

# convert color hexadecimals to integers
rgbInt <- apply(as.raster(dc), MARGIN = c(1,2), 
             FUN = function(str){strtoi(substring(str, 2), base = 16)})

rgbIntUnq <- unique(as.vector(rgbInt))

lattice::levelplot(x = t(rgbInt), # turn so rows become columns
                   at = c(0,rgbIntUnq),
                   col.regions = sprintf("#%06X", rgbIntUnq[order(rgbIntUnq)]), # to hex
                   ylim = c(nrow(rgbInt) + 0.5, 1 - 0.5), # plot from top to bottom
                   xlab = '', ylab = '')

在此处输入图片说明

The legend can also be removed with colorkey = FALSE property.

I wonder whether there are simpler ways to do the same.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM