def self.plot(filename, data = nil, frames = nil, script = nil, width = nil, height = nil, options = {}, &block)
width ||= 600
height ||= 600
values = []
script ||= ""
if block_given?
s = StringIO.new
class << s
def method_missing(name, *args)
name = name.to_s
if name[-1] == '='
arg = args.first
value = if String === arg
arg
else
R.ruby2R arg
end
add("" << name[0..-2] << "=" << value)
else
args_strs = []
args.each do |arg|
value = if String === arg
arg
else
R.ruby2R arg
end
args_strs << value
end
add("" << name << "(" << args_strs * ", " << ")")
end
end
def add(line)
self.write line << "\n"
end
end
block.call(s)
s.rewind
script << "\n" << s.read
end
sources = [:plot, options[:source]].flatten.compact
delay = options[:delay]
delay = 10 if delay.nil?
frames = data.keys if frames.nil?
frames = (1..frames).to_a if Integer === frames
if data
field_classes = R.field_classes(data) if field_classes.nil?
options[:R_open] ||= "colClasses=c('character'," + field_classes * ", " + ')' if field_classes.any?
data.R <<-EOF, :plot, options
frames = #{R.ruby2R frames}
for (frame in seq(1, length(frames))){
frame.value = frames[frame]
frame.str = sprintf("%06d", frame)
plot = { #{script} }
png(paste('#{filename}', frame.str, 'tmp.png', sep="."), #{ width }, #{ height })
{ #{script} }
dev.off()
}
data = NULL
EOF
else
R.run <<-EOF, :plot, options
frames = #{R.ruby2R frames}
for (frame in seq(1, length(frames))){
frame.value = frames[frame]
frame.str = sprintf("%06d", frame)
png(paste('#{filename}', frame.str, 'tmp.png', sep="."), #{ width }, #{ height })
{ #{script} }
dev.off()
}
EOF
end
CMD.cmd("convert #{filename}.*.tmp.png -set delay #{delay} -loop 0 #{filename} && rm #{filename}.*.tmp.png")
end