为了给这只猫剥皮,并进入太多细节,这段代码将 R 图像分解为四边形网格(由 使用rgl
),然后显示光栅图和“平铺”或“矩形”之间的区别“ 阴谋。
library(raster)
im <- raster::raster(volcano)
## this is the image in rgl corner-vertex form
msh <- quadmesh::quadmesh(im)
## manual labour for colour scaling
dif <- diff(range(values(im)))
mn <- min(values(im))
scl <- function(x) (x - mn)/dif
这是传统的 R 'image',它为每个像素绘制一个小块或 'rect()'。
list_image <- list(x = xFromCol(im), y = rev(yFromRow(im)), z = t(as.matrix(im)[nrow(im):1, ]))
image(list_image)
它很慢,虽然它在底层调用了“rect()”的来源,但我们也不能设置边框颜色。使用 'useRaster = TRUE' 来使用 'rasterImage' 以获得更有效的绘图时间,控制插值,并最终控制文件大小。
现在让我们再次绘制图像,但要为每个像素显式调用 rect。('quadmesh' 可能不是最简单的演示方式,它在我的脑海中很新鲜)。
## worker function to plot rect from vertex index
rectfun <- function(x, vb, ...) rect(vb[1, x[1]], vb[2,x[1]], vb[1,x[3]], vb[2,x[3]], ...)
## draw just the borders on the original, traditional image
apply(msh$ib, 2, rectfun, msh$vb, border = "white")
现在用“rect”再试一次。
## redraw the entire image, with rect calls
##(not efficient, but essentially the same as what image does with useRaster = FALSE)
cols <- heat.colors(12)
## just to clear the plot, and maintain the plot space
image(im, col = "black")
for (i in seq(ncol(msh$ib))) {
rectfun(msh$ib[,i], msh$vb, col = cols[scl(im[i]) * (length(cols)-1) + 1], border = "dodgerblue")
}