Class: GnuplotRB::Multiplot

Inherits:
Object
  • Object
show all
Includes:
Plottable
Defined in:
lib/gnuplotrb/multiplot.rb

Overview

Multiplot allows to place several plots on one layout. It's usage is covered in multiplot notebook.

Options

Most of Multiplot options are the same as in Plot so one can also set any options related to Plot and they will be considered by all nested plots (if they does not override it with their own values).

There are only 2 specific options:

  • title - set title for the whole layout (above all the plots)

  • layout - set layout size, examples:

    { layout : [1, 3] } # 3 plots, 1 row, 3 columns
    { layout : [2, 2] } # 4 plots, 2 rows, 2 columns
    

Direct Known Subclasses

Animation

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Plottable

#method_missing, #option_name, #option_name!, #own_terminal, #respond_to?, #title, #title!, #to_canvas, #to_gif, #to_iruby, #to_png, #to_specific_term, #to_svg, #xrange, #xrange!, #yrange, #yrange!

Methods included from OptionHandling

option_to_string, #options, #options!, ruby_class_to_gnuplot, string_key, valid_terminal?, validate_terminal_options

Constructor Details

#initialize(*plots, **options) {|_self| ... } ⇒ Multiplot

Returns a new instance of Multiplot

Yields:

  • (_self)

Yield Parameters:


27
28
29
30
31
32
# File 'lib/gnuplotrb/multiplot.rb', line 27

def initialize(*plots, **options)
  @plots = plots[0].is_a?(Hamster::Vector) ? plots[0] : Hamster::Vector.new(plots)
  @options = Hamster::Hash[options]
  OptionHandling.validate_terminal_options(@options)
  yield(self) if block_given?
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class GnuplotRB::Plottable

Instance Attribute Details

#plotsArray (readonly)


21
22
23
# File 'lib/gnuplotrb/multiplot.rb', line 21

def plots
  @plots
end

Instance Method Details

#[](*args) ⇒ Object

Equal to #plots


210
211
212
# File 'lib/gnuplotrb/multiplot.rb', line 210

def [](*args)
  @plots[*args]
end

#add_plots(*plots) ⇒ Multiplot Also known as: add_plot, <<, add

Create new Multiplot with given plots added before plot at given position. (by default it adds plot at the front).

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
enlarged_mp = mp.add_plots(Plot.new('exp(x)')).layout([3,1])
# mp IS NOT affected

150
151
152
153
# File 'lib/gnuplotrb/multiplot.rb', line 150

def add_plots(*plots)
  plots.unshift(0) unless plots[0].is_a?(Numeric)
  self.class.new(@plots.insert(*plots), @options)
end

#add_plots!(*plots) ⇒ Multiplot Also known as: add_plot!, add!

Destructive version of #add_plots.

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
mp.add_plots!(Plot.new('exp(x)')).layout([3,1])
# mp IS affected

167
168
169
170
171
# File 'lib/gnuplotrb/multiplot.rb', line 167

def add_plots!(*plots)
  plots.unshift(0) unless plots[0].is_a?(Numeric)
  @plots = @plots.insert(*plots)
  self
end

#plot(term = nil, multiplot_part: false, **options) ⇒ Multiplot

Output all the plots to term (if given) or to this Multiplot's own terminal.


42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/gnuplotrb/multiplot.rb', line 42

def plot(term = nil, multiplot_part: false, **options)
  plot_options = mix_options(options) do |plot_opts, mp_opts|
    plot_opts.merge(multiplot: mp_opts.to_h)
  end
  terminal = term || (plot_options[:output] ? Terminal.new : own_terminal)
  multiplot(terminal, plot_options)
  if plot_options[:output]
    # guaranteed wait for plotting to finish
    terminal.close unless term
    # not guaranteed wait for plotting to finish
    # work bad with terminals like svg and html
    sleep 0.01 until File.size?(plot_options[:output])
  end
  self
end

#remove_plot(position = -1)) ⇒ Multiplot Also known as: remove

Create new Multiplot without plot at given position (by default last plot is removed).

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
mp_with_only_cos = mp.remove_plot(0)
# mp IS NOT affected

187
188
189
# File 'lib/gnuplotrb/multiplot.rb', line 187

def remove_plot(position = -1)
  self.class.new(@plots.delete_at(position), @options)
end

#remove_plot!(position = -1)) ⇒ Multiplot Also known as: remove!

Destructive version of #remove_plot.

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
mp.remove_plot!(0)
# mp IS affected

201
202
203
204
# File 'lib/gnuplotrb/multiplot.rb', line 201

def remove_plot!(position = -1)
  @plots = @plots.delete_at(position)
  self
end

#replace_plot(position = 0, plot) ⇒ Multiplot Also known as: replace

Create new Multiplot object where plot (Plot or Splot object) at position will be replaced with the given one.

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
mp_with_replaced_plot = mp.replace_plot(Plot.new('exp(x)', title: 'exp instead of sin'))
# mp IS NOT affected

116
117
118
# File 'lib/gnuplotrb/multiplot.rb', line 116

def replace_plot(position = 0, plot)
  self.class.new(@plots.set(position, plot), @options)
end

#replace_plot!(position = 0, plot) ⇒ Multiplot Also known as: replace!, []=

Destructive version of #replace_plot.

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
mp.replace_plot!(Plot.new('exp(x)', title: 'exp instead of sin'))
# mp IS affected

130
131
132
133
# File 'lib/gnuplotrb/multiplot.rb', line 130

def replace_plot!(position = 0, plot)
  @plots = @plots.set(position, plot)
  self
end

#update_plot(position = 0, **options) {|plot| ... } ⇒ Multiplot Also known as: update

Create new updated Multiplot object where plot (Plot or Splot object) at position will be replaced with the new one created from it by updating. To update a plot you can pass some options for it or a block, that should take existing plot (with new options if you gave them) and return a plot too.

Method yields new created Plot or Splot to allow you update it manually.

Examples:

mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
updated_mp = mp.update_plot(title: 'Sin(x) and Exp(x)') { |sinx| sinx.add!('exp(x)') }
# mp IS NOT affected

Yield Parameters:

Yield Returns:


78
79
80
81
82
83
# File 'lib/gnuplotrb/multiplot.rb', line 78

def update_plot(position = 0, **options)
  return self unless block_given? if options.empty?
  replacement = @plots[position].options(options)
  replacement = yield(replacement) if block_given?
  replace_plot(position, replacement)
end

#update_plot!(position = 0, **options) {|replacement| ... } ⇒ Multiplot Also known as: update!

Destructive version of #update_plot.

Examples:

Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
mp.update_plot!(title: 'Sin(x) and Exp(x)') { |sinx| sinx.add!('exp(x)') }
# mp IS affected

Yields:

  • (replacement)

95
96
97
98
99
100
# File 'lib/gnuplotrb/multiplot.rb', line 95

def update_plot!(position = 0, **options)
  return self unless block_given? if options.empty?
  replacement = @plots[position].options!(options)
  yield(replacement) if block_given?
  self
end