我想在我正在看的地图上添加测深线。我正在海岸附近绘制点,我们感兴趣的是它们离大陆架有多近。我见过一个名为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只是为了说清楚,我没有测深数据,我只想将已知的货架线绘制到我创建的地图上,如果可能的话。
答案 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()
答案 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
显然你想要一个比这更好的图片,但基本的想法是将它转换成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个图: