假设我想要绘制这个非常简单的2x2 RGB数据立方体:
set.seed(2017)
dc <- array(runif(12), dim = c(2,2,3))
我可以通过栅格化数据立方体来绘制这个:
plot(as.raster(dc), interpolate = FALSE)
但我想用lattice
包绘制这个数据立方体(为了统一起见,因为我主要用它来进行其他绘图)。
这可能吗?我正在查看levelplot
,但无法使其正常工作。
答案 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)
你会遇到的问题是你不会保持相同的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 = '')
也可以使用colorkey = FALSE
属性删除图例。
我想知道是否有更简单的方法来做同样的事情。