我正在尝试使用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)
答案 0 :(得分:2)
此行为是由asp
的{{1}}参数引起的。默认情况下,它固定为plot.bathy()
,以确保两个轴上的比例相同(一个经度等于一个纬度)。默认情况下,不受欢迎的结果是,在图形的左侧/右侧或顶部/底部出现白色带,具体取决于测深图和绘图设备的尺寸。
所以我想您有两个选择:
asp = 1
的通话中设置asp = NA
plot.bathy()
来创建一个“默认”绘图,然后使用plot.bathy()
来确定填充整个绘图区域所需的测深极限。然后,您将下载第二个测深仪,其中包含经度和纬度的适当范围。这可能是不可取的。这是第二个选项的代码:
par("usr")
我认为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)
})