R 使用ggmap/ggplot2在地图上按组绘制等高线

R 使用ggmap/ggplot2在地图上按组绘制等高线,r,ggplot2,gis,ggmap,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_CR

所以我想我有一个非常简单的问题,但是我在任何地方都找不到答案

我有很多关于龙虾捕获量的数据。这一切看起来就像这样

                        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))
#获取地图

map可能有更好的方法来做这项工作。但是,这是我给你的方法。我希望这种方法也适用于
ggmap
。给我时间,这是我最好的礼物。由于您的示例数据太小,我决定使用自己的一部分数据。您要做的是查看
ggplot\u build(objectname)$data[1]
。(看起来,当您使用
ggmap
时,数据将位于
ggplot\u build(object name)$data[4]
)例如,创建这样的对象

foo <- ggmap(map, extent="normal") + 
       geom_density2d(data = df, aes(x=Longitude, y=Latitude, group=ML6, colour=ML6))
#     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
foo3现在有了数据点,可以在地图上画线。此数据包含标高最外层圆圈的数据点。你会看到像这样的东西

foo <- ggmap(map, extent="normal") + 
       geom_density2d(data = df, aes(x=Longitude, y=Latitude, group=ML6, colour=ML6))
#     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
然后,您将执行以下操作。就我而言,我没有谷歌地图。我有新西兰的地图资料。因此,我用第一条
几何路径绘制国家。第二个
geom_路径是您需要的路径。一定要把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")
#来自gadm.org的地图数据

NZmap可能有更好的方法来做这项工作。但是,这是我给你的方法。我希望这种方法也适用于
ggmap
。给我时间,这是我最好的礼物。由于您的示例数据太小,我决定使用自己的一部分数据。您要做的是查看
ggplot\u build(objectname)$data[1]
。(看起来,当您使用
ggmap
时,数据将位于
ggplot\u build(object name)$data[4]
)例如,创建这样的对象

foo <- ggmap(map, extent="normal") + 
       geom_density2d(data = df, aes(x=Longitude, y=Latitude, group=ML6, colour=ML6))
#     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
foo3现在有了数据点,可以在地图上画线。此数据包含标高最外层圆圈的数据点。你会看到像这样的东西

foo <- ggmap(map, extent="normal") + 
       geom_density2d(data = df, aes(x=Longitude, y=Latitude, group=ML6, colour=ML6))
#     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
然后,您将执行以下操作。就我而言,我没有谷歌地图。我有新西兰的地图资料。因此,我用第一条
几何路径绘制国家。第二个
geom_路径是您需要的路径。一定要把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")
#来自gadm.org的地图数据

NZmap您能提供您的代码吗?@jazzurro I为绘图添加了代码。你还有别的想法吗?如果您需要更多我的数据,我可以提供一些。我只是有点急着写这个问题……我想我现在正在找到一条出路。希望我能尽快发布我的建议。谢谢你的代码。你能提供你的代码吗?@jazzurro我为情节添加了代码。你还有别的想法吗?如果您需要更多我的数据,我可以提供一些。我只是有点急着写这个问题……我想我现在正在找到一条出路。希望我能尽快发布我的建议。谢谢你的代码。因为
geom_density2d
kde2d
(以及随后的
countour
)的包装器,你可以为
levels=c(…)
传递一个参数,所以我怀疑你的地图可以直接使用
stat_density2d(levels=0.02)
。这里的另一个选择是计算捕获区域周围的轮廓,尽管轮廓可能更好看。@AndyW谢谢你的评论。我也考虑过使用
hull
。明天我将测试
stat\u density2d(levels=0.02)
。这是我没有想到的。感谢您分享您的想法。@jazzurro感谢您的回答,很抱歉没有立即回复。但我似乎有一个问题,因为当访问数据时,我只得到列<代码>x
y
面板
。知道为什么吗?这似乎是一个很好的方式去实现我想要的目标,但我不确定所有的位置都包括在内。因为通常使用
stat\u density2d()
时,如果位置在数据中出现的次数太少,则不包括位置。我猜这意味着它们的出现密度不够高。@balconydoor感谢您的留言。我懂了。我需要测试
ggmap
的结果。然而,鉴于你的图像有轮廓,我确信你在某处有数据。如果不是
ggplot\u build(foo)$data[[1]]
,请查看
ggplot\u build(foo)$data[[2]]
有什么功能。我不熟悉这个
ggplot\u build
业务,但是应该有多边形信息。至于你的第二部分,你是对的。我猜即使是你的地图也没有所有的数据点。本周我的日程安排很紧,但我会尝试一下。请耐心一点。@balconydoor还有一件事。用我的第一种方法尝试
ggplot\u build(object name)$data[4]
。您可能会看到
级别
。未测试,但那里的数据似乎是唯一的。因为
geom_density2d