Построение точек вблизи береговой линии с помощью geom_point / ggmap / plot - PullRequest
0 голосов
/ 23 ноября 2018

Я привык работать с matlab и сейчас пытаюсь научиться использовать тидиверс в R (и в частности ggplot2), поэтому я делаю карту всех точек у побережья Новой Шотландии, где я нахожусьсбор данных для проекта.Я знаю, что строю часть, начинающуюся с «карты», неправильно, но я не знаю, как построить график с помощью ggmap на основе широты / долготы.Я предполагаю, что следующая строка, «loc_map», тогда не работает, потому что «карта» не сделана в пределах направления, но я не знаю, как это исправить!

lat <- loc$Lat
long <- loc$Long
locs <- data.frame(long,lat)
data("coastlineWorldFine")
map <- plot(coastlineWorldFine, col='grey', clong= mean(long), 
            clat=mean(lat), span=400, projection = "+proj=merc",
            main="Sample Sites")
loc_map <- map + geom_point(data=locs, aes(x=long, y=lat), size = 20)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы не дали нам много работы, но здесь все идет.

library(sf)
library(lwgeom) # needed only for st_sample
library(tidyverse)

Давайте возьмем шейп-файл канадского уровня Admin01, вытянем Новую Шотию и немного упростим полигоны

# Get a Canada Admin01 shapefile
canada <- st_as_sf(raster::getData("GADM", country = "CAN", level = 1))
# just get Nova Scotia
ns <- filter(canada, NAME_1 == "Nova Scotia")
# simplify the polygons a bit (tweak `0.01` as you need)
ns <- st_simplify(ns, preserveTopology = TRUE, 0.01)

Теперь мы сгенерируем некоторые точечные данные, поскольку вы их не предоставили.Они не будут все на береговой линии:

set.seed(2018-11-23)
some_random_points <- as_data_frame(st_coordinates(st_sample(ns, 20)))

some_random_points
## # A tibble: 18 x 2
##        X     Y
##    <dbl> <dbl>
##  1 -63.4  44.7
##  2 -63.9  45.1
##  3 -64.2  44.7
##  4 -60.8  46.8
##  5 -65.0  44.3
##  6 -63.8  45.4
##  7 -62.7  45.3
##  8 -66.1  44.3
##  9 -64.8  44.1
## 10 -64.5  44.8
## 11 -63.8  44.5
## 12 -64.7  44.8
## 13 -63.1  44.9
## 14 -65.5  43.9
## 15 -64.6  44.4
## 16 -60.4  45.9
## 17 -63.9  44.6
## 18 -62.4  45.6

Теперь сделайте современную gg_cartography:

ggplot() +
  geom_sf(data = ns, fill = "gray90", color = "#2b2b2b", size=0.125) +
  geom_point(data = some_random_points, aes(X, Y)) +
  theme_bw()

enter image description here

0 голосов
/ 23 ноября 2018

Вот отправная точка, к которой вы можете добавить слой geom_point.Сначала я загружаю библиотеки, которых много.marmap и oce требуются для данных батиметрии и береговой линии соответственно.RColorBrewer используется для цветовой палитры для батиметрии, а dplyr необходимо для mutate.magrittr предоставляет оператор составного канала назначения (%<>%), tibble используется, когда я реструктурирую данные батиметрии, а ggthemes предоставляет theme_tufte.

# Load libraries
library(ggplot2)
library(marmap)
library(oce)
library(RColorBrewer)
library(dplyr)
library(magrittr)
library(tibble)
library(ggthemes)

Здесь я получаюбатиметрические данные, реструктурируйте их и разбейте на интервалы глубины.

# Get bathymetry data
bathy <- getNOAA.bathy(lon1 = -68, lon2 = -56, 
                       lat1 = 41, lat2 = 49, 
                       resolution = 1, keep = TRUE)
bathy <- as.tibble(fortify.bathy(bathy))
bathy %<>% mutate(depth_bins = cut(z, breaks = c(Inf, 0, -200, -500, -1000, 
                                                 -1500, -2000, -2500, -3000, -Inf)))  

Затем я получаю данные береговой линии и помещаю их во фрейм данных.

# Get coast line data
data(coastlineWorldFine, package = "ocedata")
coast <- as.data.frame(coastlineWorldFine@data)

Наконец, я строю графикit.

# Plot figure
p <- ggplot()
p <- p + geom_raster(data = bathy, aes(x = x, y = y, fill = depth_bins), interpolate = TRUE, alpha = 0.75)
p <- p + geom_polygon(data = coast, aes(x = longitude, y = latitude))
p <- p + coord_cartesian(ylim = c(42, 47), xlim = c(-67, -57))
p <- p + theme_tufte()
p <- p + theme(axis.text = element_blank(),
               axis.title = element_blank(),
               axis.line = element_blank(),
               axis.ticks = element_blank(),
               legend.position = "right",
               plot.title = element_text(size = 24),
               legend.title = element_text(size = 20),
               legend.text = element_text(size = 18))
p <- p + scale_fill_manual(values = rev(c("white", brewer.pal(8, "Blues"))), guide = "none")
print(p)

Это дает следующее:

enter image description here

Добавление слоя geom_point позволит построить ваше полесайты.

...