使用不断变化的 shapefile(只有 4 个不同的 shapefile)动画地图挂起
Animating maps with changing shapefiles (only 4 different shapefiles) hangs
我正在尝试制作美国边界每年增长的动画。虽然我能够快速生成每个单独的图,但当我尝试创建动画地图(无进度条)时,即使帧数很少,动画也会挂起。
这是一些包含 4 个日期的示例代码,关于如何生成动画有什么想法吗?
library(USAboundaries)
library(dplyr)
library(ggplot2)
library(gganimate)
dates <- seq(as.Date("1783-09-03"), as.Date("2000-12-31"), by="years")
dates <- dates[c(1,29, 52, 75)]
maps <- lapply(dates, function(date) {
map <- us_states(map_date = date, resolution = "high")
map$year <- date
map
}) %>%
bind_rows() %>%
select(id_num, terr_type, state_code, geometry, year, name)
# Generating all the maps at once works just fine
all_maps <- ggplot() +
geom_sf(data = maps)
all_maps
# Animating maps hangs once its called
animated_map <- ggplot() +
geom_sf(data = maps) +
transition_states(
year,
transition_length = 2,
state_length = 1
)
animated_map
您可以使用 transition_manual
。在您的 maps
上试试这个
animated_map <- ggplot() +
geom_sf(data = maps) +
transition_manual(year)
animate(animated_map, renderer = gifski_renderer())
请注意,我使用的是 gifski
包中的 gifski_renderer()
。如果您可以完全访问默认位置,则可能不需要它。您会得到以下输出:
我正在尝试制作美国边界每年增长的动画。虽然我能够快速生成每个单独的图,但当我尝试创建动画地图(无进度条)时,即使帧数很少,动画也会挂起。
这是一些包含 4 个日期的示例代码,关于如何生成动画有什么想法吗?
library(USAboundaries)
library(dplyr)
library(ggplot2)
library(gganimate)
dates <- seq(as.Date("1783-09-03"), as.Date("2000-12-31"), by="years")
dates <- dates[c(1,29, 52, 75)]
maps <- lapply(dates, function(date) {
map <- us_states(map_date = date, resolution = "high")
map$year <- date
map
}) %>%
bind_rows() %>%
select(id_num, terr_type, state_code, geometry, year, name)
# Generating all the maps at once works just fine
all_maps <- ggplot() +
geom_sf(data = maps)
all_maps
# Animating maps hangs once its called
animated_map <- ggplot() +
geom_sf(data = maps) +
transition_states(
year,
transition_length = 2,
state_length = 1
)
animated_map
您可以使用 transition_manual
。在您的 maps
animated_map <- ggplot() +
geom_sf(data = maps) +
transition_manual(year)
animate(animated_map, renderer = gifski_renderer())
请注意,我使用的是 gifski
包中的 gifski_renderer()
。如果您可以完全访问默认位置,则可能不需要它。您会得到以下输出: