有没有一种简单的方法可以通过在 R 中将多个图拼接在一起来创建“电影”?
7 回答
这是我使用 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")
}
或者尝试使用本文中描述的 ffmpeg 函数(我发现这会产生更清晰的结果): ffmpeg -r 25 -qscale 2 -i tmp/foo%02d.jpg output.mp4
可能需要一些修补,但是一旦安装了所有东西,这似乎很简单。
当然,在任何您看到“jpg”或“jpeg”的地方,您都可以替换为 GIF 或 PNG 以适合您的喜好。
看看由Yihui Xie创建的动画包或EBImage 生物导体包 (?animate)。
我认为您也可以使用 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 博士。
如果您将 R 脚本包装在更大的 Perl/Python/etc 中。脚本,您可以将图形与您最喜欢的命令行图像拼接工具拼接在一起。
要使用包装脚本运行 R 脚本,请使用该R CMD BATCH
方法。
我不确定在 R 中是否可行。我曾经做过一个项目,将 R 中的数据点导出到 MySQL 数据库,然后 Flex/Flash 应用程序拾取这些数据点并提供动画可视化。
我使用 XNview(免费图形查看器)创建幻灯片功能制作了一些电影。我想用空间数据显示随时间变化的趋势,所以我只是创建了一系列图,按顺序命名 [paste() 是你各种命名 calistethics 的朋友] 然后将它们加载到 XNviews 幻灯片对话框中并设置一些计时器变量,瞧。花了大约 5 分钟来学习如何做到这一点并生成一些可执行的图形。
这是从 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)