Bạn có thể muốn cố gắng hết sức để đi với một trong những lattice
chức năng dựa trên cho âm mưu đối tượng raster không gian được cung cấp bởi các raster
và rasterVis
gói . Bạn đã khám phá một trong số họ trong số vectorplot()
, nhưng spplot()
hoặc levelplot()
phù hợp hơn với nhu cầu của bạn trong trường hợp này.
(Phương pháp base graphics
dựa trên plot()
cho "RasterLayer"
đối tượng chỉ không cho phép bất kỳ cách dễ dàng để bạn có thể thiết lập các trục với tỉ lệ thích hợp. Đối với bất cứ ai quan tâm, tôi đi vào chi tiết hơn về việc tại sao đó là như vậy trong một phần ở dưới cùng của bưu điện)
Như một ví dụ về các loại âm mưu mà levelplot()
sản xuất:.
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"))
Một trong những phương pháp này vẫn có thể vẽ một số phần của biểu tượng đại diện cho các điểm rơi ngay bên ngoài raster được vẽ. Nếu bạn muốn tránh rằng khả năng, bạn chỉ có thể đặt một đối tượng SpatialPoints
để loại bỏ bất kỳ điểm nào rơi ra ngoài raster. Dưới đây là một chức năng đơn giản mà sẽ làm điều đó cho bạn:
## A function to test whether points fall within a raster's 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), ]
bổ sung chi tiết cỏ về việc tại sao thật khó để làm plot(r)
sản xuất trục khít phù
Khi plot
được gọi trên một đối tượng của loại raster
, dữ liệu raster (cuối cùng) được vẽ bằng cách sử dụng rasterImage()
hoặc image()
.Đường dẫn nào được theo sau phụ thuộc vào: (a) loại thiết bị được vẽ; và (b) giá trị của đối số useRaster
trong lệnh gọi plot()
gốc.
Trong cả hai trường hợp, khu vực vẽ đồ thị được thiết lập theo cách tạo ra các trục lấp đầy khu vực vẽ, thay vì theo cách cung cấp cho chúng tỷ lệ co thích hợp.
Dưới đây, tôi hiển thị chuỗi chức năng được gọi trên đường đến bước này, cũng như cuộc gọi cuối cùng thiết lập khu vực vẽ đồ thị. Trong cả hai trường hợp, dường như không có cách nào đơn giản để thay đổi cả mức độ và tỉ lệ khung hình của các trục được vẽ.
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")
Tốt câu hỏi. Tôi đã tự hỏi rằng bản thân mình, gần đây, và rất vui vì bạn đã nghĩ đến việc hỏi ở đây. –
Thật thú vị, điều này ám hoàn toàn trên thiết lập R của tôi. Tôi sử dụng R-2.11 64bit trên Win7, và nền màu vàng hoàn toàn lấp đầy khoảng trống raster. – Martin
Tôi là R-2.13.1 Win7, x64. Nó lấp đầy mức raster, nhưng không phải toàn bộ hộp vẽ (các trục lớn hơn mức). – Benjamin