使用格子包绘制光栅或 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
属性删除。
我想知道是否有更简单的方法可以做到这一点。
假设我要绘制这个非常简单的 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
属性删除。
我想知道是否有更简单的方法可以做到这一点。