簡體   English   中英

使用ggmap / ggplot2在地圖上按組繪制等高線

[英]Plot contours by groups on map with ggmap/ggplot2

所以我想我有一個非常簡單的問題,但我找不到任何答案。

我有很多數據都包含龍蝦的捕獲量。 看起來幾乎都是這樣。

                        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))

可能有更好的方法來完成這項工作。 但是,這是我為您准備的方法。 我希望這種方法也適用於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的列。 用最小級別值子集數據。 我正在使用dplyr filter 例如,

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")

在此處輸入圖片說明

更新

這是另一種方法。 在這里,我使用了這篇文章的答案。 您基本上可以識別出要繪制圓(多邊形)的數據點。 我在帖子中有一些鏈接。 請看一看。 您可以了解循環中發生的事情。 對不起,很抱歉。 但是,我認為這種方法可以繪制所需的所有圓。 提醒您,結果可能不是像輪廓一樣的光滑圓環。

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))

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM