3月 282013
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 的来历。
( 连载中,待续 )
得空的时候,我要好好学习学习你的这个系列。通俗易懂,很不错呀,大鹏。
谢谢支持。我是外行一个,比不了那些牛人,只能往三俗方向写了。好在有老百姓喜闻乐见,哈哈。
万丈高楼平地起,哪有一开始就来很难的呢?是不是,你这个系列很好,由简入难。
对。我也就这水平了,再难的目前也没有了。
博主,求解!> 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还有那个中国地图,貌似下不了
安装扩展包时扩展包名称要用引号。地图可以下吧,我试过了啊。
这个很好玩,虽然不是全部理解,但是可以看到动画出来,感觉不错
还可以更好玩,这恐怕是R做出来的最简单动画了。
dapeng,请教一个问题,R的包很多,而且包里的函数很多。碰到需要解决的问题,怎么知道用那个包,以及那些函数?只能凭经验吗?还是说有什么好的方法?
这种现象很普遍,那就是费劲算了半天,最后发现调用现成的包就行了。我一般都是google出来的。或者从同学同事那儿学来的。我觉得只要多留心,做好记录,就能积累很多经验。甚至可以把这4000个包大致浏览一遍,一天看它40个,三个月看完••••••