quartz(type="pdf",file="figure_NUM.pdf")
par(mfrow=c(3,2), cex=1, mar=c(2,2,2,2))
dev.off()
Monday, April 15, 2013
R Graphics Parameters -- Rows and Columns
For some reason I always forget the code for setting R's graphics parameters. And, I always need this same line. So, now I shan't forget it.
Wednesday, November 28, 2012
Convert CD tracks to mp3 using ffmpeg
Just a small chunk of code to convert CD tracks (aiff) to mp3 files:
#!/bin/bash
for i in {1..12}
do
ffmpeg -i ${i}.aiff -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 ${i}.mp3
done
Thursday, November 15, 2012
Using color in R graphics
I'm sticking this here because I always forget the simple ways to specify and manipulate color in R graphics:
Earl Glynn put together a very useful presentation, which covers a range of topics on using color in R graphics.
Earl Glynn put together a very useful presentation, which covers a range of topics on using color in R graphics.
Wednesday, November 14, 2012
Ruby code to parse and combine text files
I use this ruby code to parse several tab-delimitted text files that contain individual raters' perceptions of a target (in this case a video). The rater id is embedded in the filename. The target video number is also embedded in the filename.
#! /usr/bin/env ruby
out = Dir.glob('*.txt')
# open the file to write to and add the column headers
columns = "group\trater\tmin\tengage\tprepare\tdiverge\tconverge\texecute\tcentralize\tattentive\ttone\tactivation\n"
File.open("./all_ratings.txt", 'w') { |f| f.write(columns) }
out.each do |filename|
rater = filename.split('.')[0].split('_')[0]
group = filename.split('.')[0].split('_')[1]
# Assign a number for the rater
case rater.downcase
when "rater1"
rater_id = 1
when "rater2"
rater_id = 2
when "rater3"
rater_id = 3
when "rater4"
rater_id = 4
end
puts "rater: " + rater + "(#{rater_id})" + " group: " + group
# Open the file
f = File.open(filename, "r").read
# Split by lines - This will make sure that the end of line from Mac Classic is \n
str = f.gsub!(/\r\n?/, "\n").split("\n")
# Identify the line number that starts the data entry for this file by finding a specific expression in the text of the file
linenum = 0
exp = "- Low marked by sluggishness"
line = str[linenum]
puts line
until line.include?(exp)
line = str[linenum]
linenum += 1
end
linenum.upto(linenum+30) do |currentline|
min = (currentline-linenum)+1
# add the rater_id and the group_id to the line
line = group.to_s + "\t" + rater_id.to_s + "\t" + str[currentline] + "\n"
File.open("./all_ratings.txt", 'a') { |f| f.write(line) }
end
end
Tuesday, November 13, 2012
Copy files from incrementally-numbered drives
This code moves through drives (attached via USB) that are numbered incrementally and copies the files on the drives to the local hard disk. I'm using this to more quickly pull the data off of a number of Affectiva Q-Sensors, which I connect to my computer with a USB hub.
#!/bin/bash
for i in {1..20}
do
# Create the directory
mkdir "./sensor_data/${i}"
# Check to see if the volume is mounted
drive="Q${i}"
if mount|grep $drive;
then
echo "${drive} is mounted"
# move the files over to the directory
cp -r /Volumes/${drive}/ ./sensor_data/${i}/
else
echo "${drive} is NOT mounted"
fi
done
Sunday, September 23, 2012
Create a filled line graph with R
I used the code below to create a presentation-quality graph of data on how individual's activation level (measured as electrodermal activity) changes over time during a group-based task. (Click on the image to enlarge.)
quartz(width=16,height=8,type="pdf",file="indiv_eda_z.pdf",dpi=600)
par(xpd=TRUE)
par(family="Tahoma", bg="white", mar=c(3,3,3,3), mgp=c(1,1,1))
ylim <- c(-1.5, 1.5)
xlim <- c(-540, 2700)
x <- aggsub$task_time
y <- aggsub$eda_z
ylo <- rep(min(y), length(y))
plot(x,y, type="n", ylim=ylim, axes=FALSE, ylab="Electrodermal Activity", xlab="Time (in minutes)", xlim=xlim, col="dark green")
xpos <- seq(-540, 2700, 180)
lab <- seq(-9, 45, 3)
axis(1, at=xpos, labels=lab, cex =1.5, lwd=.5, lty=3, tck=1, col="dark gray", pos=-1.5, col.axis="dark gray")
ypos <- seq(-1.5, 1.5, .5)
axis(2, at=ypos , labels=ypos, cex =1.5, las=2, tck=1, lwd=.5, lty=3, col="dark gray", pos=-540, col.axis="dark gray")
zerox <- -540:2700
zeroy <- rep(0, length(zerox))
lines(zerox, zeroy, lty=1, lwd=2, col="red")
lines(x,y, lwd=2.5,col="dark green")
xx <- c(x, rev(x))
yy <- c(ylo, rev(y))
polygon(xx, yy, col="light green", border=FALSE)
sessionstart <- min(x)
taskstart <- 0
taskend <- 1800
recordend <- 1920
sessionend <- max(x)
polygon(c(sessionstart, sessionstart, taskstart, taskstart), c(1.5, min(y), min(y), 1.5), col="#0015FF25", border=FALSE)
text(-270, 1.25, "Pre-Task Survey", col="dark blue")
#polygon(c(taskstart, taskstart, taskend, taskend), c(1.5, min(y), min(y), 1.5), col="#EAFF0025", border=FALSE)
text(900, 1.25, "Group Members Work to Develop Recruitment Video", col="dark green")
polygon(c(taskend, taskend, recordend, recordend), c(1.5, min(y), min(y), 1.5), col="#FA050535", border=FALSE)
text(recordend-(recordend-taskend)/2, 1.25, "Record\nVideo", col="red")
polygon(c(recordend, recordend, sessionend, sessionend), c(1.5, min(y), min(y), 1.5), col="#0015FF25", border=FALSE)
text(sessionend-(sessionend-recordend)/2, 1.25, "Post-Task Survey", col="dark blue")
dev.off()
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)
Subscribe to:
Posts (Atom)

