如何减少地图与边界之间的空间?

时间:2018-10-22 18:50:18

标签: r maps border spatial

我正在尝试使用marmap库绘制美国东北部的测深图。以下代码加载了正确的范围,但是当我绘制地图时,在边框和地图之间,在地图的顶部/底部或左侧/右侧都有空白。导出图时也会发生这种情况。如果拖动绘图查看器的屏幕大小,绘图将进行调整,并且可以删除几乎所有空白区域,但是我将循环运行此脚本,因此以这种方式解决此问题不切实际。由于存在循环,我也无法将任何尺寸硬编码到图中,因为它会随每个新范围而变化。如何设置图的边界以匹配测深范围?

library(marmap)
library(maps)

atl<- getNOAA.bathy(-80.93645,-41.61417,30.2 ,60.905 ,resolution=4)
blues <- colorRampPalette(c("darkblue", "cyan"))
greys <- colorRampPalette(c(grey(0.4),grey(0.99)))

plot(atl, image = TRUE, land = TRUE, n=0,
     bpal = list(c(0, max(atl), greys(100)),
                 c(min(atl), 0, blues(100))))
map(database= "state", col="black", fill=FALSE, add=TRUE)
text(x=state.center$x, y=state.center$y, state.abb, cex=0.5)

enter image description here

2 个答案:

答案 0 :(得分:2)

此行为是由asp的{​​{1}}参数引起的。默认情况下,它固定为plot.bathy(),以确保两个轴上的比例相同(一个经度等于一个纬度)。默认情况下,不受欢迎的结果是,在图形的左侧/右侧或顶部/底部出现白色带,具体取决于测深图和绘图设备的尺寸。

所以我想您有两个选择:

  1. 如果您不介意视角略有失真,可以在对asp = 1的通话中设置asp = NA
  2. 如果要具有正确的纵横比,但需要为绘图区域使用默认大小,则必须下载覆盖整个活动设备绘图区域的测深区域。例如,您可以调用一次plot.bathy()来创建一个“默认”绘图,然后使用plot.bathy()来确定填充整个绘图区域所需的测深极限。然后,您将下载第二个测深仪,其中包含经度和纬度的适当范围。这可能是不可取的。

这是第二个选项的代码:

par("usr")

enter image description here

我认为RomanLuštrik提出的解决方案也是可行的,但它有一个不便之处,那就是在情节的两侧都可以看到白色条带。

顺便说一句,如果您要绘制许多测深区域,则应该考虑使用atl <- getNOAA.bathy(-80.93645, -41.61417, 30.2, 60.905, resolution = 4) blues <- colorRampPalette(c("darkblue", "cyan")) greys <- colorRampPalette(c(grey(0.4), grey(0.99))) plot(atl, image = TRUE, land = TRUE, n = 0, bpal = list(c(0, max(atl), greys(100)), c(min(atl), 0, blues(100)))) coord <- par("usr") atl2 <- getNOAA.bathy(coord[1], coord[2], coord[3], coord[4], res = 4) plot(atl2, image = TRUE, land = TRUE, lwd = 0.2, bpal = list(c(0, max(atl2), greys(100)), c(min(atl2), 0, blues(100)))) map(database = "state", col = "black", fill = FALSE, add = TRUE) text(x = state.center$x, y = state.center$y, state.abb, cex = 0.5) 的{​​{1}}参数,以避免每次需要重新执行时都查询NOAA服务器您的代码(加载本地数据要比远程数据快得多)。而且,您也可以一次下载所有的4Go ETOPO1全局数据,并使用keep = TRUE来子集每个图所需的测深。

答案 1 :(得分:2)

这是使用替代方法的提案。想法是将bathy对象转换为raster对象,然后使用levelplot中的rasterVis绘制图,使绘图区域正确地适合光栅范围。请注意,使用栅格可以定义像素大小,因此可以使用marmap::plot方法似乎没有的正确宽度/高度比。

library(raster)
library(rasterVis)

r <- marmap::as.raster(atl)

state <- map('state', plot = FALSE) 
state <- data.frame(lon = state$x, lat = state$y) 

state.lab <- data.frame(lon = state.center$x, lat = state.center$y, 
                        label = state.abb)

# you can remove the color legend by adding colorkey = FALSE in levelplot() 
levelplot(r, 
          at = c(seq(min(atl), 0, length.out = 100), 
                 seq(0, max(atl), length.out = 100)[-1]),
          col.regions = c(blues(100), greys(100)), 
          margin = FALSE) +
  xyplot(lat ~ lon, state, type = 'l', 
         col = 'black') +
  xyplot(lat ~ lon, data = state.lab,
         panel = function(y, x, ...) {
         ltext(x = x, y = y, labels = state.lab$label, cex = 0.75)
         })

enter image description here