Just a short post, to share some codes used to generate animated graphs, with R. Assume that we would like to illustrate the law of large number, and the convergence of the average value from binomial sample. We can generate samples using
> n=200 > k=1000 > set.seed(1) > X=matrix(sample(0:1,size=n*k,replace=TRUE),n,k)
Each row will be a trajectory of heads and tails. For each trajectory, define the mean , which will denote the mean of the first values. Such a matrix can be computed using
> cummean=function(M){ + U=matrix(M[,1],nrow(M),1) + for(i in 2:ncol(M)){ + U=cbind(U,(U[,i-1]*(i-1)+M[,i])/i)} + return(U) + }
Define then
> Xbar=cummean(X)
Now, to generate an animated gif, the way I usually do it is to generate graphs (png graphs) using a loop,
> S=trunc(10^seq(1,3,by=.05)) > for(j in 1:length(S)){ + s=S[j] + Xhist=hist(Xbar[,s],breaks=seq(0,1,by=.05),plot=FALSE) + nfile=paste("LLN-",100+j,".png",sep="") + png(nfile,600,350) + layout(matrix(c(3,0,1,2),2,2,byrow=TRUE), c(3,1), c(1,3), TRUE) + plot(1:s,Xbar[1,1:s],type="l",col="light blue",ylim=0:1,xlab="",ylab="",axes=FALSE, + xlim=c(10,k),log="x") + axis(1) + axis(2) + for(i in 2:(n-1)) lines(1:s,Xbar[i,1:s],col="light blue") + lines(1:s,Xbar[n,1:s],col="red",lwd=2) + abline(v=s) + barplot(Xhist$counts, axes=TRUE,horiz=TRUE,col="light green",xlim=c(0,n/2*1.05)) + dev.off() + }
I start at 100 because afterwards, when merging files, it is better to have (really) consecutive numbers, since sometimes, the lexical order is used, i.e. after 1 is 10, then 100, etc. Then I use Terminal commands
Here, the delay is in /100 seconds, and I use an infinite loop. The graph is here
It is possible to use
> library(animation) > ani.options(interval=.15) > saveGIF({ })
But the loop can be used also to generate several graphs, and to produce an animated graph in a pdf document (slides or lecture notes). The idea is to use the same code, but the output is here a pdf graph.
> S=trunc(10^seq(1,3,by=.1)) > for(j in 1:length(S)){ + s=S[j] + Xhist=hist(Xbar[,s],breaks=seq(0,1,by=.05),plot=FALSE) + nfile=paste("LLN-",j,".pdf",sep="") + pdf(nfile,10,6) + layout(matrix(c(3,0,1,2),2,2,byrow=TRUE), c(3,1), c(1,3), TRUE) + plot(1:s,Xbar[1,1:s],type="l",col="light blue",ylim=0:1,xlab="",ylab="",axes=FALSE, + xlim=c(10,k),log="x") + axis(1) + axis(2) + for(i in 2:(n-1)) lines(1:s,Xbar[i,1:s],col="light blue") + lines(1:s,Xbar[n,1:s],col="red",lwd=2) + abline(v=s) + barplot(Xhist$counts, axes=TRUE,horiz=TRUE,col="light green",xlim=c(0,n/2*1.05)) + dev.off() + }
We can then import them in LaTeX,
\documentclass[a4]{article} \usepackage{graphicx} \usepackage{animate} \begin{document} \begin{center} \animategraphics[height=3.1in,palindrome]{1}{/Users/UQAM/LLN-}{1}{21} \end{center} \end{document}
This will generate the following pdf file. This animate package is described in several forums, e.g. http://www.geogebra.org/…
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (May 3, 2013). Animation, from R to LaTeX. Freakonometrics. Retrieved September 19, 2024 from https://doi.org/10.58079/ouq8
Dude, this rocks. I salute you.
I am at this very minute producing an animation for a talk tomorrow in gif. I don’t really have time to re-run it to make a pdf but I will definitely do this next time I have a talk to do.
thanks… but it looks like (as always) that it is possible to write much more efficient codes, see http://trinkerrstuff.wordpress.com/2013/05/11/animations-understood-5/
I use this (animation in pdf) in my presentations all the time. It’s brilliant and very very reliable. Do note that it seems to work only in Adobe reader.
yes, I noticed that too. But it is awesome, I agree
You could use ‘sprintf(“%03d”,j)’ instead of ‘100+j’
thanks for the tip !
Une méthode qui comble un vide dans mes connaissances (malgré que je me sois posé la question), comme si souvent sur ton blog. Merci pour cet article et pour beaucoup d’autres 😉