Возможно, вам лучше всего использовать одну из lattice
функций для построения пространственных растровых объектов, предоставляемых пакетами raster
и rasterVis
. Вы обнаружили один из них в vectorplot()
, но spplot()
или levelplot()
лучше соответствуют вашим потребностям в этом случае.
(Метод plot()
на основе base graphics
для "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"))
![enter image description here](https://i.stack.imgur.com/XLhEY.png)
Любой из этих методов может по-прежнему отображать некоторую часть символа, представляющего точки, которые выпадают непосредственно за пределы растрового графика. Если вы хотите избежать этой возможности , вы можете просто поднастроить свой объект 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")