Create animated graphs with R

I collected some longitudinal data on how group members’ electrodermal activity changes over the course of a group task. Displaying the data in motion was helpful for emphasizing a few points, which I won’t re-hash here. The size of the bubbles in the graph below correspond to the average amount of variation within groups in the sample.

Click on the GIF file below to see the result, which uses the animation package in R to create a moving graph.

 # Record this as a movie  
ymin <- -1.5
ymax <- 1.5
xmin <- -7
xmax <- 45
aggsub <- agg[agg$min1 >= (xmin+2) & agg$min1 <=xmax,]
sessionstart <- xmin
taskstart <- 0
taskend <- 30
recordend <- 32
sessionend <- xmax
for (i in (xmin+2):xmax) {
x <- aggsub[aggsub$min1 >= xmin & aggsub$min1 <=i, c("min1")]
y <- aggsub[aggsub$min1 >= xmin & aggsub$min1 <=i, c("eda_z")]
r <- aggsub[aggsub$min1 >= xmin & aggsub$min1 <=i, c("eda_z_sd")]
plot(x,y,ylim = c(-1.5,1.5), xlim=c(xmin,xmax),ylab="Electrodermal Activity", xlab="Time", axes=FALSE, type="n")
xpos <- seq(xmin, xmax, 3)
lab <- seq(xmin, xmax, 3)
axis(1, at=xpos, labels=lab, cex =1.5, lwd=.5, lty=3, tck=1, col="dark gray", pos=ymin, col.axis="dark gray")
ypos <- seq(ymin, ymax, .5)
axis(2, at=ypos , labels=ypos, cex =1.5, las=2, tck=1, lwd=.5, lty=3, col="dark gray", pos=xmin, col.axis="dark gray")
zerox <- xmin:xmax
zeroy <- rep(0, length(zerox))
lines(zerox, zeroy, lty=1, lwd=2, col="red")
polygon(c(sessionstart, sessionstart, taskstart, taskstart), c(ymax, ymin, ymin, ymax), col="#0015FF25", border=FALSE)
text(taskstart-(taskstart-xmin)/2, 1.35, "Pre-Task Survey", col="dark blue")
if(i >= taskstart) {
#polygon(c(taskstart, taskstart, taskend, taskend), c(1.5, min(y), min(y), 1.5), col="#EAFF0025", border=FALSE)
text(taskend-(taskend-taskstart)/2, 1.35, "Group Members Work to Develop Recruitment Video", col="dark green")
if(i >=taskend) {
polygon(c(taskend, taskend, recordend, recordend), c(ymax, ymin, ymin, ymax), col="#FA050535", border=FALSE)
text(recordend-(recordend-taskend)/2, 1.35, "RecordnVideo", col="red")
if(i >=recordend) {
polygon(c(recordend, recordend, sessionend, sessionend), c(ymax, ymin, ymin, ymax), col="#0015FF25", border=FALSE)
text(sessionend-(sessionend-recordend)/2, 1.35, "Post-Task Survey", col="dark blue")
symbols(x, y, circles=r, inches=.5, fg="white", bg="dark blue", add=TRUE)
lines(x,y, lwd=1,col="light gray", lty=3)
}, interval=.25, moviename="eda_z_team_full.gif", loop=1, filename="eda_z_team_full", fileext="png", outdir=getwd(), width=1600, height=800)