Как я могу анимировать точки на пространственной карте с помощью gganimate, sf и ggplot2?

#r #ggplot2 #maps #sf #gganimate

Вопрос:

У меня возникли некоторые проблемы с анимацией некоторых точек на пространственной карте. По какой-то причине в анимации отображается только около половины точек. На статическом графике я четко вижу все точки.

Как я могу убедиться, что gganimation показывает все точки? Разве gganimate не «хорошо играет» с пространственными картами?

У кого-нибудь есть больше опыта в использовании gganimate и пространственного построения графиков? Я могу воспроизвести проблему с помощью примера набора данных:

     library(sf)
    library(ggplot2)
    library(ggspatial)
    library(gganimate)

##Reading example data
    nc <- st_read(system.file("shape/nc.shp", package="sf"))

##Create new sf=variable of random points
    A <- nc %>% 
      st_sample(size = 30) %>% 
      st_coordinates() %>%
      as.data.frame()

##Create static map
    B <- ggplot()  
      annotation_spatial(data=nc)  
      geom_point(data = A, aes(x=X, y=Y), size = 2, col = "#3a6589")

##Create animation with points showing up one by one
    plot_anim <- B  
      transition_states(states = Y, state_length = 0, wrap = FALSE)  
      enter_recolor(fill = "#f0f5f9")  
      shadow_mark(past = TRUE, alpha = 1, fill = "#3a6589")

##Render animation
    animate(plot_anim, fps = 40, end_pause = 60)
 

Ответ №1:

Я предлагаю построить ваши точки с помощью ggplot2::geom_sf() — я нашел это надежным при анимации пространственных данных.

Смотрите Немного измененный код ниже; то, что я сделал, это:

  • сохранил объект A в sf формате
  • создал техническую переменную Y со второй(= Y) координатой; затем она используется, как в вашем исходном коде
  • удалил зависимость ggspatial и изменил структуру вашего вызова статической карты
  • удалено значение fps = 40 (это не должно иметь никакого эффекта, кроме размера файла); нам нужно менее 2 МБ для загрузки сюда

Возможно, вам потребуется установить {transformr} для анимации sf объектов; он не должен быть подставкой для показа.

 library(sf)
library(ggplot2)
library(gganimate)

##Reading example data
nc <- st_read(system.file("shape/nc.shp", package="sf"))

##Create new sf=variable of random points
A <- nc %>% 
  st_sample(size = 30) %>% 
  st_as_sf() %>% 
  dplyr::mutate(Y = st_coordinates(.)[,2])

##Create static map
B <- ggplot()  
  geom_sf(data = nc)  
  geom_sf(data = A, size = 2, col = "#3a6589")

# save static map
ggsave("static_map.png")

##Create animation with points showing up one by one
plot_anim <- B  
  transition_states(states = Y, state_length = 0, wrap = FALSE)  
  enter_recolor(fill = "#f0f5f9")  
  shadow_mark(past = TRUE, alpha = 1, fill = "#3a6589")

##Render animation
animate(plot_anim, end_pause = 60,
        height = 200, width = 400) # a higher res img would not upload here :(

# save animated map
anim_save("animated_map.gif")
 

Статическая карта / 30 случайных точек NC

статическая карта Северной Каролины

Динамическая карта / небольшая (из-за требований к загрузке 2 МБ), но в остальном выглядит для меня законной…

динамическая карта NC