图像光栅 R 包 - 无背景、边框和图例的光栅打印

11

我正在使用以下行中显示的栅格函数。 我的最后一行会产生一些输出。 输出中有一行说dimensions : 240, 320, 76800 (nrow, ncol, ncell)。 我想重新打印该图像,但只想显示前200行和前300列。 我该怎么做?以下是倒数第二行绘制整个图像。

f <- "pictures/image1-1421787394.jpeg"
f
r <- raster(f)
plot(r);
r

=============================更新1

我使用了png(filename ='〜/ x.png'); par(mar = rep(0,4),xpd = TRUE,oma = rep(0,4),bty ='n'); plot(r,xlim = c(0,200),ylim = c(0,200),legend = FALSE,axes = FALSE); dev.off()来保存裁剪后的图像。我成功地去掉了图例、轴和黑色框。但问题是保存的图像包含比裁剪部分更多的内容——例如图像周围的白色部分。我想只保存原始图像的裁剪部分(保持图像大小为200*200像素)。请告诉我如何实现?

此外,我如何在原始图像上添加一个对应于上面裁剪部分的红色正方形?我的意思是我想在原始图像的顶部获得一个红色正方形(仅限边缘),然后将其保存为新图像(原始图像+正方形)。

我应该怎么做呢?

update2++++++++++++++++++++++++++++++++++++++++++++++++

添加可重复的示例以展示白色背景的含义

以下最后一行绘制了裁剪后的图像。由于我的xlim和ylim均为100,因此我希望该图像为100*100。但是我看到了如下示例中的白色背景。 (您无法看到背景。但是如果您在计算机上运行代码并打开图像,则会看到它)

library(raster)
r <- raster(nrow=240, ncol=320)
values(r) <- 1:ncell(r)
plot(r)
plot(r,xlim=c(0,100),ylim=c(0,100),legend=FALSE,axes=FALSE,frame.plot=F)

输入图片描述

2个回答

5
你可以通过设置 xlimylim 来实现:
plot(r,xlim=c(0,299),ylim=c(0,199))

[更新] 为了去掉白色背景,您可以尝试使用useRaster=F参数:

plot(r,xlim=c(0,100),ylim=c(0,100),legend=FALSE,axes=FALSE,frame.plot=F,useRaster=F)

有没有办法保存新的图像(剪裁后的)? - user2543622
当然可以 - 执行 png(filename = '~/x.png'); plot(r,xlim=c(0,200),ylim=c(0,200)); dev.off() 命令即可。您也可以使用其他命令,如 pdf()jpeg() 以生成不同格式的图像。 - Marat Talipov
还有一个问题:我计划使用getValues()函数获取值。 getValues(r)运行良好。但是我只想获取裁剪图像的值。我如何在xlim和ylim参数与getValues函数结合使用? - user2543622
我可以始终保存裁剪后的图像,然后在其上应用getValues函数。但我觉得一定有更简单的方法。 - user2543622
有一个getValuesBlock。而且你不必“保存”裁剪后的图像,因为你可以使用getValues(crop(x, e))。 - Robert Hijmans

4
如果我理解您的问题正确,您有一个维度为 c(240, 320, 1) 的 RasterLayer r,并且您想将其裁剪到前200行和300列,然后在没有空白空间的情况下绘制它。
请始终提供示例数据。在这种情况下,这很容易做到。
library(raster)
r <- raster(nrow=240, ncol=320)
values(r) <- 1:ncell(r)

有不同的方法可以按行/列裁剪。例如,您可以创建一个范围对象并使用它。

e <- extent(r, 1, 200, 1, 300)
rc <- crop(r, e)

对于较小的栅格,另一种方法是使用索引和drop=FALSE。

rc <- r[1:200, 1:300, drop=FALSE]

要制作地图,您可以使用“plot”或“image”。也许“image”更适合您(白色空间较少,但没有图例)。
image(rc)  

使用plot函数,您可以在绘图之前设置设备的大小。
dev.new(height=nrow(r), width=ncol(r))
plot(rc, legend=FALSE)

您也可以将绘图输出到文件,例如png格式,以避免空白;具体取决于您设置的“par”参数,如mai等。
png('test.png', width=450, height=275)
plot(rc)
dev.off()

其他处理这个问题的方法包括使用rasterVis包中的spplot或levelplot函数。

spplot(rc)
library(rasterVis)
levelplot(rc)

为了在原始图像上获得红色矩形。
plot(r)
plot(e, add=TRUE, col='red', lwd=2)

当我使用png命令时,应该设置哪些参数以避免任何背景?在您的示例中,裁剪后的图像将成为200*300(根据extent命令),那么在png命令中,为什么要设置宽度=450,高度=275? - user2543622
当我绘制原始图像时,左下角为0,0。但是当我进行扩展绘制时,为什么它会出现在图像顶部的水平条中?它不应该是位于图像最左侧的垂直条吗? - user2543622
我不知道你所说的“避免任何背景”的意思。我改变宽度/高度以适应图例。我不知道你所说的水平和垂直条(我没有看到任何一个)。 - Robert Hijmans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接