Я использовал datasets::quakes
, чтобы нарисовать землетрясения на Фиджи следующим образом:
quakes_df <- datasets::quakes
library(ggplot2)
my_plot <- ggplot() +
geom_point(data= quakes_df, aes(lat, long, col= mag)) +
scale_color_gradient(low= "green", high= "red", na.value= "black", aesthetics= "colour",
breaks= seq(min(quakes_df$mag), max(quakes_df$mag), length.out= 4))
my_plot
На следующем этапе я хочу добавить полигоны Фиджи, чтобы лучше понять, где на самом деле происходят землетрясения. Но пока я не могу понять, как совместить оба сюжета. Что я делаю:
# Data of whole world
world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
# Extract Fiji only.
fiji <- subset(world, sovereignt == "Fiji", select= "geometry")
# Add new layer to existing plot
my_plot + geom_sf(data= fiji)
Полученный сюжет неверен. Что здесь происходит? И как я могу добавить границы страны Фиджи на первый график с землетрясениями?
Вы можете использовать пакет sf
для преобразования вашего фрейма данных в геопространственный объект sf
например. с sf::st_as_sf()
. Данные, кажется, выражены в долготе-широте; вероятно, в системе координат (CRS) EPSG:4326. Поскольку это около линии 180 градусов, в этом ответе предлагается использовать CRS EPSG:3994 (отказ от ответственности: я не знаком с CRS Тихоокеанского региона).
Я добавил Австралию на карту для большего пространственного контекста.
library(sf)
library(tidyverse)
quakes_df <- datasets::quakes
world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
fiji <- subset(world, sovereignt == "Fiji", select= "geometry")
Australia <- subset(world, sovereignt == "Australia", select= "geometry")
quakes_sf <- st_as_sf(quakes_df , coords =c ("long","lat") , crs = 4326) %>%
st_transform(crs=3994)
ggplot() +
geom_sf(data= fiji %>% st_transform(crs=3994))+
geom_sf(data= Australia %>% st_transform(crs=3994))+
geom_sf(data= quakes_sf, aes(col= mag),alpha = 0.2) +
scale_color_gradient(low= "green", high= "red", na.value= "black", aesthetics= "colour",
breaks= seq(min(quakes_df$mag), max(quakes_df$mag), length.out= 4))
Created on 2024-07-10 with reprex v2.1.0
Я считаю, что st_transform(crs=3994)
— это то, чего мне не хватало больше всего. Спасибо!
После второго взгляда ваша первая трудность заключается в том, что вы перепутали x
и y
. Вы можете получить приличный сюжет, используя geom_point(data= quakes_df, aes(x= long, y = lat,col= mag)
вместо st_as_sf
и geom_sf(data=quakes_sf)
, но переход на 180 градусов все равно будет проблемой.
Примерно 90% этой цифры не несут полезной информации.
@Friede Это правда, но для меня это не проблема, поскольку теперь я знаю принцип объединения слоев и могу выбирать, какую часть хочу отображать.
Возможно, картирование землетрясений по батиметрическому слою (за исключением Австралии), но, как вы говорите, ваша карта.
Я так не думаю: «Я хочу добавить полигоны для Фиджи».
Я бы предпочел сосредоточиться на Фиджи, т.е.
library(sf)
library(rnaturalearth) # devtools::install_github("ropensci/rnaturalearthhires")
library(ggplot2)
# Note:
sum(is.na(quakes$mag)) # na.value = "black"
#> [1] 0
quakes =
st_as_sf(quakes, coords=c("long","lat"), crs=4326) |>
st_transform(crs=3994)
Fiji =
ne_countries(scale = "large", returnclass = "sf") |>
subset(sovereignt= = "Fiji", select=c("geometry")) |>
st_transform(crs=3994)
ggplot() +
geom_sf(data=Fiji) +
geom_sf(data=quakes, aes(col=mag), alpha=.05) +
scale_color_gradient(low = "green", high = "red", aesthetics = "colour",
breaks=seq( min(quakes$mag), max(quakes$mag), length.out=4L )) +
coord_sf(st_bbox(quakes)[c(1L, 3L)], st_bbox(quakes)[c(2L, 4L)])
Вы можете использовать пакет
sf
для преобразования вашего df в геопространственный объектsf
например с помощьюsf::st_as_sf()
. Тогда вы можете использоватьgeom_sf()
вместоgeom_point()
.