gnuplotrb 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,10 +9,9 @@ module GnuplotRB
9
9
  # handle errors from its stderr.
10
10
  module ErrorHandling
11
11
  ##
12
- # ====== Overview
13
12
  # Check if there were errors in previous commands.
14
13
  # Throws GnuplotError in case of any errors.
15
- def check_errors
14
+ def check_errors(raw: false)
16
15
  return if @err_array.empty?
17
16
  command = ''
18
17
  rest = ''
@@ -21,14 +20,17 @@ module GnuplotRB
21
20
  rest = @err_array[1..-1].join('; ')
22
21
  @err_array.clear
23
22
  end
24
- message = "Error in previous command (\"#{command}\"): \"#{rest}\""
23
+ message = if raw
24
+ "#{command};#{rest}}"
25
+ else
26
+ "Error in previous command (\"#{command}\"): \"#{rest}\""
27
+ end
25
28
  fail GnuplotError, message
26
29
  end
27
30
 
28
31
  private
29
32
 
30
33
  ##
31
- # ====== Overview
32
34
  # Start new thread that will read stderr given as stream
33
35
  # and add errors into @err_array.
34
36
  def handle_stderr(stream)
@@ -1,13 +1,12 @@
1
1
  module GnuplotRB
2
2
  ##
3
- # ====== Overview
4
3
  # This module contains methods which are mixed into several classes
5
4
  # to set, get and convert their options.
6
5
  module OptionHandling
7
6
  class << self
8
- # Some values of options should be quoted to be read by gnuplot
7
+ # Some values of options should be quoted to be read by gnuplot properly
9
8
  #
10
- # TODO: update list with data from gnuplot documentation !!!
9
+ # @todo update list with data from gnuplot documentation !!!
11
10
  QUOTED_OPTIONS = %w(
12
11
  title
13
12
  output
@@ -30,26 +29,33 @@ module GnuplotRB
30
29
  format_z
31
30
  format_cb
32
31
  timefmt
32
+ dt
33
+ dashtype
33
34
  )
34
35
 
36
+ private_constant :QUOTED_OPTIONS
37
+
35
38
  ##
36
- # Replacement '_' with ' ' is made to allow passing several options
37
- # with the same first word of key.
38
- # See issue #7 for more info.
39
+ # Replace '_' with ' ' is made to allow passing several options
40
+ # with the same first word of key. See issue #7 for more info.
41
+ # @param key [Symbol, String] key to modify
42
+ # @return [String] given key with '_' replaced with ' '
39
43
  def string_key(key)
40
44
  key.to_s.gsub(/_/) { ' ' } + ' '
41
45
  end
42
46
 
43
47
  ##
44
- # ====== Overview
45
48
  # Recursive function that converts Ruby option to gnuplot string
46
- # ====== Arguments
47
- # * *key* - name of option in gnuplot
48
- # * *option* - an option that should be converted
49
- # ====== Examples
50
- # option_to_string(['png', size: [300, 300]]) #=> 'png size 300,300'
51
- # option_to_string(xrange: 0..100) #=> 'xrange [0:100]'
52
- # option_to_string(multiplot: true) #=> 'multiplot'
49
+ #
50
+ # @param key [Symbol] name of option in gnuplot
51
+ # @param option an option that should be converted
52
+ # @example
53
+ # option_to_string(['png', size: [300, 300]])
54
+ # #=> 'png size 300,300'
55
+ # option_to_string(xrange: 0..100)
56
+ # #=> 'xrange [0:100]'
57
+ # option_to_string(multiplot: true)
58
+ # #=> 'multiplot'
53
59
  def option_to_string(key = nil, option)
54
60
  return string_key(key) if !!option == option # check for boolean
55
61
  value = ruby_class_to_gnuplot(option)
@@ -60,6 +66,7 @@ module GnuplotRB
60
66
  end
61
67
 
62
68
  ##
69
+ # @private
63
70
  # Method for inner use.
64
71
  # Needed to convert several ruby classes into
65
72
  # value that should be piped to gnuplot.
