使用marmap包和getNOAA.bathy将测深线添加到ggplot

时间:2014-11-30 14:26:08

标签: r map ggplot2

我想在我正在看的地图上添加测深线。我正在海岸附近绘制点,我们感兴趣的是它们离大陆架有多近。我见过一个名为Marmap的软件包 - 但现在我正在使用ggplot,因为它提供了更高的分辨率。

我获得的获得测深线的代码是:

library(marmap)

Peru.bath <- getNOAA.bathy (lon1 = -90, lon2 = -70, lat1 = -20, 
                            lat2 = -2, resolution = 10) 

plot(Peru.bath)

我想要添加水深测量线的代码如下:

coast_map <- fortify(map("worldHires", fill=TRUE, plot=FALSE))
gg <- ggplot()
gg <- gg + geom_map(data=coast_map, map=coast_map,
                    aes(x=long, y=lat, map_id=region),
                    fill="white", color="black") +
  theme(panel.background = element_blank()) + 
  theme(panel.grid.major = element_blank()) + 
  theme(panel.grid.minor = element_blank()) +
  theme(axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank())
gg <- gg + xlab("") + ylab("")
gg <- gg + geom_map(data=data.frame(region="Peru"), map=coast_map,
                    aes(map_id=region), fill="gray") 
gg <- gg + xlim(-90,-70) + ylim(-20,-2)
gg <- gg + coord_map()
gg

因此我认为它会是

gg <- gg + Peru.bath

但是我得到了错误:不知道如何将Peru.bath添加到情节&#39;

NB只是为了说清楚,我没有测深数据,我只想将已知的货架线绘制到我创建的地图上,如果可能的话。

3 个答案:

答案 0 :(得分:8)

我刚刚在github上更新了marmap的开发版本。您可以使用以下命令安装它:

library(devtools)
install_github("ericpante/marmap")

现在包含用于使用ggplot2绘制水质对象的函数autoplot.bathy()。一定要查看它的帮助文件和示例,看看有什么可能。以下是数据集dat的示例:

library(marmap) ; library(ggplot2)
dat <- getNOAA.bathy(-90,-70,-20,-2,res=4, keep=TRUE)

# Plot bathy object using custom ggplot2 functions
autoplot(dat, geom=c("r", "c"), colour="white", size=0.1) + scale_fill_etopo()

enter image description here

答案 1 :(得分:2)

今天早上运行时间有点短,但这应该可以帮助你开始(而且,毫无疑问可以被其他R geo人员改进:

library(maps)
library(mapdata)
library(ggplot2)
library(marmap)
library(Grid2Polygons)

coast_map <- fortify(map("worldHires", fill = TRUE, plot = FALSE))

Peru.bath <- getNOAA.bathy (lon1 = -90, lon2 = -70, lat1 = -20,
                            lat2 = -2, resolution = 10)

peru_bathy_df <- Grid2Polygons(as.SpatialGridDataFrame(Peru.bath), 
                               level=TRUE, pretty=TRUE)
peru_bathy_map <- fortify(peru_bathy_df)

gg <- ggplot()
gg <- gg + geom_map(data=peru_bathy_map, map=peru_bathy_map,
                    aes(map_id=id), color="black", fill="white")
gg <- gg + geom_map(data=coast_map, map=coast_map,
                    aes(x=long, y=lat, map_id=region),
                    fill="white", color="black")
gg <- gg + geom_map(data=data.frame(region="Peru"), map=coast_map,
                    aes(map_id=region), fill="steelblue")
gg <- gg + xlim(-90,-70) + ylim(-20,-2)
gg <- gg + coord_map()
gg <- gg + theme_bw()
gg

enter image description here

显然你想要一个比这更好的图片,但基本的想法是将它转换成ggplot可以处理的对象(所以,一个SpatialPolygonsDataFrame)。在bathy和Grid2Polygons中有很多很好的非ggplot例子。

注意:这些需要一些时间来转换/渲染,并且这些实例确实显示了一种方法,可以在没有ggplot的情况下更快地

答案 2 :(得分:2)

如果你想(i)在你的地图上添加等深线,(ii)使用get.depth()确定数据点的深度,那么坚持标准图会更容易(marmap是旨在与这些一起工作)。事实上,&#34;更好的分辨率&#34;你提到的与基本图形和ggplot2无关。在您的示例中,您正在绘制的海岸线来自&#34; worldHires&#34;来自包mapdata的数据集,它与ggplot2无关。实际上,您可以在marmap图上添加相同的海岸线。

这里有一些代码可以使用基本图形和marmap来生成两个不错的地图:

library(marmap) ; library(mapdata)

# Get bathymetric data
dat <- getNOAA.bathy(-90,-70,-20,-2,res=4, keep=TRUE)

# Create nice color palettes
blues <- c("lightsteelblue4", "lightsteelblue3", "lightsteelblue2", "lightsteelblue1")
greys <- c(grey(0.6), grey(0.93), grey(0.99))

## First option for plotting
plot(dat, land=TRUE, n=100, lwd=0.03)
map("worldHires", res=0, add=TRUE)

# Second option
plot(dat, im=TRUE, land=TRUE, bpal=list(c(min(dat),0,blues),c(0,max(dat),greys)), lwd=.05, las=1 )
map("worldHires", res=0, lwd=0.7, add=TRUE)

# Add -200m and -1000m isobath
plot(dat, deep=-200, shallow=-200, step=0, lwd=0.5, drawlabel=TRUE, add=TRUE)
plot(dat, deep=-1000, shallow=-1000, step=0, lwd=0.3, drawlabel=TRUE, add=TRUE)

请注意,此处使用的分辨率不是最高的。此处res的{​​{1}}参数设置为4。这将通过将getNOAA.bathy()参数设置为keep来下载可以在本地保存的2.7Mb数据集。可能的最高分辨率为TRUE,但在我看来,对于如此广泛的地理范围来说,它是过度的。此代码生成以下2个图:

First option: wireframe plot Second option: image plot