Исследование повторяемости ветров в южной части Российской Федерации

Автор

А.А. Автор

Дата публикации

28 февраля 2023 г.

Замечание

Данный документ создан на языке программирования R с помощью воспроизводимых вычислений и опубликован на основе издательской системы Quarto версии 1.3.228 на сервисе Netlify. При изменении исходных данных, документ автоматически будет сгенерирован с учетом изменений.

Исходные данные

Загрузим необходимые библиотеки языка программирования R.

Код
# общие библиотеки
library(tidyverse)
library(magrittr)
# работа внутри директорий
library(here)

# библиотеки для работы с географическими данными
library(raster)
library(marmap)
library(elevatr)
library(sp)
library(sf)
library(terra)

Загрузим табличные данные.

Код
data_path <- here("data")
data_table_path <- here(data_path, "wind_2021.csv")

wind_2021_raw <- read_csv(data_table_path)

wind_2021 <- wind_2021_raw

# правильные типы данных
wind_2021$lon %<>% as.numeric()
wind_2021$lat %<>% as.numeric()

# месяцы как факторы (упорядочивание)
wind_2021$month <- factor(wind_2021$month,
  labels = c(
    "апрель",
    "май",
    "июнь",
    "июль"
  ),
  levels = c(
    "апрель",
    "май",
    "июнь",
    "июль"
  )
)

Посмотрим на структуру исходных табличных данных. Здесь:

переменная значение
lat широта точки
lon долгота
wind_value повторяемость ветра в 2021 г. (количество часов)
year год
month месяц

Данные представляют собой объединенную таблицу, в которой каждая строка соответствует одному наблюдению, а названия столбцов – переменным.1 Такие данные удобно преобразовывать и использовать в дальнейшем для графиков.

Код
wind_2021
# A tibble: 90,720 × 5
     lat   lon wind_value  year month 
   <dbl> <dbl>      <dbl> <dbl> <fct> 
 1    60  45          1    2021 апрель
 2    60  45.2       52.4  2021 апрель
 3    60  45.5      102.   2021 апрель
 4    60  45.8      153    2021 апрель
 5    60  46        194.   2021 апрель
 6    60  46.2      197.   2021 апрель
 7    60  46.5      155.   2021 апрель
 8    60  46.8      124.   2021 апрель
 9    60  47        119.   2021 апрель
10    60  47.2      115.   2021 апрель
# … with 90,710 more rows

Рассмотрим изменения основной величины wind_value для различных месяцев на гистограммах ниже.

Код
wind_2021 %>% 
  ggplot(aes(x = wind_value, fill = month)) + 
  geom_histogram(alpha = 0.9, binwidth = 15) +
  labs(fill = "месяц", 
       x = "количество часов",
       y = "количество наблюдений\n")  +
  scale_y_continuous(labels = function(x) format(x, big.mark = " ",
                                                 scientific = FALSE)) +
  theme_bw() +
  facet_wrap(~month, ncol = 2) +
  theme(legend.position = "none",
        plot.margin = margin(0.01, 0.01, 0.01, 0.01, "cm"),
        legend.title = element_text(size = rel(1.1)),
        legend.text = element_text(size = rel(1.1)))

Рисунок 1: Гистограммы, показывающие по месяцам количество наблюдений с различной длительностью в часах ветров со скоростью \(v\) > 7 м/с (южная часть РФ, 2021 год)

Картографическая основа

Все карты (как векторные, так и растровые) и объекты на картах строятся с учетом картографической проекции, в нашем случае это проекция EPSG:4326. Кроме того, для геометрического упрощения границ и ускорения вычислений, заранее была выполнена генерализация картографической основы.

Интересующая нас область представляет собой прямоугольник, градусные меры широт которого варьируются от 42,75 до 60 и для долготы от 45 до 125,75.

Загрузим (упрощенные границы) Российской Федерации.

Код
Russia_map_path <- here(data_path, "boundary_Russia_regions_simplified.shp")
Russia_regions_boundary <- st_read(Russia_map_path)
Reading layer `boundary_Russia_regions_simplified' from data source 
  `/Users/materov/@Мои доклады/@Quarto meetups/materials/report/data/boundary_Russia_regions_simplified.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 86 features and 1 field
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -180 ymin: 41.18587 xmax: 180 ymax: 82.05862
Geodetic CRS:  WGS 84
Код
Russia_regions_boundary <-
  Russia_regions_boundary[order(Russia_regions_boundary$names_new), ]