@@ -79,35 +86,33 @@ module GnuplotRB
79
86
  end
80
87
 
81
88
  ##
82
- # ====== Overview
83
89
  # Check if given terminal available for use.
84
- # ====== Arguments
85
- # * *terminal* - terminal to check (e.g. 'png', 'qt', 'gif')
90
+ #
91
+ # @param terminal [String] terminal to check (e.g. 'png', 'qt', 'gif')
92
+ # @return [Boolean] true or false
86
93
  def valid_terminal?(terminal)
87
94
  Settings.available_terminals.include?(terminal)
88
95
  end
89
96
 
90
97
  ##
91
- # ====== Overview
92
98
  # Check if given options are valid for gnuplot.
93
99
  # Raises ArgumentError if invalid options found.
94
- # ====== Arguments
95
- # * *options* - Hash of options to check
96
- # (e.g. {term: 'qt', title: 'Plot title'})
97
- #
98
100
  # Now checks only terminal name.
101
+ #
102
+ # @param options [Hash] options to check (e.g. "{ term: 'qt', title: 'Plot title' }")
99
103
  def validate_terminal_options(options)
100
104
  terminal = options[:term]
101
105
  return unless terminal
102
106
  terminal = terminal[0] if terminal.is_a?(Array)
103
107
  message = 'Seems like your Gnuplot does not ' \
104
- 'support that terminal, please see supported ' \
105
- 'terminals with Settings::available_terminals'
108
+ "support that terminal (#{terminal}), please see " \
109
+ 'supported terminals with Settings::available_terminals'
106
110
  fail(ArgumentError, message) unless valid_terminal?(terminal)
107
111
  end
108
112
  end
109
113
 
110
114
  ##
115
+ # @private
111
116
  # You should implement #initialize in classes that use OptionsHelper
112
117
  def initialize(*_)
113
118
  fail NotImplementedError, 'You should implement #initialize' \
@@ -115,6 +120,7 @@ module GnuplotRB
115
120
  end
116
121
 
117
122
  ##
123
+ # @private
118
124
  # You should implement #new_with_options in classes that use OptionsHelper
119
125
  def new_with_options(*_)
120
126
  fail NotImplementedError, 'You should implement #new_with_options' \
@@ -122,20 +128,19 @@ module GnuplotRB
122
128
  end
123
129
 
124
130
  ##
125
- # ====== Overview
126
131
  # Create new Plot (or Dataset or Splot or Multiplot) object where current
127
132
  # options are merged with given. If no options
128
133
  # given it will just return existing set of options.
129
- # ====== Arguments
130
- # * *options* - options to add. If no options given, current
131
- # options are returned.
132
- # ====== Example
134
+ #
135
+ # @param options [Hash] options to add
136
+ # @return [Dataset, Splot, Multiplot] new object created with given options
137
+ # @return [Hamster::Hash] current options if given options empty
138
+ # @example
133
139
  # sin_graph = Plot.new(['sin(x)', title: 'Sin'], title: 'Sin on [0:3]', xrange: 0..3)
134
140
  # sin_graph.plot
135
141
  # sin_graph_update = sin_graph.options(title: 'Sin on [-10:10]', xrange: -10..10)
136
142
  # sin_graph_update.plot
137
- # # this may also be considered as
138
- # # sin_graph.title(...).xrange(...)
143
+ # # sin_graph IS NOT affected
139
144
  def options(**options)
140
145
  @options ||= Hamster::Hash.new
141
146
  if options.empty?
@@ -145,12 +150,27 @@ module GnuplotRB
145
150
  end
146
151
  end
147
152
 
153
+ ##
154
+ # Update existing Plot (or Dataset or Splot or Multiplot) object with given options.
155
+ #
156
+ # @param options [Hash] options to add
157
+ # @return [Dataset, Splot, Multiplot] self
158
+ # @example
159
+ # sin_graph = Plot.new(['sin(x)', title: 'Sin'], title: 'Sin on [0:3]', xrange: 0..3)
160
+ # sin_graph.plot
161
+ # sin_graph.options!(title: 'Sin on [-10:10]', xrange: -10..10)
162
+ # sin_graph.plot
163
+ # # second #plot call will plot not the same as first, sin_graph IS affected
164
+ def options!(**options)
165
+ @options = @options ? @options.merge(options) : Hamster::Hash.new(options)
166
+ self
167
+ end
168
+
148
169
  private
