Использование ggplot для построения шейп-файла и gganimate для анимации - PullRequest
0 голосов
/ 24 августа 2018

Пример данных

library(raster)
library(ggplot2)

my.shp <- getData('GADM', country = 'FRA', level = 1)
plot(my.shp)

enter image description here

Если я хочу построить эти данные, используя ggplot:

my.shp_f <- fortify(my.shp, region = "ID_1")
ggplot(data = my.shp_f, aes(long, lat, group = group)) + geom_polygon(fill = "grey80")

enter image description here

Вопрос 1: Почему исчезла административная граница?

Вопрос 2: У меня есть еще один кадр данных с 2данные по количеству суточных осадков за день с 1 по 365 для каждого административного деления.

rain.data <- data.frame(ID_1 = rep(my.shp@data$ID_1, each = 2 * 365),
                        year = rep(rep(1981:1982, each = 365), times = 2),
                        day = rep(1:365, times = 4),
                        rain = sample(1:20, replace = T, 2 * 365 * 2))

Я хочу создать анимацию ежедневного количества осадков для этого файла формы, начиная с 1 дня 1981 года до 365 1982 года.

В настоящее время мой общий подход заключается в создании цикла исохраняйте карту осадков каждого дня как отдельный файл .png, а затем складывайте эти файлы как .gif.Однако это приводит к тому, что я сначала сохраняю файлы .png на 2 года X 365 дней, а затем складываю их вместе.Если у меня есть данные за 30 лет, это становится невозможным.Я прочитал этот пост о gganimate https://github.com/thomasp85/gganimate и задался вопросом, может ли кто-нибудь продемонстрировать, как создать анимированную карту, используя gganimate, используя данные выше

1 Ответ

0 голосов
/ 24 августа 2018

Этот ответ направляет вещи немного в другом направлении, но я хочу попробовать gganimate, и это было хорошим оправданием. Мои модификации в основном с использованием пакета sf и нового geom_sf Geom от ggplot2. Я не люблю хакерскую фиксацию даты, чтобы ее можно было улучшить. Я также составил только часть данных - количество данных у вас, вероятно, займет некоторое время, в зависимости от ваших настроек. В любом случае вот что я бы сделал:

library(raster)
library(ggplot2)
library(sf)
library(dplyr)
library(lubridate)
library(gganimate)
library(rmapshaper)

my.shp <- getData('GADM', country = 'FRA', level = 1)

## Convert the spatial file to sf
my.shp_sf <- st_as_sf(my.shp) %>% 
  ms_simplify()

## Here is how to plot without the rain data
ggplot(my.shp_sf) +
  geom_sf()

## Convert your data into a date
## this is very hacky and coule be improved
rain.data <- data.frame(ID_1 = rep(my.shp@data$ID_1, each = 2 * 365),
                        year = rep(rep(1981:1982, each = 365), times = 2),
                        day = rep(1:365, times = 4),
                        rain = sample(1:20, replace = T, 2 * 365 * 2)) 

date_wo_year <- as.Date(rain.data$day -1, origin = "1981-01-01")
rain.data$Date = ymd(paste0(rain.data$year, "-",month(date_wo_year),"-", day(date_wo_year)))

## Join the rain.data with a properly formatted date with the spatial data. 
joined_spatial <- my.shp_sf %>% 
  left_join(rain.data)

## Plot the spatial data and create an animation
joined_spatial %>% 
  filter(Date < as.Date("1981-02-28")) %>% 
  ggplot() +
  geom_sf(aes(fill = rain)) +
  scale_fill_viridis_c() +
  theme_void() +
  coord_sf(datum = NA) +
  labs(title = 'Date: {current_frame}') +
  transition_manual(Date) 
...