Изобразим полную карту РФ по регионам.

Код
ggplot() +
  geom_sf(data = Russia_regions_boundary, 
          aes(fill = names_new),
          alpha = 0.8) +
  theme_void() +
  theme(legend.position = "none") +
  coord_sf(xlim = c(25, 180), 
           ylim = c(41.18587, 82.05862))

Рисунок 2: Карта границ регионов РФ с учетом упрощений

Ограничим карту регионов только на исследуемую прямоугольную область. Здесь цвет соответствует номеру региона.

Код
Russia_regions_crop <- st_crop(Russia_regions_boundary,
  xmin = min(wind_2021$lon),
  ymin = min(wind_2021$lat),
  xmax = max(wind_2021$lon),
  ymax = max(wind_2021$lat)
)

Russia_regions_crop <- Russia_regions_crop %>% 
  mutate(id = row_number())

ggplot() +
  geom_sf(data = Russia_regions_crop,
          aes(fill = id), alpha = 0.8) +
  ggrepel::geom_label_repel(
    data = Russia_regions_crop,
    aes(label = id, geometry = geometry),
    stat = "sf_coordinates",
    min.segment.length = 0,
    alpha = 0.7
  ) +
  coord_sf(xlim = c(min(wind_2021$lon), max(wind_2021$lon)), 
           ylim = c(min(wind_2021$lat), max(wind_2021$lat)),
           expand = FALSE) +
  labs(x = "", y = "") +
  theme(legend.position = "none") +
  viridis::scale_fill_viridis(option = "turbo") +
  theme(plot.margin = margin(0.01, 0.01, 0.01, 0.01, "cm"),
        legend.title = element_text(size = rel(1.1)),
        legend.text = element_text(size = rel(1.1)))

Рисунок 3: Карта границ регионов РФ в пределах исследуемой области

Замечание

Язык R позволяет строить график послойно, настраивать прозрачность слоев, добавлять различные элементы, и т.д.

Растровые карты

Для отображения данных можно воспользоваться растровыми картами с непрерывными палитрами. Ниже показан пример наблюдений июня 2021 года.

# функция, необходимая для переопределения 
# средней точки цветовой палитры

1mid_rescaler <- function(mid = 0) {
  function(x, to = c(0, 1), from = range(x, na.rm = TRUE)) {
    scales::rescale_mid(x, to, from, mid)
  }
}
1
В коде выше функция mid_rescaler – аргумент средней точки в scale_* (источник).
Код
library(paletteer)

ggplot() +
  geom_raster(data = wind_2021 %>% dplyr::filter(month == "июнь"), 
              aes(x = lon, y = lat, fill = wind_value), 
              alpha = 0.9, interpolate = TRUE) +
  geom_sf(data = Russia_regions_crop, color = "black",
          alpha = 0.01,
          linewidth = 0.4) +
  ggrepel::geom_label_repel(
    data = Russia_regions_crop,
    aes(label = id, geometry = geometry),
    stat = "sf_coordinates",
    min.segment.length = 0,
    alpha = 0.7
  ) +
  scale_fill_paletteer_c("grDevices::RdYlBu", 
                         na.value = NA, 
                         rescaler = mid_rescaler(mid = 
                                    median(wind_2021$wind_value) + 100),
                         breaks = c(0, 100, 200, 300),
                         labels = c("0 ч", "100 ч", "200 ч", "300 ч"),
                         direction = -1) +
  hrbrthemes::theme_ipsum() +
  labs(x = "", y = "",
       fill = "количество часов") +
  coord_sf(xlim = c(min(wind_2021$lon), max(wind_2021$lon)), 
           ylim = c(min(wind_2021$lat), max(wind_2021$lat)),
           expand = FALSE) +
  guides(fill = guide_colorbar(title.position = 'top', 
                               title.hjust = 0.5,
                               barwidth = unit(15, 'lines'), 
                               barheight = unit(0.7, 'lines'))) +
  theme(legend.position = "bottom",
    plot.margin = margin(0.01, 0.01, 0.01, 0.01, "cm"),
    legend.title = element_text(size = rel(1.1)),
    legend.text = element_text(size = rel(1.1))
  )

Рисунок 4: Растровая карта наблюдений ветров в июне 2021 года с учетом интерполяции

Карта высот над уровнем моря

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

Код
# географическая проекция
projection <- "EPSG:4326"

