lib/rbbt/util/R/plot.rb in rbbt-util-5.21.121 vs lib/rbbt/util/R/plot.rb in rbbt-util-5.21.122

- old
+ new

@@ -1,8 +1,13 @@ module R module SVG - def self.ggplotSVG(data, script = nil, width = nil, height = nil, options = {}) + + def self.ggplotPNG(*args) + ggplot(*args) + end + + def self.ggplot(data, script = nil, width = nil, height = nil, options = {}) width ||= 3 height ||= 3 values = [] options = options.dup @@ -77,11 +82,31 @@ end end end module PNG - def self.ggplotPNG(filename, data, script = nil, width = nil, height = nil, options = {}) + + def self.eog(data, script = nil, width = nil, height = nil, options = {}) + TmpFile.with_file :extension => 'png' do |filename| + ggplot(filename, data, script, width, height, options) + `eog #{ filename }` + end + end + + def self.eog_plot(data, script = nil, width = nil, height = nil, options = {}) + TmpFile.with_file :extension => 'png' do |filename| + plot(filename, data, script, width, height, options) + `eog #{ filename }` + end + end + + + def self.ggplotPNG(*args) + ggplot(*args) + end + + def self.ggplot(filename, data, script = nil, width = nil, height = nil, options = {}) width ||= 3 height ||= 3 values = [] sources = [:plot, options[:source]].flatten.compact @@ -120,12 +145,12 @@ data = NULL EOF end def self.plot(filename, data = nil, script = nil, width = nil, height = nil, options = {}, &block) - width ||= 200 - height ||= 200 + width ||= 600 + height ||= 600 values = [] script ||= "" if block_given? s = StringIO.new @@ -206,8 +231,189 @@ png("#{ filename }", #{ width }, #{ height }) { #{script} } dev.off() EOF end + end + end + + module GIF + + def self.eog(data, frames = nil, script = nil, width = nil, height = nil, options = {}) + TmpFile.with_file :extension => 'gif' do |filename| + ggplot(filename, data, frames, script, width, height, options) + `eog #{ filename }` + end + end + + def self.eog_plot(data, frames = nil, script = nil, width = nil, height = nil, options = {}) + TmpFile.with_file :extension => 'gif' do |filename| + plot(filename, data, frames, script, width, height, options) + `eog #{ filename }` + end + end + + + def self.ggplot(filename, data, frames = nil, script = nil, width = nil, height = nil, options = {}) + width ||= 3 + height ||= 3 + values = [] + + sources = [:plot, options[:source]].flatten.compact + + data.each do |k,v| + v = Array === v ? v : [v] + next if v == "NA" or v.nil? or v.include? "NA" or v.include? nil + values = v + break + end + values = [values] unless Array === values + field_classes = values.collect do |v| + case v + when FalseClass, TrueClass + "'logical'" + when Numeric + "'numeric'" + when String + if v.strip =~ /^[-+]?[\d\.]+$/ + "'numeric'" + else + "'character'" + end + when Symbol + "'factor'" + else + ":NA" + end + end + options[:R_open] ||= "colClasses=c('character'," + field_classes * ", " + ')' + + delay = options[:delay] + delay = 10 if delay.nil? + + frames = data.keys if frames.nil? + frames = (1..frames).to_a if Integer === frames + + 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} } + + ggsave(paste('#{filename}', frame.str, 'tmp.png', sep="."), plot, width = #{R.ruby2R width}, height = #{R.ruby2R height}) +} +data = NULL + EOF + + CMD.cmd("convert #{filename}.*.tmp.png -set delay #{delay} -loop 0 #{filename} && rm #{filename}.*.tmp.png") + end + + 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 + data.each do |k,v| + v = Array === v ? v : [v] + next if v == "NA" or v.nil? or v.include? "NA" or v.include? nil + values = v + break + end + + values = [values] unless values.nil? or Array === values + + field_classes = values.collect do |v| + case v + when FalseClass, TrueClass + "'logical'" + when Numeric + "'numeric'" + when String + if v.strip =~ /^[-+]?[\d\.]+$/ + "'numeric'" + else + "'character'" + end + when Symbol + "'factor'" + else + ":NA" + end + end + + 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 end end