Use methods from a library in my own class

  • Thread starter Jason Lillywhite
  • Start date
J

Jason Lillywhite

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")
 
J

Joel VanderWerf

Jason said:
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]}"

Untested...

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

Jason Lillywhite

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!
 
J

Joel VanderWerf

Jason said:
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"
 
J

Joel VanderWerf

Jason said:
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!

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"})
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,965
Messages
2,570,148
Members
46,710
Latest member
FredricRen

Latest Threads

Top