Dear All,
I'd like to know if it is possible to create animations with R.
To be specific, I attach a code I am using for my research to plot
some analytical results in 3D using the lattice package. It is not
necessary to go through the code.
Simply, it plots some 3D density profiles at two different times
selected by the user.
I wonder if it is possible to use the data generated for different
times to create something like an .avi file.
Here is the script:
rm(list=ls())
library(lattice)
# I start defining the analytical functions needed to get the density
as a function of time
expect_position <- function(t,lam1,lam2,pos_ini,vel_ini)
{1/(lam1-lam2)*(lam1*exp(lam2*t)-lam2*exp(lam1*t))*pos_ini+
1/(lam1-lam2)*(exp(lam1*t)-exp(lam2*t))*vel_ini
}
sigma_pos<-function(t,q,lam1,lam2)
{
q/(lam1-lam2)^2*(
(exp(2*lam1*t)-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*t+lam2*t)-1) +
(exp(2*lam2*t)-1)/(2*lam2) )
}
rho_x<-function(x,expect_position,sigma_pos)
{
1/sqrt(2*pi*sigma_pos)*exp(-1/2*(x-expect_position)^2/sigma_pos)
}
#### Now the physical parameters
tau<-0.1
beta<-1/tau
St<-tau ### since I am in dimensionless units and tau is already in
units of 1/|alpha|
D=2e-2
q<-2*beta^2*D
############### Now the grid in space and time
time<-5 # time extent
tsteps<-501 # time steps
newtime<-seq(0,time,len=tsteps)
#### Now the things specific for the dynamics along x
lam1<- -beta/2*(1+sqrt(1+4*St))
lam2<- -beta/2*(1-sqrt(1+4*St))
xmin<- -0.5
xmax<-0.5
x0<-0.1
vx0<-x0
nx<-101 ## grid intervals along x
newx<-seq(xmin,xmax,len=nx) # grid along x
# M1 <- do.call("g", c(list(x = newx), mypar))
mypar<-c(q,lam1,lam2)
sig_xx<-do.call("sigma_pos",c(list(t=newtime),mypar))
mypar<-c(lam1,lam2,x0,vx0)
exp_x<-do.call("expect_position",c(list(t=newtime),mypar))
#rho_x<-function(x,expect_position,sigma_pos)
#NB: at t=0, the density blows up, since I have a delta as the initial state!
# At any t>0, instead, the result is finite.
#for this reason I now redefine time by getting rid of the istant t=0
to work out
# the density
rho_x_t<-matrix(ncol=nx,nrow=tsteps-1)
for (i in 2:tsteps)
{mypar<-c(exp_x[i],sig_xx[i])
myrho_x<-do.call("rho_x",c(list(x=newx),mypar))
rho_x_t[ i-1, ]<-myrho_x
}
### Now I also define a scaled density
rho_x_t_scaled<-matrix(ncol=nx,nrow=tsteps-1)
for (i in 2:tsteps)
{mypar<-c(exp_x[i],sig_xx[i])
myrho_x<-do.call("rho_x",c(list(x=newx),mypar))
rho_x_t_scaled[ i-1, ]<-myrho_x/max(myrho_x)
}
###########Now I deal with the dynamics along y
lam1<- -beta/2*(1+sqrt(1-4*St))
lam2<- -beta/2*(1-sqrt(1-4*St))
ymin<- 0
ymax<- 1
y0<-ymax
vy0<- -y0
mypar<-c(q,lam1,lam2)
sig_yy<-do.call("sigma_pos",c(list(t=newtime),mypar))
mypar<-c(lam1,lam2,y0,vy0)
exp_y<-do.call("expect_position",c(list(t=newtime),mypar))
# now I introduce the function giving the density along y: this has to
include the BC of zero
# density at wall
rho_y<-function(y,expect_position,sigma_pos)
{
1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y-expect_position)^2/sigma_pos)-
1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y+expect_position)^2/sigma_pos)
}
newy<-seq(ymin,ymax,len=nx) # grid along y with the same # of points
as the one along x
rho_y_t<-matrix(ncol=nx,nrow=tsteps-1)
for (i in 2:tsteps)
{mypar<-c(exp_y[i],sig_yy[i])
myrho_y<-do.call("rho_y",c(list(y=newy),mypar))
rho_y_t[ i-1, ]<-myrho_y
}
rho_y_t_scaled<-matrix(ncol=nx,nrow=tsteps-1)
for (i in 2:tsteps)
{mypar<-c(exp_y[i],sig_yy[i])
myrho_y<-do.call("rho_y",c(list(y=newy),mypar))
rho_y_t_scaled[ i-1, ]<-myrho_y/max(myrho_y)
}
# The following 2 plots are an example of the plots I'd like to use to
make an animation
g <- expand.grid(x = newx, y = newy)
instant<-100
mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[
instant, ]%o%rho_y_t[ instant, ]))
lentot<-nx^2
dim(mydens)<-c(lentot,1)
g$z<-mydens
jpeg("dens-t-3.jpeg")
print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE,
scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey = TRUE
,zoom=0.8, main=expression("Density at t=2"), zlab
list(expression("density"),rot = 90),distance=0.0,
perspective=TRUE,#screen = list(z = 150, x = -55,y= 0)
,zlim=range(c(0,1))))
dev.off()
instant<-300
mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[
instant, ]%o%rho_y_t[ instant, ]))
lentot<-nx^2
dim(mydens)<-c(lentot,1)
g$z<-mydens
jpeg("dens-t-3.jpeg")
print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE,
scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey = TRUE
,zoom=0.8, main=expression("Density at t=3"), zlab
list(expression("density"),rot = 90),distance=0.0,
perspective=TRUE,#screen = list(z = 150, x = -55,y= 0)
,zlim=range(c(0,1))))
dev.off()
Kind Regards
Lorenzo
You can make animated gifs using the write.gif function in the caTools package. On 22/09/06, Lorenzo Isella <lorenzo.isella at gmail.com> wrote:> Dear All, > > I'd like to know if it is possible to create animations with R. > To be specific, I attach a code I am using for my research to plot > some analytical results in 3D using the lattice package. It is not > necessary to go through the code. > Simply, it plots some 3D density profiles at two different times > selected by the user. > I wonder if it is possible to use the data generated for different > times to create something like an .avi file. > > Here is the script: > > rm(list=ls()) > library(lattice) > > # I start defining the analytical functions needed to get the density > as a function of time > > expect_position <- function(t,lam1,lam2,pos_ini,vel_ini) > {1/(lam1-lam2)*(lam1*exp(lam2*t)-lam2*exp(lam1*t))*pos_ini+ > 1/(lam1-lam2)*(exp(lam1*t)-exp(lam2*t))*vel_ini > } > > sigma_pos<-function(t,q,lam1,lam2) > { > q/(lam1-lam2)^2*( > (exp(2*lam1*t)-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*t+lam2*t)-1) + > (exp(2*lam2*t)-1)/(2*lam2) ) > } > > rho_x<-function(x,expect_position,sigma_pos) > { > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(x-expect_position)^2/sigma_pos) > } > > #### Now the physical parameters > tau<-0.1 > beta<-1/tau > St<-tau ### since I am in dimensionless units and tau is already in > units of 1/|alpha| > D=2e-2 > q<-2*beta^2*D > ############### Now the grid in space and time > time<-5 # time extent > tsteps<-501 # time steps > newtime<-seq(0,time,len=tsteps) > #### Now the things specific for the dynamics along x > lam1<- -beta/2*(1+sqrt(1+4*St)) > lam2<- -beta/2*(1-sqrt(1+4*St)) > xmin<- -0.5 > xmax<-0.5 > x0<-0.1 > vx0<-x0 > nx<-101 ## grid intervals along x > newx<-seq(xmin,xmax,len=nx) # grid along x > > # M1 <- do.call("g", c(list(x = newx), mypar)) > > > mypar<-c(q,lam1,lam2) > sig_xx<-do.call("sigma_pos",c(list(t=newtime),mypar)) > mypar<-c(lam1,lam2,x0,vx0) > exp_x<-do.call("expect_position",c(list(t=newtime),mypar)) > > #rho_x<-function(x,expect_position,sigma_pos) > > #NB: at t=0, the density blows up, since I have a delta as the initial state! > # At any t>0, instead, the result is finite. > #for this reason I now redefine time by getting rid of the istant t=0 > to work out > # the density > > > rho_x_t<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_x[i],sig_xx[i]) > myrho_x<-do.call("rho_x",c(list(x=newx),mypar)) > rho_x_t[ i-1, ]<-myrho_x > } > > ### Now I also define a scaled density > > rho_x_t_scaled<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_x[i],sig_xx[i]) > myrho_x<-do.call("rho_x",c(list(x=newx),mypar)) > rho_x_t_scaled[ i-1, ]<-myrho_x/max(myrho_x) > } > > ###########Now I deal with the dynamics along y > > lam1<- -beta/2*(1+sqrt(1-4*St)) > lam2<- -beta/2*(1-sqrt(1-4*St)) > ymin<- 0 > ymax<- 1 > y0<-ymax > vy0<- -y0 > > mypar<-c(q,lam1,lam2) > sig_yy<-do.call("sigma_pos",c(list(t=newtime),mypar)) > mypar<-c(lam1,lam2,y0,vy0) > exp_y<-do.call("expect_position",c(list(t=newtime),mypar)) > > > # now I introduce the function giving the density along y: this has to > include the BC of zero > # density at wall > > rho_y<-function(y,expect_position,sigma_pos) > { > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y-expect_position)^2/sigma_pos)- > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y+expect_position)^2/sigma_pos) > } > > newy<-seq(ymin,ymax,len=nx) # grid along y with the same # of points > as the one along x > > > rho_y_t<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_y[i],sig_yy[i]) > myrho_y<-do.call("rho_y",c(list(y=newy),mypar)) > rho_y_t[ i-1, ]<-myrho_y > } > > rho_y_t_scaled<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_y[i],sig_yy[i]) > myrho_y<-do.call("rho_y",c(list(y=newy),mypar)) > rho_y_t_scaled[ i-1, ]<-myrho_y/max(myrho_y) > } > > > # The following 2 plots are an example of the plots I'd like to use to > make an animation > > > g <- expand.grid(x = newx, y = newy) > > instant<-100 > mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[ > instant, ]%o%rho_y_t[ instant, ])) > > > lentot<-nx^2 > dim(mydens)<-c(lentot,1) > > g$z<-mydens > jpeg("dens-t-3.jpeg") > print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE, > scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey = TRUE > ,zoom=0.8, main=expression("Density at t=2"), zlab > list(expression("density"),rot = 90),distance=0.0, > perspective=TRUE,#screen = list(z = 150, x = -55,y= 0) > ,zlim=range(c(0,1)))) > dev.off() > > > instant<-300 > mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[ > instant, ]%o%rho_y_t[ instant, ])) > > > lentot<-nx^2 > dim(mydens)<-c(lentot,1) > > g$z<-mydens > jpeg("dens-t-3.jpeg") > print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE, > scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey = TRUE > ,zoom=0.8, main=expression("Density at t=3"), zlab > list(expression("density"),rot = 90),distance=0.0, > perspective=TRUE,#screen = list(z = 150, x = -55,y= 0) > ,zlim=range(c(0,1)))) > dev.off() > > > > > Kind Regards > > Lorenzo > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- ================================David Barron Said Business School University of Oxford Park End Street Oxford OX1 1HP
On 9/22/2006 3:23 AM, Lorenzo Isella wrote:> Dear All, > > I'd like to know if it is possible to create animations with R. > To be specific, I attach a code I am using for my research to plot > some analytical results in 3D using the lattice package. It is not > necessary to go through the code. > Simply, it plots some 3D density profiles at two different times > selected by the user. > I wonder if it is possible to use the data generated for different > times to create something like an .avi file.There's an example of an animation in the rgl package (see ?rgl.snapshot); it needs ImageMagick to put the frames together. It supports GIF; I think it also supports MPEG and maybe some other animated formats. Duncan Murdoch> > Here is the script: > > rm(list=ls()) > library(lattice) > > # I start defining the analytical functions needed to get the density > as a function of time > > expect_position <- function(t,lam1,lam2,pos_ini,vel_ini) > {1/(lam1-lam2)*(lam1*exp(lam2*t)-lam2*exp(lam1*t))*pos_ini+ > 1/(lam1-lam2)*(exp(lam1*t)-exp(lam2*t))*vel_ini > } > > sigma_pos<-function(t,q,lam1,lam2) > { > q/(lam1-lam2)^2*( > (exp(2*lam1*t)-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*t+lam2*t)-1) + > (exp(2*lam2*t)-1)/(2*lam2) ) > } > > rho_x<-function(x,expect_position,sigma_pos) > { > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(x-expect_position)^2/sigma_pos) > } > > #### Now the physical parameters > tau<-0.1 > beta<-1/tau > St<-tau ### since I am in dimensionless units and tau is already in > units of 1/|alpha| > D=2e-2 > q<-2*beta^2*D > ############### Now the grid in space and time > time<-5 # time extent > tsteps<-501 # time steps > newtime<-seq(0,time,len=tsteps) > #### Now the things specific for the dynamics along x > lam1<- -beta/2*(1+sqrt(1+4*St)) > lam2<- -beta/2*(1-sqrt(1+4*St)) > xmin<- -0.5 > xmax<-0.5 > x0<-0.1 > vx0<-x0 > nx<-101 ## grid intervals along x > newx<-seq(xmin,xmax,len=nx) # grid along x > > # M1 <- do.call("g", c(list(x = newx), mypar)) > > > mypar<-c(q,lam1,lam2) > sig_xx<-do.call("sigma_pos",c(list(t=newtime),mypar)) > mypar<-c(lam1,lam2,x0,vx0) > exp_x<-do.call("expect_position",c(list(t=newtime),mypar)) > > #rho_x<-function(x,expect_position,sigma_pos) > > #NB: at t=0, the density blows up, since I have a delta as the initial state! > # At any t>0, instead, the result is finite. > #for this reason I now redefine time by getting rid of the istant t=0 > to work out > # the density > > > rho_x_t<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_x[i],sig_xx[i]) > myrho_x<-do.call("rho_x",c(list(x=newx),mypar)) > rho_x_t[ i-1, ]<-myrho_x > } > > ### Now I also define a scaled density > > rho_x_t_scaled<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_x[i],sig_xx[i]) > myrho_x<-do.call("rho_x",c(list(x=newx),mypar)) > rho_x_t_scaled[ i-1, ]<-myrho_x/max(myrho_x) > } > > ###########Now I deal with the dynamics along y > > lam1<- -beta/2*(1+sqrt(1-4*St)) > lam2<- -beta/2*(1-sqrt(1-4*St)) > ymin<- 0 > ymax<- 1 > y0<-ymax > vy0<- -y0 > > mypar<-c(q,lam1,lam2) > sig_yy<-do.call("sigma_pos",c(list(t=newtime),mypar)) > mypar<-c(lam1,lam2,y0,vy0) > exp_y<-do.call("expect_position",c(list(t=newtime),mypar)) > > > # now I introduce the function giving the density along y: this has to > include the BC of zero > # density at wall > > rho_y<-function(y,expect_position,sigma_pos) > { > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y-expect_position)^2/sigma_pos)- > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y+expect_position)^2/sigma_pos) > } > > newy<-seq(ymin,ymax,len=nx) # grid along y with the same # of points > as the one along x > > > rho_y_t<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_y[i],sig_yy[i]) > myrho_y<-do.call("rho_y",c(list(y=newy),mypar)) > rho_y_t[ i-1, ]<-myrho_y > } > > rho_y_t_scaled<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_y[i],sig_yy[i]) > myrho_y<-do.call("rho_y",c(list(y=newy),mypar)) > rho_y_t_scaled[ i-1, ]<-myrho_y/max(myrho_y) > } > > > # The following 2 plots are an example of the plots I'd like to use to > make an animation > > > g <- expand.grid(x = newx, y = newy) > > instant<-100 > mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[ > instant, ]%o%rho_y_t[ instant, ])) > > > lentot<-nx^2 > dim(mydens)<-c(lentot,1) > > g$z<-mydens > jpeg("dens-t-3.jpeg") > print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE, > scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey = TRUE > ,zoom=0.8, main=expression("Density at t=2"), zlab > list(expression("density"),rot = 90),distance=0.0, > perspective=TRUE,#screen = list(z = 150, x = -55,y= 0) > ,zlim=range(c(0,1)))) > dev.off() > > > instant<-300 > mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[ > instant, ]%o%rho_y_t[ instant, ])) > > > lentot<-nx^2 > dim(mydens)<-c(lentot,1) > > g$z<-mydens > jpeg("dens-t-3.jpeg") > print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE, > scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey = TRUE > ,zoom=0.8, main=expression("Density at t=3"), zlab > list(expression("density"),rot = 90),distance=0.0, > perspective=TRUE,#screen = list(z = 150, x = -55,y= 0) > ,zlim=range(c(0,1)))) > dev.off() > > > > > Kind Regards > > Lorenzo > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
There is also a write.gif function in package caTools. See the example there. Best, Matthias> > Dear All, > > I'd like to know if it is possible to create animations with R. > To be specific, I attach a code I am using for my research to > plot some analytical results in 3D using the lattice package. > It is not necessary to go through the code. > Simply, it plots some 3D density profiles at two different > times selected by the user. > I wonder if it is possible to use the data generated for > different times to create something like an .avi file. > > Here is the script: > > rm(list=ls()) > library(lattice) > > # I start defining the analytical functions needed to get the > density as a function of time > > expect_position <- function(t,lam1,lam2,pos_ini,vel_ini) > {1/(lam1-lam2)*(lam1*exp(lam2*t)-lam2*exp(lam1*t))*pos_ini+ > 1/(lam1-lam2)*(exp(lam1*t)-exp(lam2*t))*vel_ini > } > > sigma_pos<-function(t,q,lam1,lam2) > { > q/(lam1-lam2)^2*( > (exp(2*lam1*t)-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*t+lam2*t)-1) + > (exp(2*lam2*t)-1)/(2*lam2) ) > } > > rho_x<-function(x,expect_position,sigma_pos) > { > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(x-expect_position)^2/sigma_pos) > } > > #### Now the physical parameters > tau<-0.1 > beta<-1/tau > St<-tau ### since I am in dimensionless units and tau is > already in units of 1/|alpha| > D=2e-2 > q<-2*beta^2*D > ############### Now the grid in space and time > time<-5 # time extent > tsteps<-501 # time steps > newtime<-seq(0,time,len=tsteps) > #### Now the things specific for the dynamics along x > lam1<- -beta/2*(1+sqrt(1+4*St)) > lam2<- -beta/2*(1-sqrt(1+4*St)) > xmin<- -0.5 > xmax<-0.5 > x0<-0.1 > vx0<-x0 > nx<-101 ## grid intervals along x > newx<-seq(xmin,xmax,len=nx) # grid along x > > # M1 <- do.call("g", c(list(x = newx), mypar)) > > > mypar<-c(q,lam1,lam2) > sig_xx<-do.call("sigma_pos",c(list(t=newtime),mypar)) > mypar<-c(lam1,lam2,x0,vx0) > exp_x<-do.call("expect_position",c(list(t=newtime),mypar)) > > #rho_x<-function(x,expect_position,sigma_pos) > > #NB: at t=0, the density blows up, since I have a delta as > the initial state! > # At any t>0, instead, the result is finite. > #for this reason I now redefine time by getting rid of the > istant t=0 to work out # the density > > > rho_x_t<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_x[i],sig_xx[i]) > myrho_x<-do.call("rho_x",c(list(x=newx),mypar)) > rho_x_t[ i-1, ]<-myrho_x > } > > ### Now I also define a scaled density > > rho_x_t_scaled<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_x[i],sig_xx[i]) > myrho_x<-do.call("rho_x",c(list(x=newx),mypar)) > rho_x_t_scaled[ i-1, ]<-myrho_x/max(myrho_x) } > > ###########Now I deal with the dynamics along y > > lam1<- -beta/2*(1+sqrt(1-4*St)) > lam2<- -beta/2*(1-sqrt(1-4*St)) > ymin<- 0 > ymax<- 1 > y0<-ymax > vy0<- -y0 > > mypar<-c(q,lam1,lam2) > sig_yy<-do.call("sigma_pos",c(list(t=newtime),mypar)) > mypar<-c(lam1,lam2,y0,vy0) > exp_y<-do.call("expect_position",c(list(t=newtime),mypar)) > > > # now I introduce the function giving the density along y: > this has to include the BC of zero # density at wall > > rho_y<-function(y,expect_position,sigma_pos) > { > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y-expect_position)^2/sigma_pos)- > 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y+expect_position)^2/sigma_pos) > } > > newy<-seq(ymin,ymax,len=nx) # grid along y with the same # of > points as the one along x > > > rho_y_t<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_y[i],sig_yy[i]) > myrho_y<-do.call("rho_y",c(list(y=newy),mypar)) > rho_y_t[ i-1, ]<-myrho_y > } > > rho_y_t_scaled<-matrix(ncol=nx,nrow=tsteps-1) > for (i in 2:tsteps) > {mypar<-c(exp_y[i],sig_yy[i]) > myrho_y<-do.call("rho_y",c(list(y=newy),mypar)) > rho_y_t_scaled[ i-1, ]<-myrho_y/max(myrho_y) } > > > # The following 2 plots are an example of the plots I'd like > to use to make an animation > > > g <- expand.grid(x = newx, y = newy) > > instant<-100 > mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, > ]/(max(rho_x_t[ instant, ]%o%rho_y_t[ instant, ])) > > > lentot<-nx^2 > dim(mydens)<-c(lentot,1) > > g$z<-mydens > jpeg("dens-t-3.jpeg") > print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE, scales > = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), > colorkey = TRUE ,zoom=0.8, main=expression("Density at t=2"), > zlab = list(expression("density"),rot = 90),distance=0.0, > perspective=TRUE,#screen = list(z = 150, x = -55,y= 0) > ,zlim=range(c(0,1)))) > dev.off() > > > instant<-300 > mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, > ]/(max(rho_x_t[ instant, ]%o%rho_y_t[ instant, ])) > > > lentot<-nx^2 > dim(mydens)<-c(lentot,1) > > g$z<-mydens > jpeg("dens-t-3.jpeg") > print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE, scales > = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), > colorkey = TRUE ,zoom=0.8, main=expression("Density at t=3"), > zlab = list(expression("density"),rot = 90),distance=0.0, > perspective=TRUE,#screen = list(z = 150, x = -55,y= 0) > ,zlim=range(c(0,1)))) > dev.off() > > > > > Kind Regards > > Lorenzo > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
If you run R on Linux, then you can run the ImageMagick command called
convert. I place this in an R function to use a sequence of PNG plots as
movie frames:
make.mov.plotcol3d <- function(){
unlink("plotcol3d.mpg")
system("convert -delay 10 plotcol3d*.png plotcol3d.mpg")
}
Examples can be seen here:
http://biostat.mc.vanderbilt.edu/JrhRgbColorSpace
Look for the 'Download Movie' links.
Cheers,
Jeff
Lorenzo Isella wrote:> Dear All,
>
> I'd like to know if it is possible to create animations with R.
> To be specific, I attach a code I am using for my research to plot
> some analytical results in 3D using the lattice package. It is not
> necessary to go through the code.
> Simply, it plots some 3D density profiles at two different times
> selected by the user.
> I wonder if it is possible to use the data generated for different
> times to create something like an .avi file.
>
> Here is the script:
>
> rm(list=ls())
> library(lattice)
>
> # I start defining the analytical functions needed to get the density
> as a function of time
>
> expect_position <- function(t,lam1,lam2,pos_ini,vel_ini)
> {1/(lam1-lam2)*(lam1*exp(lam2*t)-lam2*exp(lam1*t))*pos_ini+
> 1/(lam1-lam2)*(exp(lam1*t)-exp(lam2*t))*vel_ini
> }
>
> sigma_pos<-function(t,q,lam1,lam2)
> {
> q/(lam1-lam2)^2*(
> (exp(2*lam1*t)-1)/(2*lam1)-2/(lam1+lam2)*(exp(lam1*t+lam2*t)-1) +
> (exp(2*lam2*t)-1)/(2*lam2) )
> }
>
> rho_x<-function(x,expect_position,sigma_pos)
> {
> 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(x-expect_position)^2/sigma_pos)
> }
>
> #### Now the physical parameters
> tau<-0.1
> beta<-1/tau
> St<-tau ### since I am in dimensionless units and tau is already in
> units of 1/|alpha|
> D=2e-2
> q<-2*beta^2*D
> ############### Now the grid in space and time
> time<-5 # time extent
> tsteps<-501 # time steps
> newtime<-seq(0,time,len=tsteps)
> #### Now the things specific for the dynamics along x
> lam1<- -beta/2*(1+sqrt(1+4*St))
> lam2<- -beta/2*(1-sqrt(1+4*St))
> xmin<- -0.5
> xmax<-0.5
> x0<-0.1
> vx0<-x0
> nx<-101 ## grid intervals along x
> newx<-seq(xmin,xmax,len=nx) # grid along x
>
> # M1 <- do.call("g", c(list(x = newx), mypar))
>
>
> mypar<-c(q,lam1,lam2)
> sig_xx<-do.call("sigma_pos",c(list(t=newtime),mypar))
> mypar<-c(lam1,lam2,x0,vx0)
> exp_x<-do.call("expect_position",c(list(t=newtime),mypar))
>
> #rho_x<-function(x,expect_position,sigma_pos)
>
> #NB: at t=0, the density blows up, since I have a delta as the initial
state!
> # At any t>0, instead, the result is finite.
> #for this reason I now redefine time by getting rid of the istant t=0
> to work out
> # the density
>
>
> rho_x_t<-matrix(ncol=nx,nrow=tsteps-1)
> for (i in 2:tsteps)
> {mypar<-c(exp_x[i],sig_xx[i])
> myrho_x<-do.call("rho_x",c(list(x=newx),mypar))
> rho_x_t[ i-1, ]<-myrho_x
> }
>
> ### Now I also define a scaled density
>
> rho_x_t_scaled<-matrix(ncol=nx,nrow=tsteps-1)
> for (i in 2:tsteps)
> {mypar<-c(exp_x[i],sig_xx[i])
> myrho_x<-do.call("rho_x",c(list(x=newx),mypar))
> rho_x_t_scaled[ i-1, ]<-myrho_x/max(myrho_x)
> }
>
> ###########Now I deal with the dynamics along y
>
> lam1<- -beta/2*(1+sqrt(1-4*St))
> lam2<- -beta/2*(1-sqrt(1-4*St))
> ymin<- 0
> ymax<- 1
> y0<-ymax
> vy0<- -y0
>
> mypar<-c(q,lam1,lam2)
> sig_yy<-do.call("sigma_pos",c(list(t=newtime),mypar))
> mypar<-c(lam1,lam2,y0,vy0)
> exp_y<-do.call("expect_position",c(list(t=newtime),mypar))
>
>
> # now I introduce the function giving the density along y: this has to
> include the BC of zero
> # density at wall
>
> rho_y<-function(y,expect_position,sigma_pos)
> {
> 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y-expect_position)^2/sigma_pos)-
> 1/sqrt(2*pi*sigma_pos)*exp(-1/2*(y+expect_position)^2/sigma_pos)
> }
>
> newy<-seq(ymin,ymax,len=nx) # grid along y with the same # of points
> as the one along x
>
>
> rho_y_t<-matrix(ncol=nx,nrow=tsteps-1)
> for (i in 2:tsteps)
> {mypar<-c(exp_y[i],sig_yy[i])
> myrho_y<-do.call("rho_y",c(list(y=newy),mypar))
> rho_y_t[ i-1, ]<-myrho_y
> }
>
> rho_y_t_scaled<-matrix(ncol=nx,nrow=tsteps-1)
> for (i in 2:tsteps)
> {mypar<-c(exp_y[i],sig_yy[i])
> myrho_y<-do.call("rho_y",c(list(y=newy),mypar))
> rho_y_t_scaled[ i-1, ]<-myrho_y/max(myrho_y)
> }
>
>
> # The following 2 plots are an example of the plots I'd like to use to
> make an animation
>
>
> g <- expand.grid(x = newx, y = newy)
>
> instant<-100
> mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[
> instant, ]%o%rho_y_t[ instant, ]))
>
>
> lentot<-nx^2
> dim(mydens)<-c(lentot,1)
>
> g$z<-mydens
> jpeg("dens-t-3.jpeg")
> print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE,
> scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey =
TRUE
> ,zoom=0.8, main=expression("Density at t=2"), zlab >
list(expression("density"),rot = 90),distance=0.0,
> perspective=TRUE,#screen = list(z = 150, x = -55,y= 0)
> ,zlim=range(c(0,1))))
> dev.off()
>
>
> instant<-300
> mydens<-rho_x_t[ instant, ]%o%rho_y_t[ instant, ]/(max(rho_x_t[
> instant, ]%o%rho_y_t[ instant, ]))
>
>
> lentot<-nx^2
> dim(mydens)<-c(lentot,1)
>
> g$z<-mydens
> jpeg("dens-t-3.jpeg")
> print(wireframe(z ~ x * y, g, drape = TRUE,shade=TRUE,
> scales = list(arrows = FALSE),pretty=FALSE, aspect = c(1,1), colorkey =
TRUE
> ,zoom=0.8, main=expression("Density at t=3"), zlab >
list(expression("density"),rot = 90),distance=0.0,
> perspective=TRUE,#screen = list(z = 150, x = -55,y= 0)
> ,zlim=range(c(0,1))))
> dev.off()
>
>
>
>
> Kind Regards
>
> Lorenzo
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
--
http://biostat.mc.vanderbilt.edu/JeffreyHorner