从R中的一系列情节创建电影[关闭]

Posted

技术标签:

【中文标题】从R中的一系列情节创建电影[关闭]【英文标题】:Creating a Movie from a Series of Plots in R [closed] 【发布时间】:2010-11-20 20:25:18 【问题描述】:

有没有一种简单的方法可以通过在 R 中将多个情节拼接在一起来创建“电影”?

【问题讨论】:

【参考方案1】:

我不确定在 R 中是否可行。我曾经做过一个项目,将 R 中的数据点导出到 mysql 数据库,然后 Flex/Flash 应用程序拾取这些数据点并提供动画可视化..

【讨论】:

您不需要数据库。在一个循环中,保存所有图像。然后使用命令行工具将它们拼接在一起; imagemagick 是一种可能性。 是的,这是最简单的方法。我猜由于操作系统的模块化,在 R 中确实不可能做到这一点,除非 R 是用特殊的库等编译的。 这是一个聪明的技巧,Srirangan。多年前我了解到,当有人说“不可能”时,他们的意思是“我不知道该怎么做”。该技术的巧妙之处在于,在诸如 SO 之类的论坛中,一定会有人告诉您如何操作。顺便说一句,我不是在讽刺。我真的认为这是一个很好的技术,我会尝试一下。谢谢斯里兰根。 当然。但这与我所说的基本相同。 R 无法做到这一点,您需要依赖外部应用程序来做到这一点。我举了我使用 Flex/ActionScript 的例子,Ryan 推荐使用 ImageMagick,但最终你依赖于外部应用程序。那是我的观点。我无处声称我的方式是唯一的方法。 ;) 同时调用数据库和 Flash 实在是太过分了!【参考方案2】:

如果您将 R 脚本包装在更大的 Perl/Python/etc 中。脚本,您可以使用您最喜欢的命令行图像拼接工具将图形拼接在一起。

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

【讨论】:

为什么需要另一种语言来使用命令行工具? 那么哪里需要 Perl/Python 脚本?此外,将 Rscript(和更小的)视为 'R CMD BATCH' 的更好替代品。 您不需要其他语言。您可以使用 bash 之类的 shell。无论你想要什么。有很多选择。我使用 R CMD BATCH 因为它或多或少地跨平台通用。 我发现ImageMagick 和 ffmpeg 安装后非常简单。【参考方案3】:

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

【讨论】:

有趣的是,我只是在查看animation 包的文档,发现它需要安装ImageMagick【参考方案4】:

这是我使用 R 帮助找到的一种方法:

创建单个图像帧:

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

dev.off()

要制作电影,首先安装ImageMagick。 然后调用以下函数(它调用“convert”,我想是 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 来代替你的喜好。

【讨论】:

您甚至可以将 jpeg() 和 dev.off() 保留在循环之外——如果您使用适当的文件名,例如jpeg("/tmp/foo%02d.png"), R 只会在循环期间创建新文件。您无需计算文件名。让它变得更容易。 您应该进行 Dirk 的修复,然后接受您自己的答案。很好的解决方案。 有用...但是在 R 中运行函数“make.mov”后发现很难理解 .mpg 文件的保存位置?我在 Mac 平台上的 R studio 中工作。 当我运行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') )。有什么想法吗? 文章链接不存在【参考方案5】:

我认为您也可以使用 caTools 库中的 write.gif 函数来执行此操作。您必须首先将您的图表转换为多帧图像。我不知道该怎么做。任何人?布勒?

动画 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)

代码归功于 Jarek Tuszynski 博士。

【讨论】:

我在最后一行得到一个错误:“错误:“write.gif(X, “” "中的意外输入 对于上述错误 - 将代码最后一行 Mandelbrot.gif 周围的引号更改为常规引号(即删除它们并在脚本中键入新引号)【参考方案6】:

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

【讨论】:

【参考方案7】:

这里是一个完整的例子,关于从 HDF5 文件制作动画 GIF “电影”。数据应该是 3 维数组 [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)

【讨论】:

以上是关于从R中的一系列情节创建电影[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

根据 R 中的一系列分类变量重新编码数值变量

Rg中的ggplot和基本情节有什么区别? [关闭]

如何遍历R中文件夹中的一系列顺序文件

书中的阿甘和电影中的阿甘

如何删除/替换字符串列中的一系列特殊字符? [关闭]

渐变色ggplot2 R中的一条线