# получение данных по высотам
elevation_df <- get_elev_raster(wind_2021 %>% 
                                  dplyr::select(lon, lat) %>% 
                                  rename(x = lon, y = lat) %>% 
                                  na.omit() %>% 
                                  as.data.frame(), 
                                prj = projection, 
                                # z = разрешение
                                z = 5)

Из растровых данных легко сделать таблицу высот. Здесь \(x\) и \(y\) соответствуют координатам, а \(z\) – высотам над уровнем моря.

Код
elevation_tibble <- as.data.frame(elevation_df, xy = TRUE) 
elevation_tibble %<>% as_tibble()
names(elevation_tibble)[3] <- "z"

elevation_tibble
# A tibble: 4,165,928 × 3
       x     y     z
   <dbl> <dbl> <dbl>
 1  45.0  61.6   160
 2  45.0  61.6   167
 3  45.1  61.6   173
 4  45.1  61.6   172
 5  45.1  61.6   161
 6  45.1  61.6   147
 7  45.1  61.6   138
 8  45.2  61.6   143
 9  45.2  61.6   155
10  45.2  61.6   161
# … with 4,165,918 more rows

Покажем растровое изображение высот над уровнем моря для исследуемой области.

Код
ggplot() +
  geom_raster(data = elevation_tibble, 
              aes(x = x, y = y, fill = z)) +
  geom_sf(data = Russia_regions_boundary, color = "black",
          alpha = 0.1) +
  ggrepel::geom_label_repel(
    data = Russia_regions_crop,
    aes(label = id, geometry = geometry),
    stat = "sf_coordinates",
    min.segment.length = 0,
    alpha = 0.7
  ) +
  scale_fill_etopo() +
  hrbrthemes::theme_ipsum() +
  labs(fill = "высота, м.:\n", x = "", y = "") +
  theme(legend.key.height = unit(1, 'cm')) +
  coord_sf(xlim = c(min(wind_2021$lon), max(wind_2021$lon)), 
           ylim = c(min(wind_2021$lat), max(wind_2021$lat)),
           expand = FALSE) +
  theme(plot.margin = margin(0.01, 0.01, 0.01, 0.01, "cm"),
        legend.title = element_text(size = rel(1.1)),
        legend.text = element_text(size = rel(1.1)))

Рисунок 5: Растровая карта высот для исследуемой области

Техническая информация

Здесь указана информация о сессии и загруженных библиотеках языка R.

