Ответ 1
Вероятно, вам лучше всего пойти с одной из функций lattice
для построения пространственных растровых объектов, предоставляемых пакетами raster
и rasterVis
. Вы обнаружили один из них в vectorplot()
, но spplot()
или levelplot()
лучше соответствуют вашим потребностям в этом случае.
(Метод base graphics
plot()
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 extent
inExtent <- function(SP_obj, r_obj) {
crds <- [email protected]
ext <- extent(r_obj)
crds[,1] >= [email protected] & crds[,1] <= [email protected] &
crds[,2] >= [email protected] & crds[,2] <= [email protected]
}
## 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")