2009-08-19 63 views

回答

38

这是一个方法,我发现,使用R帮助:

要创建单独的图像帧:

jpeg("/tmp/foo%02d.jpg") 
for (i in 1:5) { 
    my.plot(i) 
} 
dev.off() 

拍电影,第一次安装ImageMagick。 然后调用下面的函数(所谓的“转化”,我想的ImageMagick的一部分):

make.mov <- function(){ 
    unlink("plot.mpg") 
    system("convert -delay 0.5 plot*.jpg plot.mpg") 
} 

,或者由于本article(我发现这给清洁效果)描述尝试使用ffmpeg的功能: ffmpeg -r 25 -qscale 2 -i tmp/foo%02d.jpg output.mp4

可能需要一点修补,但是一旦安装了所有东西,这似乎很简单。

当然,无论你看到“jpg”还是“jpeg”,都可以用GIF或PNG来替代你的幻想。

+0

您甚至可以将jpeg()和dev.off()保留在循环之外 - 如果您使用适当的文件名作为例如jpeg(“/ tmp/foo%02d.png”),R会在你的循环中简单地创建新文件。不需要你计算文件名。使它更容易。 – 2009-08-19 15:36:41

+0

你应该让Dirk的修复,然后接受你自己的答案。好的解决方案 – 2009-08-19 15:47:10

+0

很有用...但在R中运行函数'make.mov'后发现很难理解.mpg文件的保存位置?我正在R平台上工作。 – ToNoY 2014-10-04 04:30:43

1

我不知道这是可能的R.我做了一个项目时,一次从R数据点被导出到一个MySQL数据库和一个Flex/Flash应用程序拿起这些数据点又给动画视觉化..

+4

您不需要数据库。在一个循环中,保存所有图像。然后使用命令行工具将它们拼接在一起; imagemagick是一种可能性。 – 2009-08-19 12:14:50

+0

是的,这是最简单的方法。我想由于操作系统的模块化,除非R是用特殊的库或类似的东西编译的,否则在R中不可能这样做。 – 2009-08-19 15:07:51

+0

这是一个聪明的技巧,Srirangan。 很多年前我学到,当有人说'这不可能'时,他们的意思是'我不知道该怎么做'。 该技巧的巧妙之处在于,在诸如SO这样的论坛中,有人必然会告诉你如何去做。顺便说一句,我并不是讽刺。我真的认为这是一种很好的技术,我会尝试一下。谢谢Srirangan。 – pavium 2009-08-20 00:09:23

2

如果你将R脚本封装在更大的Perl/Python /等内。脚本,您可以将图形与您喜欢的命令行图像拼接工具一起缝合。

要使用包装脚本运行R脚本,请使用R CMD BATCH方法。

+1

为什么你需要另一种语言来使用命令行工具? – hadley 2009-08-19 12:12:18

+1

那么需要Perl/Python脚本?另外,将Rscript(和littler)看作是'R CMD BATCH'的更好替代品。 – 2009-08-19 12:12:47

+0

你不需要另一种语言。你可以使用像bash这样的shell。任何你想要的。有很多选择。我使用R CMD BATCH,因为它在多个平台上或多或少是通用的。 – 2009-08-19 14:14:44

14

看一下Yihui Xie创建的animation包或者EBImage bioconductor包(?animate)。

+0

有趣的是,我只是看着'animation'软件包的文档,注意到它需要'ImageMagick'来安装。 – cranberry 2015-02-26 09:04:25

7

我想你也可以用caTools库中的write.gif函数来做到这一点。你必须先把你的图形变成一个多帧图像。我不知道该怎么做。任何人? Bueller?

GIF动画的经典例子是这样的代码,我没有写,但我没有blog about前段时间:

library(fields) # for tim.colors 
library(caTools) # for write.gif 
m = 400 # grid size 
C = complex(real=rep(seq(-1.8,0.6, length.out=m), each=m), imag=rep(seq(-1.2,1.2, length.out=m), m)) 
C = matrix(C,m,m) 

Z = 0 
X = array(0, c(m,m,20)) 
for (k in 1:20) { 
Z = Z^2+C 
X[,,k] = exp(-abs(Z)) 
} 

image(X[,,k], col=tim.colors(256)) # show final image in R 
write.gif(X, 'Mandelbrot.gif', col=tim.colors(256), delay=100) 

代码归功于亚雷克Tuszynski,博士学位。

+0

我在最后一行发现错误:“错误:意外输入”write.gif(X,“”“ – Nova 2016-08-03 18:02:12

+1

对于上述错误 - 将代码最后一行中'Mandelbrot.gif'周围的引号改为定期引用标记(即删除它们并在脚本中键入新的引号) – CCID 2016-12-21 08:58:52

0

我已经做了一些使用XNview的(免费图形浏览器)创建幻灯片功能的电影。我想通过空间数据显示时间趋势,所以我只创建了一系列图,按顺序命名[paste()是各种命名calistethics的朋友],然后将它们加载到XNviews幻灯片对话框中,并设置一些计时器变量,瞧。花了5分钟来学习如何做,并产生一些可执行的图形。

0

下面是从HDF5文件制作动画GIF“电影”的完整示例。数据应该是3维数组的HDF数据集[Nframes] [Nrows] [Ncolumns]。

# 
# be sure to be run as Administrator to install new packages 
# 
source("http://bioconductor.org/biocLite.R") 
biocLite("rhdf5") 
install.packages('caTools') 
install.packages('fields') 

library(caTools) 
library(fields) 
library(rhdf5) 

x = h5read(file="mydata.h5",name="/Images") 
write.gif(x,"movie1.gif",col=rainbow,delay=10,flip=TRUE)