【问题标题】:R raster avoid white space when plottingR光栅在绘图时避免空白
【发布时间】:2015-07-01 22:56:35
【问题描述】:

我有一张图片,我只想绘制 100*100 的正方形,左下角为 0,0。 当我使用以下命令时。为什么我的裁剪图像周围有一个空白区域? 我怎样才能避免它并确保我得到精确的 100*100 图像?

如果你想重复我的例子,你可以使用第 1 行的任何图像(前提是图像大于 100*100 像素)

r <- raster("C:/Users/nnnn/Desktop/geo.jpg")
vector= getValues(r)
plot(r)
r


par(mar=c(0,0,0,0))
par(oma=c(0,0,0,0))
par(mai=c(0,0,0,0))
par(omi=c(0,0,0,0))
plot(r,xlim=c(0,100),ylim=c(0,100),legend=FALSE,axes=FALSE)

【问题讨论】:

  • 您是否希望图像保持其纵横比(即保持正方形),即使您调整其绘制窗口的大小?或者您是在询问如何将其绘制到另一个非交互式设备(例如pdfpngbmp 等)
  • 我想将它保存为一个正方形(裁剪后的大小)作为 PNG 文件
  • @JoshO'Brien 是否可以提供有关如何更改 mar、mai、oma、omi 选项的建议,以便当我将裁剪的图像保存为 png 时,我不会得到任何白边距?
  • 我认为您的问题是“填充”设备的默认行为不尊重给定纵横比的 xlim/ylim。我不知道一个简单的方法,但明智地使用 par(fig) 可以让你做到这一点。
  • @mdsumner 能否建议我如何使用 par(fig)?

标签: r image plot raster


【解决方案1】:

地图的纵横比通常保持不变。打印到文件时可以使用宽度/高度。您可以手动调整标准设备的大小,但也可以这样做:

library(raster)
r <- raster(nrow=240, ncol=320)
values(r) <- 1:ncell(r)
dev.new(height=0.91*nrow(r)/50, width=1.09*ncol(r)/50)
plot(r, legend=FALSE)

【讨论】:

  • 是否可以修改/建议更改我原来问题中的代码?我想裁剪图像
  • 好吧,我会说它工作得很好。我做了一些小的调整。请注意,高度和宽度以英寸为单位。设备大小与绘制的栅格并不完全成比例,因此需要进行一些经验调整。
  • 要考虑的另一件事是 plot(..., axes=FALSE, box=FALSE) 然后是 axis(1), axis(2) (带有附加参数)
  • 是否可以发布您所做的调整?还有我如何将英寸转换为像素?
  • 还请添加行以从裁剪后的图像创建 PNG 文件
【解决方案2】:

这是我最好的镜头:

library(raster)

## An example raster
logo <- raster(system.file("external/rlogo.grd", package="raster")) 

## Clip out the lower-left 50*100 pixel rectangle as a new raster 'r'
cropWithRowCol <- function(r, rows, cols) {
    cc <- cellFromRowColCombine(r, rownr=rows, colnr=cols)
    crop(r, rasterFromCells(r, cc, values=FALSE))
}
r <- cropWithRowCol(logo, nrow(logo) - 49:0, 1:100)


## Extract multipliers used to appropriately size the selected device
w <- ncol(r)/max(dim(r))
h <- nrow(r)/max(dim(r))

## Set up appropriately sized device with no borders and required coordinate system    
## png("eg.png", width=480*w, height=480*h)
dev.new(width=5*w, height=5*h)
plot.new()
par(mar=c(0,0,0,0), oma=c(0,0,0,0))
plot.window(xlim=extent(r)[1:2], ylim=extent(r)[3:4], xaxs="i",yaxs="i")

## Finally, plot the (sub-)raster to it
plot(r, axes=FALSE, legend=FALSE, add=TRUE)
## dev.off()

(请记住,在交互式可调整大小的设备中,更改设备的大小会弄乱绘制地图的纵横比。)

【讨论】:

  • 是否可以建议我应该在原始问题中对我的代码进行更改?
  • 在我的情况下如何选择乘数 w 和 h?
  • 使用我提供的代码选择它们,即w &lt;- ncol(r)/max(dim(r)) 等在您自己的光栅r 上。还是我误解了你的问题?
  • 我有点困惑。为什么我们需要 w 和 h?似乎它们来自原始图像/照片。但我想剪下那张照片的一部分并打印出来。假设我的照片 A 是 2000*450 像素,照片 B 是 230*211 像素。在这两种情况下,我都想要大小为 100*100 的左下角正方形。那么为什么我需要w和h呢?即使我想要的输出(100*100 正方形)在两种情况下都是相同的,两张照片也会有所不同
  • 有什么可以推荐的解决方案吗?
【解决方案3】:

改变纵横比:

plot(r, asp=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2012-01-16
    • 2019-02-10
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多