Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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
> n=200 > k=1000 > set.seed(1) > X=matrix(sample(0:1,size=n*k,replace=TRUE),n,k)
Each row
> 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/…
Arthur Charpentier
Arthur Charpentier, professor in Montréal, in Actuarial Science. Former professor-assistant at ENSAE Paristech, associate professor at Ecole Polytechnique and assistant professor in Economics at Université de Rennes 1. Graduated from ENSAE, Master in Mathematical Economics (Paris Dauphine), PhD in Mathematics (KU Leuven), and Fellow of the French Institute of Actuaries.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.