将 R 中的光栅堆栈或砖块转换成动画。

4
我已经从http://luh.umd.edu/data.shtml下载了一些土地利用情景结果的NetCDF文件。该位置上的每个文件都有11种土地利用类型的值,年度数值从2015年到2100年。我想制作一个动态gif或电影,展示随时间变化的情况。这似乎应该很简单,但我尝试了多种方法,没有一种是有效的,所以我希望能找到一些实际有效的方法。 1. 一种方法涉及使用raster包中的stack或brick函数创建一个土地利用变量的栅格堆叠或砖块,然后使用raster animate函数。不幸的是,我收到了以下错误消息“不支持[RasterLayer [stack, brick]]对象的动画”。 2. 另一个选择是将每年的土地利用数据转换为SpatialPixelDataFrame,然后转换为data.frame,使用ggplot创建gif,然后将gif合并成动态gif。但这个过程似乎非常复杂。 我的当前努力在这里的R脚本中。
2个回答

6

通过查看您的代码,我可以使下面的代码工作。

基本上,我正在创建一个包含所有年份数据的大型数据框。

mydf <- purrr::map_dfr(
  as.list(ncin.brick), 
  ~setNames(as.data.frame(as(., "SpatialPixelsDataFrame")), c('value', 'x', 'y')), 
  .id = 'year'
)

gg <- ggplot(
  mydf, 
  aes(x = x, y = y, fill = value)
) +
  geom_sf(data = borders, fill = "transparent", color = "black", inherit.aes = FALSE) +
  geom_tile() +
  scale_fill_viridis_c() +
  ggthemes::theme_map()

gganim <- gg + transition_time(as.numeric(year)) #+ labs(title = "Year: {frame_time}")

gganim

下面的图片是结果(动画很细微)。 enter image description here

purrr 代码很棒!这里的其他部分也适用于我。但创建动画需要非常,非常长的时间。有什么建议可以加速吗? - JerryN
对我来说也花了很长一段时间。很抱歉,我并不太熟悉空间数据,也不知道瓶颈在哪里。 - Axeman

3

尝试使用raster :: animate(),跨包存在几个不兼容的动画函数,这似乎会发生冲突。

我通常使用循环绘制栅格切片,并使用animate包来捕获它,例如使用saveHTML()

对于ggplot2,请查看gganimate包,但是由于需要扩展数据,它无法很好地扩展。


我原以为已经明确添加了“raster”前缀,但事实并非如此。这里是发生冲突的位置:`Attaching package: ‘gganimate’ 下列对象来自于‘package:raster’:animate` - JerryN
你能稍微解释一下你如何使用saveHTML()吗?我尝试了以下代码saveGIF(raster::animate(ncin.brick, pause = 1, n = 1), movie.name = "animation.gif"),但至少已经运行了半个小时了,没有输出。 - JerryN
https://dev59.com/_4rda4cB1Zd3GeqPMnRB 这个问题提供了一个很好的例子,展示了如何使用saveHTML和saveGIF。 - JerryN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接