用R语言将一系列情节制作成电影

54

有没有一种简单的方法在R语言中将多个图表拼接成一个“电影”?

7个回答

42

我找到了一个使用R帮助的方法:

创建单独的图像框架:

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

要制作电影,首先要安装ImageMagick。 然后调用以下函数(该函数调用 ImageMagick 的“convert”命令):

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

或者尝试使用本文章中描述的ffmpeg函数(我发现这会给出更干净的结果):

ffmpeg -r 25 -qscale 2 -i tmp/foo%02d.jpg output.mp4

可能需要一些调整,但是在安装了所有必要组件后,这看起来相当简单。

当然,你可以根据自己的喜好将任何“jpg”或“jpeg”替换为GIF或PNG。


2
你甚至可以将jpeg()和dev.off()放在循环外面 - 如果你使用一个适当的文件名,例如 jpeg("/tmp/foo%02d.png"),R将在循环期间自动创建新文件,无需计算文件名。这使得操作更加简单。 - Dirk Eddelbuettel
1
你应该采纳 Dirk 的修复建议,然后接受你自己的答案。这是一个好的解决方案。 - JD Long
1
你觉得函数'make.mov'在R中运行后,很有用...但是很难理解.mp4文件保存在哪里?我正在Mac平台上的R Studio中工作。 - ToNoY
3
当我运行 system("convert -delay 80 *.png example_1.gif") 时,出现了错误 Invalid Parameter - 80。我指定了 `ani.options( convert = shQuote('C:/Program Files/ImageMagick-7.0.5-Q16/convert.exe')

convert = shQuote('C:/Windows/System32/convert.exe')

)`。有什么想法吗?
- quant
文章链接已经不存在。 - Mark
@quant 使用 shell(cmd="convert -delay 80 *.png example_1.gif") - jjunju

15

有趣的一点是,我刚刚在看animation软件包的文档,并注意到它需要安装ImageMagick - cranberry

12

我认为你也可以使用caTools库中的write.gif函数来完成此操作。你需要先将你的图形转换成多帧图像。我不确定如何做到这一点。有人知道吗?

动画GIF的经典示例是这个代码,我没有编写,但我之前博客过:

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)

代码版权归Jarek Tuszynski博士所有。


我在最后一行遇到了一个错误:“Error: unexpected input in "write.gif(X, “"”。 - Nova
1
针对上述错误 - 更改代码最后一行中 Mandelbrot.gif 周围的引号为普通引号(即删除它们并在脚本中键入新的引号)。 - CCID

1
如果您将R脚本包含在更大的Perl/Python等脚本中,您可以使用喜爱的命令行图像拼接工具将图形拼接在一起。
要使用包装器脚本运行您的R脚本,请使用R CMD BATCH方法。

2
为什么需要另一种语言来使用命令行工具? - hadley
1
那么,什么情况下需要使用Perl/Python脚本呢?此外,可以考虑使用Rscript(和littler)作为“R CMD BATCH”的更好替代品。 - Dirk Eddelbuettel
您不需要另一种语言。您可以使用像bash这样的shell。任何您想要的。有很多选择。我使用R CMD BATCH,因为它在各个平台上都是通用的。 - Alex Reynolds
我发现一旦安装了ImageMagick和ffmpeg,这就相当容易了。 - Ryan R. Rosario

0
这是一个完整的示例,演示如何从HDF5文件中制作动画GIF“电影”。数据应该是一个三维数组[Nframes][Nrows][Ncolumns]的HDF数据集。
#
# 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)

0

我不确定在R中是否可能。我曾经做过一个项目,将来自R的数据点导出到MySQL数据库中,然后Flex/Flash应用程序接收这些数据点并提供动画可视化效果。


4
不需要数据库。在循环中保存所有图片。然后使用命令行工具将它们拼接在一起,ImageMagick 是一个可能的选择。 - Dirk Eddelbuettel
是的,这是最简单的方法。我猜由于操作系统的模块化,除非使用特殊库编译R,否则无法在R内部执行此操作。 - Ryan R. Rosario
这是一个聪明的技巧,Srirangan。 许多年前我学到了当有人说“不可能”的时候,他们实际上是指“我不知道如何做到它”。 这个技巧的巧妙之处在于,在如 Stack Overflow 这样的论坛中,总会有人告诉你如何去做。 顺便说一下,我并不是在挖苦,我真的认为这是一个很好的技巧,我打算试试看。谢谢 Srirangan。 - pavium
当然。但本质上来说,这和我说的一样。R无法做到这一点,你需要依赖外部应用程序来完成。我引用了我使用Flex/ActionScript的案例,Ryan建议使用ImageMagick,但最终你仍然依赖于外部应用程序。这就是我的观点。我从未声称我的方法是唯一的方式。;) - Sri
调用数据库和Flash是双重杀手! - Rodrigo

0
我使用免费的图形浏览器XNview的创建幻灯片功能做了一些电影。 我想通过时空数据显示趋势,因此我只是创建了一系列情节,并按顺序命名[paste()是所有命名风格的好朋友],然后将它们加载到 XNviews 幻灯片对话框中并设置了一些计时器变量,就这样。 学会如何做和生成一些可执行的图形只需要大约5分钟。

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