149
170
 
150
171
  ##
151
- # ====== Arguments
152
- # * *key* - [Symbol] - option key
153
- # * *value* - anything treated as options value in gnuplot gem
172
+ # Return current option value if no value given. Create new
173
+ # object with given option set if value given.
154
174
  def option(key, *value)
155
175
  if value.empty?
156
176
  value = options[key]
@@ -160,5 +180,11 @@ module GnuplotRB
160
180
  options(key => value)
161
181
  end
162
182
  end
183
+
184
+ ##
185
+ # Just set an option.
186
+ def option!(key, *value)
187
+ options!(key => value)
188
+ end
163
189
  end
164
190
  end
@@ -7,57 +7,64 @@ module GnuplotRB
7
7
  include OptionHandling
8
8
 
9
9
  ##
10
+ # @private
10
11
  # You should implement #plot in classes that are Plottable
11
12
  def plot(*_)
12
13
  fail NotImplementedError, 'You should implement #plot in classes that are Plottable!'
13
14
  end
14
15
 
15
16
  ##
16
- # ====== Overview
17
17
  # In this gem #method_missing is used both to handle
18
18
  # options and to handle plotting to specific terminal.
19
19
  #
20
- # ====== Options handling
21
- # ======= Overview
20
+ # == Options handling
21
+ # === Overview
22
22
  # You may set options using #option_name(option_value) method.
23
23
  # A new object will be constructed with selected option set.
24
24
  # And finally you can get current value of any option using
25
25
  # #options_name without arguments.
26
- # ======= Arguments
26
+ # === Arguments
27
27
  # * *option_value* - value to set an option. If none given
28
28
  # method will just return current option's value
29
- # ======= Examples
29
+ # === Examples
30
30
  # plot = Splot.new
31
31
  # new_plot = plot.title('Awesome plot')
32
32
  # plot.title #=> nil
33
33
  # new_plot.title #=> 'Awesome plot'
34
34
  #
35
- # ====== Plotting to specific term
36
- # ======= Overview
35
+ # == Plotting to specific term
36
+ # === Overview
37
37
  # Gnuplot offers possibility to output graphics to many image formats.
38
38
  # The easiest way to to so is to use #to_<plot_name> methods.
39
- # ======= Arguments
39
+ # === Arguments
40
40
  # * *options* - set of options related to terminal (size, font etc).
41
41
  # Be careful, some terminals have their own specific options.
42
- # ======= Examples
42
+ # === Examples
43
43
  # # font options specific for png term
44
44
  # multiplot.to_png('./result.png', size: [300, 500], font: ['arial', 12])
45
45
  # # font options specific for svg term
46
46
  # content = multiplot.to_svg(size: [100, 100], fname: 'Arial', fsize: 12)
47
47
  def method_missing(meth_id, *args)
48
48
  meth = meth_id.id2name
49
- if meth[0..2] == 'to_'
49
+ case
50
+ when meth[0..2] == 'to_'
50
51
  term = meth[3..-1]
51
52
  super unless OptionHandling.valid_terminal?(term)
52
53
  to_specific_term(term, *args)
54
+ when meth[-1] == '!'
55
+ option!(meth[0..-2].to_sym, *args)
56
+ when meth[-1] == '='
57
+ option!(meth[0..-2].to_sym, *args)
58
+ option(meth[0..-2].to_sym)
53
59
  else
54
60
  option(meth_id, *args)
55
61
  end
56
62
  end
57
63
 
58
64
  ##
59
- # Returns true foe existing methods and
60
- # #to_<term_name> when name is a valid terminal type.
65
+ # @return [true] for existing methods and
66
+ # #to_|term_name| when name is a valid terminal type.
67
+ # @return [false] otherwise
61
68
  def respond_to?(meth_id)
