使用格子包绘制光栅或 RGB 数据立方体

Raster or RGB data cube plotting with lattice package

假设我要绘制这个非常简单的 2x2 RGB 数据立方体:

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

我可以通过光栅化数据立方体来绘制它:

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

但我想用 lattice 包绘制这个数据立方体(为了统一起见,因为我也主要将它用于其他绘图)。

这可能吗?我正在查看 levelplot,但无法实现。

你的问题是lattice需要矩阵,也就是数值矩阵,RGB的栅格变成因子矩阵:

r <-as.raster(dc)
r

给出这个结果:

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

要将其用作格子,您需要将其转换为数字矩阵,这看起来很长,但似乎是确保保持顺序的唯一方法:

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

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

你会在这里遇到的问题是你不会保持相同的 RGB 颜色,但它是一个格子解决方案。

好的,levelplot.

证明这是一项相当大的努力

我将 RGB 十六进制颜色值从光栅转换为整数,然后使用这些值将它们映射到光栅的调色板。

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 = '')

图例也可以用colorkey = FALSE 属性删除。

我想知道是否有更简单的方法可以做到这一点。