Use methods from a library in my own class


#1

I want to create a class that uses the RubyGnuplot library that can
create a plot using one simple command and only add options if so
desired. Below is what I have done so far and I was wondering if someone
could provide some opinion on my approach. I ran into a problem where I
allow the user to add 3 options but what I really want is access to all
the library’s methods so colors and lineweights, etc can be changed if
so desired. Is there a better approach than using a hash input like I’m
doing? Thank you!

#For simple 2D line plots. File is called ‘my_plotter.rb’

require ‘gnuplot’
class Data2d
def self.plot(x, y, options={})
Gnuplot.open do |gp|
Gnuplot::Plot.new( gp ) do |plot|

plot.title “#{options[:title]}”
plot.ylabel “#{options[:y_label]}”
plot.xlabel “#{options[:x_label]}”

plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
ds.with = “lines”
end
end
end
end
end

#Now all users need to do is create the data,

require ‘my_plotter’

x = [1,2,3,4,5]
y = [5,6,3,8,9]

#then run the command,

Data2d.plot(x,y)

#or, with options,

Data2d.plot(x,y,:x_label=>“Time”,:y_label=>“Values”, :title=>“My First
Plot”)


#2

Jason L. wrote:

require ‘gnuplot’
class Data2d
def self.plot(x, y, options={})
Gnuplot.open do |gp|
Gnuplot::Plot.new( gp ) do |plot|

plot.title “#{options[:title]}”
plot.ylabel “#{options[:y_label]}”
plot.xlabel “#{options[:x_label]}”

Untested…

 options.each {|opt,val| plot.send opt, val}

#3
 options.each {|opt,val| plot.send opt, val}

Thank you. That is a great idea and it works!

2 questions:

  1. I see that your send method on plot.send is a method from
    Gnuplot::Plot.new but what exactly is it doing? My guess is it takes
    ‘val’ and sends it to the plot method that corresponds with ‘opt’ as it
    iterates through my hash.

  2. How do I apply your idea to methods within an embedded array block
    such as “plot.data” from my code:

plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
ds.with = “lines”
end

which has methods such as ds.linewidth, ds.title, etc? I tried multiple
things like creating 2 hashes but can’t get my hash values to pass into
the embedded array. Thank you!


#4

Jason L. wrote:

  1. I see that your send method on plot.send is a method from
    Gnuplot::Plot.new but what exactly is it doing? My guess is it takes
    ‘val’ and sends it to the plot method that corresponds with ‘opt’ as it
    iterates through my hash.

The #send method is common to all ruby objects:

------------------------------------------------------------ Object#send
obj.send(symbol [, args…]) => obj
obj.send(symbol [, args…]) => obj

  From Ruby 1.8

  Invokes the method identified by symbol, passing it any arguments
  specified. You can use __send__ if the name send clashes with an
  existing method in obj.

     class Klass
       def hello(*args)
         "Hello " + args.join(' ')
       end
     end
     k = Klass.new
     k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"

#5

Jason L. wrote:

  1. How do I apply your idea to methods within an embedded array block
    such as “plot.data” from my code:

plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
ds.with = “lines”
end

which has methods such as ds.linewidth, ds.title, etc? I tried multiple
things like creating 2 hashes but can’t get my hash values to pass into
the embedded array. Thank you!

Something like this?

require ‘gnuplot’
class Data2d
def self.plot(x, y, options={})
Gnuplot.open do |gp|
Gnuplot::Plot.new( gp ) do |plot|
options.each {|opt,val| plot.send opt, val}
ds_options = options[:ds]
plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
ds_options.each {|opt,val| ds.send opt, val}
end
end
end
end
end

Data2d.plot(x,y,:x_label=>“Time”,:y_label=>“Values”, :title=>“My First
Plot”, :ds => {:with => “lines”})