62
69
  # Next line is here to force iRuby use #to_iruby
63
70
  # instead of #to_svg.
@@ -68,8 +75,7 @@ module GnuplotRB
68
75
  end
69
76
 
70
77
  ##
71
- # This method is used to embed plottable objects
72
- # into iRuby notebooks. There is
78
+ # This method is used to embed plottable objects into iRuby notebooks. There is
73
79
  # {a notebook}[http://nbviewer.ipython.org/github/dilcom/gnuplotrb/blob/master/notebooks/basic_usage.ipynb]
74
80
  # with examples of its usage.
75
81
  def to_iruby
@@ -86,20 +92,16 @@ module GnuplotRB
86
92
  end
87
93
 
88
94
  ##
89
- # :call-seq:
90
- # to_png('file.png') -> creates file with plot
91
- # to_svg -> svg file contents
92
- # to_canvas('plot.html', size: [300,300]) -> creates file with plot
93
- #
94
- # ====== Overview
95
- # Method which outputs plot to specific terminal (possibly some file).
95
+ # @private
96
+ # Output plot to specific terminal (possibly some file).
96
97
  # Explicit use should be avoided. This method is called from #method_missing
97
98
  # when it handles method names like #to_png(options).
98
- # ====== Arguments
99
- # * *path* - path to output file, if none given it will output to temp file
99
+ #
100
+ # @param trminal [String] terminal name ('png', 'svg' etc)
101
+ # @param path [String] path to output file, if none given it will output to temp file
100
102
  # and then read it and return binary contents of file
101
- # * *options* - used in #plot
102
- # ====== Examples
103
+ # @param options [Hash] used in #plot
104
+ # @example
103
105
  # ## plot here may be Plot, Splot, Multiplot or any other plottable class
104
106
  # plot.to_png('./result.png', size: [300, 500])
105
107
  # contents = plot.to_svg(size: [100, 100])
@@ -117,9 +119,90 @@ module GnuplotRB
117
119
  end
118
120
 
119
121
  ##
120
- # Returns terminal object linked with this Plottable object.
122
+ # @return [Terminal] terminal object linked with this Plottable object
121
123
  def own_terminal
122
124
  @terminal ||= Terminal.new
123
125
  end
126
+
127
+ ##
128
+ # @!method xrange(value = nil)
129
+ # @!method yrange(value = nil)
130
+ # @!method title(value = nil)
131
+ # @!method option_name(value = nil)
132
+ # Clone existing object and set new options value in created one or just return
133
+ # existing value if nil given.
134
+ #
135
+ # Method is handled by #method_missing.
136
+ #
137
+ # You may set options using #option_name(option_value) method.
138
+ # A new object will be constructed with selected option set.
139
+ # And finally you can get current value of any option using
140
+ # #options_name without arguments.
141
+ #
142
+ # Available options are listed in Plot, Splot, Multiplot etc class top level doc.
143
+ #
144
+ # @param value new value for option
145
+ # @return new object with option_name set to *value* if value given
146
+ # @return old option value if no value given
147
+ #
148
+ # @example
149
+ # plot = Splot.new
150
+ # new_plot = plot.title('Awesome plot')
151
+ # plot.title #=> nil
152
+ # new_plot.title #=> 'Awesome plot'
153
+
154
+ ##
155
+ # @!method xrange!(value)
156
+ # @!method yrange!(value)
157
+ # @!method title!(value)
158
+ # @!method option_name!(value)
159
+ # Set value for an option.
160
+ #
161
+ # Method is handled by #method_missing.
162
+ #
163
+ # You may set options using obj.option_name!(option_value) or
164
+ # obj.option_name = option_value methods.
165
+ #
166
+ # Available options are listed in Plot, Splot, Multiplot etc class top level doc.
167
+ #
168
+ # @param value new value for option
169
+ # @return self
170
+ #
171
+ # @example
172
+ # plot = Splot.new
173
+ # plot.title #=> nil
174
+ # plot.title!('Awesome plot')
175
+ # plot.title #=> 'Awesome plot'
176
+ #
177
+ # @example
178
+ # plot = Splot.new
179
+ # plot.title #=> nil
180
+ # plot.title = 'Awesome plot'
181
+ # plot.title #=> 'Awesome plot'
182
+
183
+ ##
184
+ # @!method to_png(path = nil, **options)
185
+ # @!method to_svg(path = nil, **options)
186
+ # @!method to_gif(path = nil, **options)
187
+ # @!method to_canvas(path = nil, **options)
188
+ # Output to plot to according image format.
189
+ #
190
+ # All of #to_|terminal_name| methods are handled with #method_missing.
191
+ #
192
+ # Gnuplot offers possibility to output graphics to many image formats.
193
+ # The easiest way to to so is to use #to_<plot_name> methods.
194
+ #
195
+ # @param path [String] path to save plot file to.
196
+ # @param options [Hash] specific terminal options like 'size',
197
+ # 'font' etc
198
+ #
199
+ # @return [String] contents of plotted file unless path given
200
+ # @return self if path given
201
+ #
202
+ # @example
203
+ # # font options specific for png term
204
+ # multiplot.to_png('./result.png', size: [300, 500], font: ['arial', 12])
205
+ # # font options specific for svg term
206
+ # content = multiplot.to_svg(size: [100, 100], fname: 'Arial', fsize: 12)
124
207
  end
