R 菜鸟入门篇 第12篇 动画

R 有很多种制作动画的方法,一般都是先做出多幅静态图片,再连续播放就可以了。下面这个例子是用 image() 函数做出静态图片,用循环指令来连续播放。

# 康威生命游戏。内容请咨询维基。
require(simecol) # 调用这个扩展包是为了使用其中的 eightneighbours() 函数。
m <- matrix(0, 40, 40)
m[5:35,19:21] <- 1 # 初始条件。0 表示该位置没有细胞,1 表示有细胞。
image(m, col=c("white", "darkgreen"), axes=FALSE) # 白色表示没有细胞,绿色有细胞。
for (i in 1:200) {
  nn <- eightneighbours(m)
  m.old <- m 
  m[m.old == 0 & nn == 3] <- 1 # 当周围有三个细胞时该位置产生细胞。
  m[m.old == 1 & (nn < 2 | nn > 3)] <- 0 # 当周围细胞少于 2 个(太孤单)或大于 3 个(太拥挤)时,该位置细胞死亡。
  image(m, col=c("white", "darkgreen"), axes=FALSE)
  Sys.sleep(0.1)
}

看到有趣的动画了吧?那么如何保存下来呢?只要在作图前后增加打开和关闭图片的函数就可以了,比如存成png格式的图片:

png(paste("c:\\R\\data\\conway_", formatC(i, width = 2, flag = "0"), ".png", sep = ""), width = 300, height = 300) 
image(m, col=c("white", "darkgreen"), axes = FALSE)
dev.off()

然后用其他免费软件,比如ffmpeg或者imagemagick,把图片连成动画即可。

如果安装了imagemagick,那么三维动画可以用 rgl 扩展包做出来。

require(rgl)
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col = rainbow(1000), type = "s", size = 1, alpha = 0.5) # 作图。
movie3d(spin3d(axis = c(0, 0, 1), rpm = 6), movie = "c:\\R\\data\\movie", duration = 10, clean = TRUE) # 先做出一系列图片,再调用 imagemagick 生成动画。

这就是图 00.2 的来历。

( 连载中,待续 )

R 菜鸟入门篇 第12篇 动画》上有10条评论

    1. dapeng 文章作者

      谢谢支持。我是外行一个,比不了那些牛人,只能往三俗方向写了。好在有老百姓喜闻乐见,哈哈。

      回复
  1. 单子

    博主,求解!> install.packages(rgdal)Error in install.packages : object ‘rgdal’ not found> require(simecol)Loading required package: simecolWarning message:In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : there is no package called ‘simecol’> install.packages(simecol)Error in install.packages : object ‘simecol’ not found还有那个中国地图,貌似下不了

    回复
  2. ellie

    这个很好玩,虽然不是全部理解,但是可以看到动画出来,感觉不错

    回复
  3. ellie

    dapeng,请教一个问题,R的包很多,而且包里的函数很多。碰到需要解决的问题,怎么知道用那个包,以及那些函数?只能凭经验吗?还是说有什么好的方法?

    回复
    1. dapeng 文章作者

      这种现象很普遍,那就是费劲算了半天,最后发现调用现成的包就行了。我一般都是google出来的。或者从同学同事那儿学来的。我觉得只要多留心,做好记录,就能积累很多经验。甚至可以把这4000个包大致浏览一遍,一天看它40个,三个月看完••••••

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax