#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 МБ), но в остальном выглядит для меня законной…