125
208
  end
@@ -1,38 +1,44 @@
1
1
  module GnuplotRB
2
2
  ##
3
- # === Overview
4
3
  # Multiplot allows to place several plots on one layout.
5
- # It's usage is covered in {multiplot notebook}[http://nbviewer.ipython.org/github/dilcom/gnuplotrb/blob/master/notebooks/multiplot_layout.ipynb].
4
+ # It's usage is covered in
5
+ # {multiplot notebook}[http://nbviewer.ipython.org/github/dilcom/gnuplotrb/blob/master/notebooks/multiplot_layout.ipynb].
6
+ #
7
+ # == Options
8
+ # Most of Multiplot options are the same as in Plot so one can also set any options related
9
+ # to Plot and they will be considered by all nested plots
10
+ # (if they does not override it with their own values).
11
+ #
12
+ # There are only 2 specific options:
13
+ # * title - set title for the whole layout (above all the plots)
14
+ # * layout - set layout size, examples:
15
+ # { layout : [1, 3] } # 3 plots, 1 row, 3 columns
16
+ # { layout : [2, 2] } # 4 plots, 2 rows, 2 columns
6
17
  class Multiplot
7
18
  include Plottable
8
19
  ##
9
- # Array of plots contained by this object.
20
+ # @return [Array] Array of plots contained by this object
10
21
  attr_reader :plots
11
22
 
12
23
  ##
13
- # ====== Arguments
14
- # * *plots* are Plot or Splot objects which should be placed
15
- # on this multiplot layout
16
- # * *options* will be considered as 'settable' options of gnuplot
17
- # ('set xrange [1:10]' for { xrange: 1..10 } etc) just as in Plot.
18
- # Special options of Multiplot are :layout and :title.
24
+ # @param plots [Plot, Splot, Hamster::Vector] Hamster vector (or just sequence) with Plot
25
+ # or Splot objects which should be placed on this multiplot layout
26
+ # @param options [Hash] see options in top class docs
19
27
  def initialize(*plots, **options)
20
28
  @plots = plots[0].is_a?(Hamster::Vector) ? plots[0] : Hamster::Vector.new(plots)
21
29
  @options = Hamster.hash(options)
22
30
  OptionHandling.validate_terminal_options(@options)
31
+ yield(self) if block_given?
23
32
  end
24
33
 
25
34
  ##
