使用晶格封装的栅格或RGB数据立方体绘图

时间:2017-01-13 15:31:53

标签: r plot lattice levelplot

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

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

我可以通过栅格化数据立方体来绘制这个:

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

enter image description here

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

这可能吗?我正在查看levelplot,但无法使其正常工作。

2 个答案:

答案 0 :(得分:1)

你遇到的问题是格子需要一个矩阵,即一个数字矩阵,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)

enter image description here

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

答案 1 :(得分:0)

好的,这对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 = '')

enter image description here

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

我想知道是否有更简单的方法来做同样的事情。