─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.2.0 (2022-04-22)
 os       macOS Monterey 12.1
 system   aarch64, darwin20
 ui       X11
 language (EN)
 collate  ru_RU.UTF-8
 ctype    ru_RU.UTF-8
 tz       Asia/Krasnoyarsk
 date     2023-02-28
 pandoc   2.18 @ /Users/materov/opt/miniconda3/envs/ox/bin/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package           * version    date (UTC) lib source
 adehabitatMA        0.3.15     2022-10-21 [1] CRAN (R 4.2.0)
 bit                 4.0.5      2022-11-15 [1] CRAN (R 4.2.0)
 bit64               4.0.5      2020-08-30 [1] CRAN (R 4.2.0)
 blob                1.2.3      2022-04-10 [1] CRAN (R 4.2.0)
 cachem              1.0.7      2023-02-24 [1] CRAN (R 4.2.0)
 class               7.3-21     2023-01-23 [1] CRAN (R 4.2.0)
 classInt            0.4-8      2022-09-29 [1] CRAN (R 4.2.0)
 cli                 3.6.0      2023-01-09 [1] CRAN (R 4.2.0)
 codetools           0.2-19     2023-02-01 [1] CRAN (R 4.2.0)
 colorspace          2.1-0      2023-01-23 [1] CRAN (R 4.2.0)
 crayon              1.5.2      2022-09-29 [1] CRAN (R 4.2.0)
 crul                1.3        2022-09-03 [1] CRAN (R 4.2.0)
 curl                5.0.0      2023-01-12 [1] CRAN (R 4.2.0)
 DBI                 1.1.3      2022-06-18 [1] CRAN (R 4.2.0)
 digest              0.6.31     2022-12-11 [1] CRAN (R 4.2.0)
 dplyr             * 1.1.0      2023-01-29 [1] CRAN (R 4.2.0)
 e1071               1.7-13     2023-02-01 [1] CRAN (R 4.2.0)
 elevatr           * 0.4.3.9999 2022-09-22 [1] Github (jhollist/elevatr@d06d652)
 ellipsis            0.3.2      2021-04-29 [1] CRAN (R 4.2.0)
 evaluate            0.20       2023-01-17 [1] CRAN (R 4.2.0)
 extrafont           0.19       2023-01-18 [1] CRAN (R 4.2.0)
 extrafontdb         1.0        2012-06-11 [1] CRAN (R 4.2.0)
 fansi               1.0.4      2023-01-22 [1] CRAN (R 4.2.0)
 farver              2.1.1      2022-07-06 [1] CRAN (R 4.2.0)
 fastmap             1.1.1      2023-02-24 [1] CRAN (R 4.2.0)
 fontBitstreamVera   0.1.1      2017-02-01 [1] CRAN (R 4.2.0)
 fontLiberation      0.1.0      2016-10-15 [1] CRAN (R 4.2.0)
 fontquiver          0.2.1      2017-02-01 [1] CRAN (R 4.2.0)
 forcats           * 1.0.0      2023-01-29 [1] CRAN (R 4.2.0)
 gdistance           1.6        2022-10-10 [1] CRAN (R 4.2.0)
 gdtools             0.3.1      2023-02-17 [1] CRAN (R 4.2.0)
 generics            0.1.3      2022-07-05 [1] CRAN (R 4.2.0)
 gfonts              0.2.0      2023-01-08 [1] CRAN (R 4.2.0)
 ggplot2           * 3.4.1      2023-02-10 [1] CRAN (R 4.2.0)
 ggrepel             0.9.3      2023-02-03 [1] CRAN (R 4.2.0)
 glue                1.6.2      2022-02-24 [1] CRAN (R 4.2.0)
 gridExtra           2.3        2017-09-09 [1] CRAN (R 4.2.0)
 gtable              0.3.1      2022-09-01 [1] CRAN (R 4.2.0)
 here              * 1.0.1      2020-12-13 [1] CRAN (R 4.2.0)
 hms                 1.1.2      2022-08-19 [1] CRAN (R 4.2.0)
 hrbrthemes          0.8.0      2020-03-06 [1] CRAN (R 4.2.0)
 htmltools           0.5.4      2022-12-07 [1] CRAN (R 4.2.0)
 htmlwidgets         1.6.1      2023-01-07 [1] CRAN (R 4.2.0)
 httpcode            0.3.0      2020-04-10 [1] CRAN (R 4.2.0)
 httpuv              1.6.9      2023-02-14 [1] CRAN (R 4.2.0)
 httr                1.4.5      2023-02-24 [1] CRAN (R 4.2.0)
 igraph              1.4.1      2023-02-24 [1] CRAN (R 4.2.0)
 jsonlite            1.8.4      2022-12-06 [1] CRAN (R 4.2.0)
 KernSmooth          2.23-20    2021-05-03 [1] CRAN (R 4.2.0)
 knitr               1.42       2023-01-25 [1] CRAN (R 4.2.0)
 labeling            0.4.2      2020-10-20 [1] CRAN (R 4.2.0)
 later               1.3.0      2021-08-18 [1] CRAN (R 4.2.0)
 lattice             0.20-45    2021-09-22 [1] CRAN (R 4.2.0)
 lifecycle           1.0.3      2022-10-07 [1] CRAN (R 4.2.0)
 lubridate         * 1.9.2      2023-02-10 [1] CRAN (R 4.2.0)
 magrittr          * 2.0.3      2022-03-30 [1] CRAN (R 4.2.0)
 marmap            * 1.0.9      2023-01-09 [1] CRAN (R 4.2.0)
 Matrix              1.5-3      2022-11-11 [1] CRAN (R 4.2.0)
 memoise             2.0.1      2021-11-26 [1] CRAN (R 4.2.0)
 mime                0.12       2021-09-28 [1] CRAN (R 4.2.0)
 munsell             0.5.0      2018-06-12 [1] CRAN (R 4.2.0)
 ncdf4               1.21       2023-01-07 [1] CRAN (R 4.2.0)
 paletteer         * 1.5.0      2022-10-19 [1] CRAN (R 4.2.0)
 pillar              1.8.1      2022-08-19 [1] CRAN (R 4.2.0)
 pkgconfig           2.0.3      2019-09-22 [1] CRAN (R 4.2.0)
 plyr                1.8.8      2022-11-11 [1] CRAN (R 4.2.0)
 prettyunits         1.1.1      2020-01-24 [1] CRAN (R 4.2.0)
 prismatic           1.1.1      2022-08-15 [1] CRAN (R 4.2.0)
 progress            1.2.2      2019-05-16 [1] CRAN (R 4.2.0)
 progressr           0.13.0     2023-01-10 [1] CRAN (R 4.2.0)
 promises            1.2.0.1    2021-02-11 [1] CRAN (R 4.2.0)
 proxy               0.4-27     2022-06-09 [1] CRAN (R 4.2.0)
 purrr             * 1.0.1      2023-01-10 [1] CRAN (R 4.2.0)
 R6                  2.5.1      2021-08-19 [1] CRAN (R 4.2.0)
 raster            * 3.6-14     2023-01-16 [1] CRAN (R 4.2.0)
 Rcpp                1.0.10     2023-01-22 [1] CRAN (R 4.2.0)
 readr             * 2.1.4      2023-02-10 [1] CRAN (R 4.2.0)
 rematch2            2.1.2      2020-05-01 [1] CRAN (R 4.2.0)
 reshape2            1.4.4      2020-04-09 [1] CRAN (R 4.2.0)
 rgdal               1.6-4      2023-01-12 [1] CRAN (R 4.2.0)
 rlang               1.0.6      2022-09-24 [1] CRAN (R 4.2.0)
 rmarkdown           2.20       2023-01-19 [1] CRAN (R 4.2.0)
 rprojroot           2.0.3      2022-04-02 [1] CRAN (R 4.2.0)
 RSQLite             2.3.0      2023-02-17 [1] CRAN (R 4.2.0)
 Rttf2pt1            1.3.12     2023-01-22 [1] CRAN (R 4.2.0)
 s2                  1.1.2      2023-01-12 [1] CRAN (R 4.2.0)
 scales              1.2.1      2022-08-20 [1] CRAN (R 4.2.0)
 sessioninfo         1.2.2      2021-12-06 [1] CRAN (R 4.2.0)
 sf                * 1.0-9      2022-11-08 [1] CRAN (R 4.2.0)
 shape               1.4.6      2021-05-19 [1] CRAN (R 4.2.0)
 shiny               1.7.4      2022-12-15 [1] CRAN (R 4.2.0)
 slippymath          0.3.1      2019-06-28 [1] CRAN (R 4.2.0)
 sp                * 1.6-0      2023-01-19 [1] CRAN (R 4.2.0)
 stringi             1.7.12     2023-01-11 [1] CRAN (R 4.2.0)
 stringr           * 1.5.0      2022-12-02 [1] CRAN (R 4.2.0)
 systemfonts         1.0.4      2022-02-11 [1] CRAN (R 4.2.0)
 terra             * 1.7-3      2023-01-24 [1] CRAN (R 4.2.0)
 tibble            * 3.1.8      2022-07-22 [1] CRAN (R 4.2.0)
 tidyr             * 1.3.0      2023-01-24 [1] CRAN (R 4.2.0)
 tidyselect          1.2.0      2022-10-10 [1] CRAN (R 4.2.0)
 tidyverse         * 2.0.0      2023-02-22 [1] CRAN (R 4.2.0)
 timechange          0.2.0      2023-01-11 [1] CRAN (R 4.2.0)
 tzdb                0.3.0      2022-03-28 [1] CRAN (R 4.2.0)
 units               0.8-1      2022-12-10 [1] CRAN (R 4.2.0)
 utf8                1.2.3      2023-01-31 [1] CRAN (R 4.2.0)
 vctrs               0.5.2.9000 2023-01-29 [1] Github (r-lib/vctrs@af3fcc4)
 viridis             0.6.2      2021-10-13 [1] CRAN (R 4.2.0)
 viridisLite         0.4.1      2022-08-22 [1] CRAN (R 4.2.0)
 vroom               1.6.1      2023-01-22 [1] CRAN (R 4.2.0)
 withr               2.5.0      2022-03-03 [1] CRAN (R 4.2.0)
 wk                  0.7.1      2022-12-09 [1] CRAN (R 4.2.0)
 xfun                0.37       2023-01-31 [1] CRAN (R 4.2.0)
 xtable              1.8-4      2019-04-21 [1] CRAN (R 4.2.0)
 yaml                2.3.7      2023-01-23 [1] CRAN (R 4.2.0)

 [1] /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/library

──────────────────────────────────────────────────────────────────────────────

Сноски

  1. Желательно всегда представлять данные именно в таком виде.↩︎