26
- # ====== Overview
27
- # This outputs all the plots to term (if given) or to this
28
- # Multiplot's own terminal.
29
- # ====== Arguments
30
- # * *term* - Terminal to plot to
31
- # * *options* - will be considered as 'settable' options of gnuplot
32
- # ('set xrange [1:10]', 'set title 'plot'' etc)
33
- # Options passed here have priority over already existing.
34
- # Inner options of Plots have the highest priority (except
35
- # :term and :output which are ignored in this case).
35
+ # Output all the plots to term (if given) or to this Multiplot's own terminal.
36
+ #
37
+ # @param term [Terminal] Terminal to plot to
38
+ # @param multiplot_part [Boolean] placeholder, does not really needed and should not be used
39
+ # @param options [Hash] see options in top class docs.
40
+ # Options passed here have priority over already set.
41
+ # @return [Multiplot] self
36
42
  def plot(term = nil, multiplot_part: false, **options)
37
43
  plot_options = mix_options(options) do |plot_opts, mp_opts|
38
44
  plot_opts.merge(multiplot: mp_opts.to_h)
@@ -50,21 +56,25 @@ module GnuplotRB
50
56
  end
51
57
 
52
58
  ##
53
- # ====== Overview
54
- # Create new Multiplot object where plot (Plot or Splot object)
55
- # at *position* will
59
+ # Create new updated Multiplot object
60
+ # where plot (Plot or Splot object) at *position* will
56
61
  # be replaced with the new one created from it by updating.
57
62
  # To update a plot you can pass some options for it or a
58
63
  # block, that should take existing plot (with new options if
59
64
  # you gave them) and return a plot too.
60
- # ====== Arguments
61
- # * *position* - position of plot which you need to update
65
+ #
66
+ # Method yields new created Plot or Splot to allow you update it manually.
67
+ #
68
+ # @param position [Integer] position of plot which you need to update
62
69
  # (by default first plot is updated)
63
- # * *options* - options to update plot with
64
- # * *&block* - method also may take a block which returns a plot
65
- # ====== Example
70
+ # @param options [Hash] options to set into updated plot
71
+ # @return [Multiplot] self
72
+ # @yieldparam plot [Plot, Splot] a new plot
73
+ # @yieldreturn [Plot, Splot] changed plot
74
+ # @example
66
75
  # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
67
- # updated_mp = mp.update_plot(title: 'Sin(x) and Exp(x)') { |sinx| sinx.add('exp(x)') }
76
+ # updated_mp = mp.update_plot(title: 'Sin(x) and Exp(x)') { |sinx| sinx.add!('exp(x)') }
77
+ # # mp IS NOT affected
68
78
  def update_plot(position = 0, **options)
69
79
  return self unless block_given? if options.empty?
70
80
  replacement = @plots[position].options(options)
@@ -75,16 +85,34 @@ module GnuplotRB
75
85
  alias_method :update, :update_plot
76
86
 
77
87
  ##
78
- # ====== Overview
88
+ # Destructive version of #update_plot.
89
+ #
90
+ # @return [Multiplot] self
91
+ # @example
92
+ # Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
93
+ # mp.update_plot!(title: 'Sin(x) and Exp(x)') { |sinx| sinx.add!('exp(x)') }
94
+ # # mp IS affected
95
+ def update_plot!(position = 0, **options)
96
+ return self unless block_given? if options.empty?
97
+ replacement = @plots[position].options!(options)
98
+ yield(replacement) if block_given?
99
+ self
100
+ end
101
+
102
+ alias_method :update!, :update_plot!
103
+
104
+ ##
79
105
  # Create new Multiplot object where plot (Plot or Splot object)
80
106
  # at *position* will be replaced with the given one.
81
- # ====== Arguments
82
- # * *position* - position of plot which you need to update
83
- # (by default first plot is updated)
84
- # * *plot* - replacement for existing plot
85
- # ====== Example
107
+ #
108
+ # @param position [Integer] position of plot which you need to replace
109
+ # (by default first plot is replace)
110
+ # @param plot [Plot, Splot] replacement
111
+ # @return [Multiplot] self
112
+ # @example
86
113
  # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
87
114
  # mp_with_replaced_plot = mp.replace_plot(Plot.new('exp(x)', title: 'exp instead of sin'))
