Is there an easy way to create a "movie" by stitching together several plots, within R?
7 Answers
Here is one method I found using R help:
To create the individual image frames:
jpeg("/tmp/foo%02d.jpg")
for (i in 1:5) {
my.plot(i)
}
dev.off()
To make the movie, first install ImageMagick. Then call the following function (which calls "convert", part of ImageMagick I suppose):
make.mov <- function(){
unlink("plot.mpg")
system("convert -delay 0.5 plot*.jpg plot.mpg")
}
Or try using the ffmpeg function as described in this article (I've found this gives cleaner results): ffmpeg -r 25 -qscale 2 -i tmp/foo%02d.jpg output.mp4
May require a bit of tinkering, but this seemed pretty simple once everything was installed.
Of course, anywhere you see "jpg" or "jpeg", you can substitute GIF or PNG to suit your fancy.

- 1,746
- 19
- 17

- 5,114
- 9
- 41
- 56
-
2You can even keep jpeg() and dev.off() outside the loop -- if you use an appropriate filename as e.g. jpeg("/tmp/foo%02d.png"), R will simply create new files during your loop. No need for you to compute the filename. Makes it even easier. – Dirk Eddelbuettel Aug 19 '09 at 15:36
-
1You should make Dirk's fix and then accept your own answer. Good solution. – JD Long Aug 19 '09 at 15:47
-
1useful ... but finding it hard to understand where the .mpg file is saved after running the function 'make.mov' in R? I'm working inside R studio on a mac platform. – ToNoY Oct 04 '14 at 04:30
-
3when i run `system("convert -delay 80 *.png example_1.gif")` i get an error `Invalid Parameter - 80`. I specify `ani.options( convert = shQuote('C:/Program Files/ImageMagick-7.0.5-Q16/convert.exe') # convert = shQuote('C:/Windows/System32/convert.exe') )`. Any ideas ? – quant Apr 18 '17 at 12:45
-
link of article does not exist anymore – Mark Mar 29 '19 at 09:46
-
@quant use shell(cmd="convert -delay 80 *.png example_1.gif") – jjunju Feb 02 '20 at 13:27
-
Interesting note, I was just looking at the `animation` package's documentation and noticed that it requires `ImageMagick` to be installed. – cranberry Feb 26 '15 at 09:04
I think you can do this also with the write.gif function in the caTools library. You'd have to get your graph into a multi-frame image first. I'm not sure how to do that. Anyone? Bueller?
The classic example of an animated GIF is this code which I didn't write but I did blog about some time ago:
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)
Code credit goes to Jarek Tuszynski, PhD.

- 59,675
- 58
- 202
- 294
-
I get an error on the last line: "Error: unexpected input in "write.gif(X, “" " – Nova Aug 03 '16 at 18:02
-
1For the above error - change the quote marks around `Mandelbrot.gif` in the last line of the code to regular quote marks (ie delete them and type new quote marks in your script) – CCID Dec 21 '16 at 08:58
If you wrap your R script within a larger Perl/Python/etc. script, you can stitch graphs together with your favorite command-line image stitching tool.
To run your R script with a wrapper script, use the R CMD BATCH
method.

- 95,983
- 54
- 240
- 345
-
2
-
1Well where does require a Perl/Python script? Also, look at Rscript (and littler) as better alternatives to 'R CMD BATCH'. – Dirk Eddelbuettel Aug 19 '09 at 12:12
-
You don't need another language. You can use a shell like bash. Whatever you want. There are lots of options. I use R CMD BATCH because it is more or less universal across platforms. – Alex Reynolds Aug 19 '09 at 14:14
-
I found that it is pretty easy once ImageMagick and ffmpeg are installed. – Ryan R. Rosario Aug 19 '09 at 15:04
I'm not sure it is possible in R. I did a project once when data points from R were exported to a MySQL database and a Flex/Flash application picked up those data points and gave animated visualizations..

- 5,805
- 10
- 50
- 68
-
4You don't need a database. In a loop, save all your images. Then use a command-line tool to stitch them together; imagemagick is one possibility. – Dirk Eddelbuettel Aug 19 '09 at 12:14
-
Yes, this was the easiest way. I guess due to OS modularity, it really isn't possible to do this within R unless R is compiled with a special library or such. – Ryan R. Rosario Aug 19 '09 at 15:07
-
This is a clever technique, Srirangan. I learned many years ago that when someone says 'it's not possible', they mean 'I don't know how to do it'. The clever part of the technique is that in a forum such as SO, someone is bound to tell you how to do it. I'm not being sarcastic, by the way. I REALLY think it's a good technique, and I'm going to try it out. Thanks Srirangan. – pavium Aug 20 '09 at 00:09
-
Sure. But it is still essentially the same thing that I said. R can't do it and you are depending on an external application to do so. I citied the case where I had used Flex/ActionScript, Ryan recommended the the use of ImageMagick but in the end you are dependent on an external app. That was my point. I was nowhere claiming that my way was the only way to do it. ;) – Sri Aug 20 '09 at 03:14
-
I've done some movies using XNview's (freeware graphics viewer) Create Slideshow function. I wanted to show trends through time with spatial data, so I just created a series of plots, named sequentially [paste() is your friend for all sorts of naming calistethics] then loaded them into XNviews slideshow dialogue and set a few timer variables, voila. Took like 5 minutes to learn how to do it and produce some executable graphics.

- 15,977
- 2
- 23
- 25
Here's a full example on making an animated GIF "movie" from an HDF5 file. The data should be an HDF Dataset of a 3 dimensional array [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)

- 19,989
- 5
- 106
- 123