我有兴趣将矩阵转换为图像(元素值=像素强度),有点像: R - image of a pixel matrix?
但是我需要图像的大小与矩阵的大小完全相同(以像素为单位)。因此,如果矩阵是234x14,那么应该是生成的图像。
不使用额外的R包的解决方案的偏好(如上面的问题回答),但一切都会很好。
答案 0 :(得分:3)
一种方法是完全避免R设备,并依赖rgdal
中的GDAL驱动程序。
m <- matrix(rep(1:234, each = 14), ncol = 14, byrow = TRUE)
l <- list(x = 1:nrow(m), y = 1:ncol(m), z = m)
library(rgdal)
x <- image2Grid(l)
writeGDAL(x, "out.tif")
GDAL中还有其他驱动程序,但“GeoTIFF”是默认值,默认值将准确保留值(在R和GDAL的数字范围内)。这只是一个单一的光栅栅格,但它对多个属性的作用相同。
此处的实际限制是您对文件的目标,以及它是否可以按您想要的方式读取生成的图像。 GDAL具有您需要的所有选项,但默认值是否正确以及您真正需要的是否取决于细节。
y <- readGDAL("out.tif")
all.equal(as.image.SpatialGridDataFrame(y)$z, m)
[1] TRUE
这是一个浮点示例,更真实地显示数字限制:
set.seed(1)
m <- matrix(runif(234 * 14), ncol = 14)
l <- list(x = 1:nrow(m), y = 1:ncol(m), z = m)
library(rgdal)
x <- image2Grid(l)
writeGDAL(x, "out.tif")
y <- readGDAL("out.tif")
all.equal(as.image.SpatialGridDataFrame(y)$z, m)
[1] "Mean relative difference: 1.984398e-08"
另一种方式是pixmap
使用的pnm格式。见
library(pixmap)
?write.pnm
答案 1 :(得分:2)
这是一个额外的包,但您可以尝试pixmap:http://cran.r-project.org/web/packages/pixmap/index.html
如果您想要动画图像,可以使用caTools
从矩阵中编写GIF动画。
答案 2 :(得分:1)
这是解决问题的另一种方法。示例中包括使用轴信息添加边距的方法,如何标准化和放置要绘制的数据+使用特定级别(零)的颜色(蓝色)。替换您想要使用的特定数据并将{lm,bm,tm,rm}更改为不同的值以调整四个边距(所有度量单位为像素):
maxv <- 500
v <- t(<matrix>)
d <- <vector>
di <- <vector>
dm <- <vector>
nr <- nrow(v)
nc <- ncol(v)
library(grid)
vnorm <- v
for (r in 1:nr) {
for (c in 1:nc) {
vnorm[r,c] <- min(1, v[r, nc-c+1]/500)
if (vnorm[r,c] == 0) {vnorm[r,c] <- "blue"}
else {vnorm[r,c] <- grey(vnorm[r,c])}
}
}
vnorm <- t(vnorm)
x <- seq(1, nr)
y <- rep(1, nr)
xrange <- range(d)
yrange <- c(0, 24)
bm <- 90
lm <- 40
tm <- 12
rm <- 12
png(file="graph.png", width=nr+lm+rm, height=nc+tm+bm)
par(mai=c(bm/72, lm/72, tm/72, rm/72))
plot(d, y, ann=FALSE, xlim=xrange, ylim=yrange, axes=FALSE, xaxs="i", yaxs="i")
axis(1, at=dm,labels=dm, col.axis="black", las=2)
axis(2, at=seq(0,24),labels=seq(0,24), col.axis="black", las=2)
rasterImage(vnorm, xrange[1], yrange[1], xrange[2], yrange[2], interpolate=FALSE)
dev.off()