ggplot2:将基本海岸线添加到地图中

时间:2015-08-19 08:02:24

标签: r ggplot2 maps spatial

我在海洋学的背景下使用ggplot2,我想添加一张简单的土地图作为参考。这是基本图形中的最低工作示例:

library(ggplot2)
library(maps)

#Setup fake data - some points in the North Sea
n <- 100
d <- data.frame(lon=rnorm(n,5),lat=rnorm(n,55))

#Plotting with base-graphics, then overlaying map
plot(lat~lon,d,pch=16,col="red",asp=1)
map("world",add=TRUE,col="black",fill=TRUE)

Base graphics example

请注意,此图的xlim和ylim由数据范围设置。

现在,尝试在ggplot中重现这个:

#And now with ggplot
g <- ggplot(d,aes(lon,lat))+geom_point(col="red",pch=16)+
     borders("world",fill="black",colour="black")
plot(g)

enter image description here

......技术上是正确的 - 轴被设置为覆盖所有点 - 但实际上并不是我所追求的。

我当然可以使用例如手动设置轴。 coord_cartesian或类似的,但这有很高的刺激因素 - 特别是在尝试自动生成大量类似的地图时。理想情况下,我希望能够覆盖边界/海岸线,并告诉ggplot在确定轴时不要考虑它们。或者,我的印象是geom_map地图是前进的方向,但我没有取得多大成功..

有什么建议吗?

标记

4 个答案:

答案 0 :(得分:2)

使用 public class UserController : ODataController { [HttpPost] public HttpResponseMessage Post(LoginEntityDto objLogin) { //mylogin } } //Custom class public class LoginEntityDto { public string username { get; set; } public string password { get; set; } } 的替代方法,您可以手动或迭代地获取所需区域的地图:

{
  "username": "C201566",
  "password" : "pwd"

}

这会产生以下地图:

enter image description here

请注意,您为一个Google查询(“北海”)或一对纬度/经度点设置了两个坐标。

相同(相似)的地图,其中为该位置传递了一对点(来自数据):

ggmap

enter image description here

以下版本更接近原始情节的精神(虽然有实际黑海):

library(ggmap)
northseamap <- get_map(location = "north sea", zoom=6)
g <- ggmap(northseamap) +geom_point(data = d, aes(x=lon, y=lat), col="red",pch=16)
g

enter image description here

答案 1 :(得分:2)

这对ggplot来说绝对可行,但你需要得到朋友的一些帮助,因为你是正确的,geom_map需要获得美学上令人愉悦的结果。

library(ggplot2)
library(ggthemes)
library(maps)
require(sp)
require(maptools)

# your data

n <- 100
set.seed(1492) # makes the results reproducible
d <- data.frame(lon=rnorm(n, 5),
                lat=rnorm(n, 55))

# get the map, don't plot it but `fill` gets us named 'map' polygons
world <- map("world", fill=TRUE, plot=FALSE)

# convert the 'map' to something we can work with via geom_map
IDs <- sapply(strsplit(world$names, ":"), function(x) x[1])
world <- map2SpatialPolygons(world, IDs=IDs, proj4string=CRS("+proj=longlat +datum=WGS84"))

# this does the magic for geom_map
world_map <- fortify(world)

# setup the plot
g <- ggplot(d, aes(lon, lat))

# add the map
g <- g + geom_map(data=world_map, map=world_map,
                  aes(x=long, y=lat, map_id=id), 
                  fill="black")

# add your points
g <- g + geom_point(col="red", pch=16)

# set the map limits to the extent of your actual data
# (plus a wee bit more)

g <- g + xlim(extendrange(d$lon, f=1))
g <- g + ylim(extendrange(d$lat, f=0.5))

# approximate mercator without dealing with potential
# issues with coord_map()

g <- g + coord_quickmap()

# quick, nice map theme
g <- g + theme_map()

# show the results
g

enter image description here

根据您在数据上的最终位置,可能仍然存在错误多边形线的问题。如果是这样,请发表评论,我可以更新答案,了解如何使用较少的错误地图数据,然后使用当前的内置数据。

答案 2 :(得分:0)

事实证明,自2011年左右(!)以来,ggplot2中一直存在此功能(完全隐藏)-annotation_map()函数将地图添加为图层。因此,该问题的解决方案将是:

g <- ggplot(d,aes(lon,lat))+
  annotation_map(map_data("world"))+ #Add the map as a base layer before the points
  geom_point(col="red",pch=16)+
 coord_quickmap()  #Sets aspect ratio
plot(g)

enter image description here

coord_quickmap()函数在此处将纵横比设置为看起来不错的东西时特别有用。它也可以用于扩展图,使其覆盖整个北海:

g1 <- g+ coord_quickmap(xlim=c(0,15),ylim=c(50,60))
plot(g1)

Figure with map layer and expanded coordinates

在帮助文件中:“ coord_quickmap()是一种快速近似,它确实保留了直线。它最适合靠近赤道的较小区域。”有关更多标准投影,请参见coord_map()功能。

答案 3 :(得分:-1)

ggplot(dat,aes(x=lon, y=lat))+borders(fill="black",colour="black") +
    geom_point(col="red",pch=16) +
    coord_fixed(xlim = c(100,180),ylim=c(0,40))