gpt4 book ai didi

r - 光栅*对象图中最小范围的轴,无填充

转载 作者:行者123 更新时间:2023-12-03 12:55:27 26 4
gpt4 key购买 nike

有没有办法确保绘图周围的框与栅格范围完全匹配?在下面的内容中,根据设备的比例,在栅格的上方,下方或左侧和右侧都有一个间隙:

require(raster)
r = raster()
r[]= 1
plot(r, xlim=c(xmin(r), xmax(r)), ylim=c(ymin(r), ymax(r)))

栅格对象问题的一个要素是 asp=1以确保正确显示。当 asp=1时,以下基本散点图具有相同的问题:
plot(c(1:10), c(1:10), asp=1)

尝试从rasterVis包中获取 vectorplot(r),以查看我希望轴的外观。

编辑:

解决方案需要与SpatialPoints叠加层配合使用,不能显示超出指定栅格限制的点:
require(raster)
require(maptools)

# Raster
r = raster()
r[]= 1

# Spatial points
x = c(-100, 0, 100)
y = c(100, 0, 100)
points = SpatialPoints(data.frame(x,y))

plot(r, xlim=c(xmin(r), xmax(r)), ylim=c(ymin(r), ymax(r)))
plot(points, add=T)

最佳答案

您可能最好使用基于lattice的功能之一,以绘制由rasterrasterVis包提供的空间栅格对象。您在vectorplot()中发现了其中一个,但是在这种情况下spplot()levelplot()更好地满足了您的需求。

(针对base graphics对象的基于plot()"RasterLayer"方法不允许您采用任何简单的方法来设置具有适当宽高比的轴。对于感兴趣的任何人,我都会在下面的一节中详细介绍为什么这样做发布)。

作为levelplot()产生的图的示例:

require(raster)
require(rasterVis)

## Create a raster and a SpatialPoints object.
r <- raster()
r[] <- 1:ncell(r)
SP <- spsample(Spatial(bbox=bbox(r)), 10, type="random")

## Then plot them
levelplot(r, col.regions = rev(terrain.colors(255)), cuts=254, margin=FALSE) +
layer(sp.points(SP, col = "red"))

## Or use this, which produces the same plot.
# spplot(r, scales = list(draw=TRUE),
# col.regions = rev(terrain.colors(255)), cuts=254) +
# layer(sp.points(SP, col = "red"))

这两种方法中的任何一种都可能仍会绘制符号的某些部分,这些部分代表的点恰好位于绘制的栅格之外。如果要避免这种可能性,可以仅对 SpatialPoints对象进行子集处理,以删除掉栅格之外的所有点。这是一个简单的函数,可以为您完成此操作:
## A function to test whether points fall within a raster's extent
inExtent <- function(SP_obj, r_obj) {
crds <- SP_obj@coord
ext <- extent(r_obj)
crds[,1] >= ext@xmin & crds[,1] <= ext@xmax &
crds[,2] >= ext@ymin & crds[,2] <= ext@ymax
}
## Remove any points in SP that don't fall within the extent of the raster 'r'
SP <- SP[inExtent(SP, r), ]

关于为什么很难使plot(r)产生紧密拟合的轴的其他杂项细节

plot类型的对象上调用 raster时,将(最终)使用 rasterImage()image()绘制栅格数据。遵循哪个路径取决于:(a)被绘制到的设备的类型; (b)原始 useRaster调用中 plot()参数的值。

在这两种情况下,都将以产生填满绘图区域的轴的方式来设置绘图区域,而不是以给它们适当的纵横比的方式来设置。

在下面,我展示了在执行此步骤的过程中调用的函数链,以及最终设置绘图区域的调用。在这两种情况下,似乎都没有简单的方法来更改绘制轴的范围和纵横比。
  • useRaster=TRUE
    ## Chain of functions dispatched by `plot(r, useRaster=TRUE)`
    getMethod("plot", c("RasterLayer", "missing"))
    raster:::.plotraster2
    raster:::.rasterImagePlot

    ## Call within .rasterImagePlot() that sets up the plotting region
    plot(NA, NA, xlim = e[1:2], ylim = e[3:4], type = "n",
    , xaxs = "i", yaxs = "i", asp = asp, ...)

    ## Example showing why the above call produces the 'wrong' y-axis limits
    plot(c(-180,180), c(-90,90),
    xlim = c(-180,180), ylim = c(-90,90), pch = 16,
    asp = 1,
    main = "plot(r, useRaster=TRUE) -> \nincorrect y-axis limits")
  • useRaster=FALSE
    ## Chain of functions dispatched by `plot(r, useRaster=FALSE)`
    getMethod("plot", c("RasterLayer", "missing"))
    raster:::.plotraster2
    raster:::.imageplot
    image.default

    ## Call within image.default() that sets up the plotting region
    plot(NA, NA, xlim = xlim, ylim = ylim, type = "n", xaxs = xaxs,
    yaxs = yaxs, xlab = xlab, ylab = ylab, ...)

    ## Example showing that the above call produces the wrong aspect ratio
    plot(c(-180,180), c(-90,90),
    xlim = c(-180,180), ylim = c(-90,90), pch = 16,
    main = "plot(r,useRaster=FALSE) -> \nincorrect aspect ratio")
  • 关于r - 光栅*对象图中最小范围的轴,无填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334756/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com