115
+ # # mp IS NOT affected
88
116
  def replace_plot(position = 0, plot)
89
117
  self.class.new(@plots.set(position, plot), @options)
90
118
  end
@@ -92,15 +120,33 @@ module GnuplotRB
92
120
  alias_method :replace, :replace_plot
93
121
 
94
122
  ##
95
- # ====== Overview
123
+ # Destructive version of #replace_plot.
124
+ #
125
+ # @return [Multiplot] self
126
+ # @example
127
+ # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
128
+ # mp.replace_plot!(Plot.new('exp(x)', title: 'exp instead of sin'))
129
+ # # mp IS affected
130
+ def replace_plot!(position = 0, plot)
131
+ @plots = @plots.set(position, plot)
132
+ self
133
+ end
134
+
135
+ alias_method :replace!, :replace_plot!
136
+ alias_method :[]=, :replace_plot!
137
+
138
+ ##
96
139
  # Create new Multiplot with given *plots* added before plot at given *position*.
97
140
  # (by default it adds plot at the front).
98
- # ====== Arguments
99
- # * *position* - position before which you want to add a plot
100
- # * *plots* - sequence of plots you want to add
101
- # ====== Example
141
+ #
142
+ # @param position [Integer] position of plot which you need to replace
143
+ # (by default first plot is replace)
144
+ # @param plots [Sequence of Plot or Splot] plots you want to add
145
+ # @return [Multiplot] self
146
+ # @example
102
147
  # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
103
148
  # enlarged_mp = mp.add_plots(Plot.new('exp(x)')).layout([3,1])
149
+ # # mp IS NOT affected
104
150
  def add_plots(*plots)
105
151
  plots.unshift(0) unless plots[0].is_a?(Numeric)
106
152
  self.class.new(@plots.insert(*plots), @options)
@@ -111,14 +157,33 @@ module GnuplotRB
111
157
  alias_method :add, :add_plots
112
158
 
113
159
  ##
114
- # ====== Overview
160
+ # Destructive version of #add_plots.
161
+ #
162
+ # @return [Multiplot] self
163
+ # @example
164
+ # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
165
+ # mp.add_plots!(Plot.new('exp(x)')).layout([3,1])
166
+ # # mp IS affected
167
+ def add_plots!(*plots)
168
+ plots.unshift(0) unless plots[0].is_a?(Numeric)
169
+ @plots = @plots.insert(*plots)
170
+ self
171
+ end
172
+
173
+ alias_method :add_plot!, :add_plots!
174
+ alias_method :add!, :add_plots!
175
+
176
+ ##
115
177
  # Create new Multiplot without plot at given position
116
178
  # (by default last plot is removed).
117
- # ====== Arguments
118
- # * *position* - position of plot you want to remove
119
- # ====== Example
179
+ #
180
+ # @param position [Integer] position of plot which you need to remove
181
+ # (by default last plot is removed)
182
+ # @return [Multiplot] self
183
+ # @example
120
184
  # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
121
185
  # mp_with_only_cos = mp.remove_plot(0)
186
+ # # mp IS NOT affected
122
187
  def remove_plot(position = -1)
123
188
  self.class.new(@plots.delete_at(position), @options)
124
189
  end
@@ -126,7 +191,21 @@ module GnuplotRB
126
191
  alias_method :remove, :remove_plot
127
192
 
128
193
  ##
129
- # ====== Overview
194
+ # Destructive version of #remove_plot.
195
+ #
196
+ # @return [Multiplot] self
197
+ # @example
198
+ # mp = Multiplot.new(Plot.new('sin(x)'), Plot.new('cos(x)'), layout: [2,1])
199
+ # mp.remove_plot!(0)
200
+ # # mp IS affected
201
+ def remove_plot!(position = -1)
202
+ @plots = @plots.delete_at(position)
203
+ self
204
+ end
205
+
206
+ alias_method :remove!, :remove_plot!
207
+
208
+ ##
130
209
  # Equal to #plots[*args]
131
210
  def [](*args)
132
211
  @plots[*args]