Sunday, September 23, 2012

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  
 saveMovie({  
   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, "Record\nVideo", 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)  

No comments:

Post a Comment