我有一个来自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,而country
和spatiallines
是SpatialLines *对象
我遇到过添加比例尺的各种功能,例如: layout.scale.bar()
,maps::map.scale()
和scalebar()
,但我无法确定如何将它们合并到我正在使用的spplot
代码中。我已经尝试将它们添加为spplot
中的参数或sp.layout=list()
参数中的列表,但都不起作用。
谢谢!
答案 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))