Обрезка карты в форме границы страны

Я пытаюсь загрузить данные о температуре и визуализировать их с помощью R. Я использовал пакет raster для загрузки температуры и ggplot2 для ее визуализации.

library(raster)
library(ggplot2)
library(magrittr)

tmax_data <- getData(name = "worldclim", var = "tmax", res = 10)
gain(tmax_data)=0.1
tmax_mean <- mean(tmax_data)
tmax_mean_df <- as.data.frame(tmax_mean, xy = TRUE, na.rm = TRUE)

tmax_mean_df %>%
  ggplot(aes(x=x,y=y)) +
  geom_raster(aes(fill = layer)) +
  labs(title = "Mean monthly maximum temperatures",
       subtitle = "For the years 1970-2000") +
  xlab("Longitude") +
  ylab("Latitude") +
  scale_fill_continuous(name = "Temperature (°C)")

Однако набор данных содержит значения температуры всего мира. но я хочу визуализировать конкретные страны. Я могу обрезать карту, определив ограничивающую рамку, но я хотел бы обрезать карту по форме страны (вместо квадрата). Существуют ли какие-либо пакеты, поддерживающие эту функциональность? Может быть, передав шейп-файл страны и обрезав карту в этой форме?


person z star    schedule 07.02.2021    source источник
comment
взгляните на sf-пакет... он может обрезаться до коробки, но также и до любой другой загруженной линии формы..   -  person Wimpel    schedule 07.02.2021


Ответы (1)


Вы можете использовать пакет sf в сочетании с пакетами raster::crop и raster::mask. Вот демонстрация для Франции:

library(raster)
library(ggplot2)
library(magrittr)
library(sf)

tmax_data <- getData(name = "worldclim", var = "tmax", res = 10)
gain(tmax_data)=0.1
tmax_mean <- mean(tmax_data)

france_sf <- st_as_sf(maps::map(database = "france", plot = FALSE, fill = TRUE))

tmax_mean_france <- raster::crop(
  raster::mask(tmax_mean, as_Spatial(france_sf)),
  as_Spatial(france_sf)
)

tmax_mean_france_df <- as.data.frame(tmax_mean_france, xy = TRUE, na.rm = TRUE)

tmax_mean_france_df %>%
  ggplot(aes(x=x,y=y)) +
  geom_raster(aes(fill = layer)) +
  labs(title = "Mean monthly maximum temperatures **in France**",
       subtitle = "For the years 1970-2000") +
  xlab("Longitude") +
  ylab("Latitude") +
  scale_fill_continuous(name = "Temperature (°C)")

введите здесь описание изображения

person jsta    schedule 08.02.2021