如何在spplot

时间:2016-08-13 11:42:48

标签: r plot raster sp

我有一个来自RasterStack的八个地图的面板,并希望在情节中添加一个100公里的比例尺。我在sp.layout函数中使用spplot在栅格顶部添加了SpatialLines对象,并假设使用比例尺(或北箭头)可以实现相同,但我无法获得什么都可以工作。

我使用的代码是:

library(sp)
library(raster)
library(grid)

spplot(rasterstack, layout=c(2,4),
       names.attr=c("a", "b", "c", "d", "e", "f", "g", "h"),
       between=list(x=1, y=1),
       at=seq(0,1000,by=100),
       col.regions=colorRampPalette(c("grey90","yellow4","green4"))(100),
       par.strip.text=list(cex=2.5),
       scales=list(draw=F),
       colorkey=list(labels=list(labels=seq(0,1,by=0.25),
                                 at=seq(0,1000,by=250),
                                 width=10, cex=2.5)),
       sp.layout=list(list(country, first=FALSE), # add country borders
                      list(spatiallines, lwd=1.5, col=4)))
# Label vertical colorkey
grid::grid.text('Probability of occurrence', y=unit(0.5,"npc"), x=unit(0.95,"npc"), rot=90, gp=gpar(cex=3, font=2))

其中rasterstack是一个包含8个图层的RasterStack,每个单元格中的值范围为0到1000,而countryspatiallines是SpatialLines *对象

我遇到过添加比例尺的各种功能,例如: layout.scale.bar()maps::map.scale()scalebar(),但我无法确定如何将它们合并到我正在使用的spplot代码中。我已经尝试将它们添加为spplot中的参数或sp.layout=list()参数中的列表,但都不起作用。

谢谢!

1 个答案:

答案 0 :(得分:3)

我建议layout.scale.bar()layout.north.arrow(),因为它们的输出为SpatialPolygons。它们的布局函数名称为"SpatialPolygonsRescale",您必须将其作为列表的第一个参数。

这是我的例子;

library(sp); library(raster); library(grid)

### example data
r <- raster(system.file("external/test.grd", package="raster"))
range(r)   # 178400, 181600, 329400, 334000  (xmin, xmax, ymin, ymax)
r4 <- stack(r, r, r, r)

### preparation of scalebar etc.
North <- list("SpatialPolygonsRescale", layout.north.arrow(type=1), 
              offset = c(178600, 333000), scale = 800, which = 1)

North2 <- list("SpatialPolygonsRescale", layout.north.arrow(type=2), 
              offset = c(178600, 332000), scale = 1200, fill="gray", which = 2)

scale1 <- list("SpatialPolygonsRescale", layout.scale.bar(), 
               offset = c(180500, 329800), scale = 500, fill=c("transparent","black"), which = 3)
s1_text0 <- list("sp.text", c(180500, 329800 + 150), "0", cex = .5, which = 3)
s1_text1 <- list("sp.text", c(180500 + 500, 329800 + 150), "500 m", cex = .5, which = 3)

scale2.1 <- list("SpatialPolygonsRescale", layout.scale.bar(height=0.1), 
                 offset = c(178600, 333000), scale = 1000, fill=c("red", "green"), which = 4)
s2.1_text0 <- list("sp.text", c(178600, 333000 - 150), "0", cex = .5, which = 4)
s2.1_text1 <- list("sp.text", c(178600 + 1000, 333000 - 150), "1 km", cex = .5, which = 4)

scale2.2 <- list("SpatialPolygonsRescale", layout.scale.bar(), 
                 offset = c(178600, 333200), scale = 2000, fill=c("cyan", "violet"), which = 4)
s2.2_text0 <- list("sp.text", c(178600, 333200 + 300), "0", cex = .5, which = 4)
s2.2_text1 <- list("sp.text", c(178600 + 2000, 333200 + 300), "2000 m", cex = .5, which = 4)
  # Of course, you can write 180600 instead of 178600 + 2000

### draw
spplot(r4, layout=c(2,2),
       sp.layout = list(North, North2, scale1, s1_text0, s1_text1, 
                        scale2.1, s2.1_text0, s2.1_text1, scale2.2, s2.2_text0, s2.2_text1))

enter image description here