使用ggmap / ggplot2在地图上按组绘制轮廓

时间:2014-11-10 11:02:13

标签: r ggplot2 gis ggmap

所以我认为我有一个非常简单的问题,但我无法在任何地方找到答案。

我有很多包含龙虾捕获量的数据。这一切看起来都像这样。

                        Trip.ID Latitude Longitude            DateTime               ML6      TotalNephropsLandings
16409 OTB_CRU_32-69_0_0DK102831   57.931     9.277 2012-10-04 19:02:00 OTB_CRU_32-69_0_0                 0.2188619
16410 OTB_CRU_32-69_0_0DK102831   57.959     9.375 2012-10-04 21:02:00 OTB_CRU_32-69_0_0             0.2188619
16411 OTB_CRU_32-69_0_0DK102831   58.201    10.232 2012-10-04 02:00:00 OTB_CRU_32-69_0_0              0.2188619
16412 OTB_CRU_32-69_0_0DK102831   58.208    10.260 2012-10-04 03:00:00 OTB_CRU_32-69_0_0             0.2188619
16413 OTB_CRU_32-69_0_0DK102831   58.169    10.078 2012-10-03 23:00:00 OTB_CRU_32-69_0_0               0.2188619
16414 OTB_CRU_32-69_0_0DK102831   57.919     9.227 2012-10-04 18:00:00 OTB_CRU_32-69_0_0             0.2188619

我想做的只是根据" ML6"制作一张带有周围区域轮廓的地图。专栏,是用于捕鱼的不同工具。

我尝试使用geom_density2d,它看起来像这样: 但是,我真的不想显示密度,只有它们存在的地方。所以基本上围绕一组坐标的一条线来自ML6中的同一级别。任何人都可以帮我这个吗?

也可以选择将这些填充为多边形。但也许可以使用" fill ="。

来完成

如果有人知道如何在没有R的情况下做到这一点,也欢迎您提供帮助,但随后我可能需要更深入的信息。

很抱歉没有生成更多我的数据框...

当然我应该已经为剧情制作了代码,所以这里基本上是:

#Get map
 map <- get_map(location=c(left= 0, bottom=45, right=15 ,top=70), maptype = 'satellite')
ggmap(map, extent="normal") + 
  geom_density2d(data = df, aes(x=Longitude, y=Latitude, group=ML6, colour=ML6))

1 个答案:

答案 0 :(得分:4)

可能有更好的方法来完成这项工作。但是,这是我的方法。我希望这种方法也适用于ggmap。有了我的时间,这对我来说是最好的。由于您的示例数据太小,我决定使用自己的一部分数据。你想要做的是研究ggplot_build(objectname)$data[1]。 (看来,当您使用ggmap时,数据将在ggplot_build(object name)$data[4]中。)例如,创建一个这样的对象。

foo <- ggmap(map, extent="normal") + 
       geom_density2d(data = df, aes(x=Longitude, y=Latitude, group=ML6, colour=ML6))

然后,输入ggplot_build(foo)$data[1]。您应该看到ggplot正在使用的数据框。将会有一个名为level的列。具有最小级别值的子集数据。我使用filter中的dplyr。例如,

foo2 <- ggplot_build(foo)$data[1]
foo3 <- filter(foo2, level == 0.02)

foo3现在有数据点,可以让你在地图上画线。该数据具有该级别的最外圈的数据点。你会看到类似的东西。

#     fill level        x         y piece group PANEL
#1 #3287BD  0.02 168.3333 -45.22235     1 1-001     1
#2 #3287BD  0.02 168.3149 -45.09596     1 1-001     1
#3 #3287BD  0.02 168.3197 -44.95455     1 1-001     1

然后,您将执行以下操作。在我的情况下,我没有googlemap。我有新西兰的地图数据。所以我用第一个geom_path吸引了这个国家。第二个geom_path是您需要的。确保你将lon和lat更改为x和y,如下所示。这样我认为你有你想要的圆圈。

# Map data from gadm.org
NZmap  <- readOGR(dsn=".",layer="NZL_adm2")
map.df <- fortify(NZmap)

ggplot(NULL)+
geom_path(data = map.df,aes(x = long, y = lat, group=group), colour="grey50") +
geom_path(data = foo3, aes(x = x, y = y,group = group), colour="red")

enter image description here

<强>更新

这是另一种方法。在这里,我使用了this post的答案。您基本上可以识别绘制圆(多边形)的数据点。我在帖子中有一些链接。请看一看。您可以了解循环中发生的情况。抱歉做空。但是,我认为这种方法可以让你画出你想要的所有圆圈。提醒结果可能不是像轮廓那样漂亮的光滑圆圈。

library(ggmap)
library(sp)
library(rgdal)
library(data.table)
library(plyr)
library(dplyr)

### This is also from my old answer.
### Set a range
lat <- c(44.49,44.5)                
lon <- c(11.33,11.36)   

### Get a map
map <- get_map(location = c(lon = mean(lon), lat = mean(lat)), zoom = 14,
   maptype = "satellite", source = "google")

### Create pseudo data.
foo <- data.frame(x = runif(50, 11.345, 11.357),
                  y= runif(50, 44.4924, 44.4978),
                  group = "one",
                  stringsAsFactors = FALSE)

foo2 <- data.frame(x = runif(50, 11.331, 11.338),
                   y= runif(50, 44.4924, 44.4978),
                   group = "two",
                   stringsAsFactors = FALSE)

new <- rbind(foo,foo2)

### Loop through and create data points to draw a polygon for each group.
cats <- list()

for(i in unique(new$group)){

foo <- new %>%
       filter(group == i) %>%
       select(x, y)

ch <- chull(foo)
coords <- foo[c(ch, ch[1]), ]

sp_poly <- SpatialPolygons(list(Polygons(list(Polygon(coords)), ID=1)))

bob <- fortify(sp_poly)

bob$area <- i

cats[[i]] <- bob
}

cathy <- as.data.frame(rbindlist(cats))

ggmap(map) +
geom_path(data = cathy, aes(x = long, y = lat, group = area), colour="red") +
scale_x_continuous(limits = c(11.33, 11.36), expand = c(0, 0)) +
scale_y_continuous(limits = c(44.49, 44.5), expand = c(0, 0))

enter image description here