gnuplotrb 0.3.1 → 0.3.2

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.
@@ -1,190 +1,190 @@
1
- module GnuplotRB
2
- ##
3
- # This module contains methods which are mixed into several classes
4
- # to set, get and convert their options.
5
- module OptionHandling
6
- class << self
7
- # Some values of options should be quoted to be read by gnuplot properly
8
- #
9
- # @todo update list with data from gnuplot documentation !!!
10
- QUOTED_OPTIONS = %w(
11
- title
12
- output
13
- xlabel
14
- x2label
15
- ylabel
16
- y2label
17
- clabel
18
- cblabel
19
- zlabel
20
- rgb
21
- font
22
- background
23
- format
24
- format_x
25
- format_y
26
- format_xy
27
- format_x2
28
- format_y2
29
- format_z
30
- format_cb
31
- timefmt
32
- dt
33
- dashtype
34
- )
35
-
36
- private_constant :QUOTED_OPTIONS
37
-
38
- ##
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 ' '
43
- def string_key(key)
44
- key.to_s.gsub(/_/) { ' ' } + ' '
45
- end
46
-
47
- ##
48
- # Recursive function that converts Ruby option to gnuplot string
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'
59
- def option_to_string(key = nil, option)
60
- return string_key(key) if !!option == option # check for boolean
61
- value = ruby_class_to_gnuplot(option)
62
- value = "\"#{value}\"" if QUOTED_OPTIONS.include?(key.to_s)
63
- ## :+ here is necessary, because using #{value} will remove quotes
64
- value = string_key(key) + value if key
65
- value
66
- end
67
-
68
- ##
69
- # @private
70
- # Method for inner use.
71
- # Needed to convert several ruby classes into
72
- # value that should be piped to gnuplot.
73
- def ruby_class_to_gnuplot(option_object)
74
- case option_object
75
- when Array
76
- option_object.map { |el| option_to_string(el) }
77
- .join(option_object[0].is_a?(Numeric) ? ',' : ' ')
78
- when Hash
79
- option_object.map { |i_key, i_val| option_to_string(i_key, i_val) }
80
- .join(' ')
81
- when Range
82
- "[#{option_object.begin}:#{option_object.end}]"
83
- else
84
- option_object.to_s
85
- end
86
- end
87
-
88
- ##
89
- # Check if given terminal available for use.
90
- #
91
- # @param terminal [String] terminal to check (e.g. 'png', 'qt', 'gif')
92
- # @return [Boolean] true or false
93
- def valid_terminal?(terminal)
94
- Settings.available_terminals.include?(terminal)
95
- end
96
-
97
- ##
98
- # Check if given options are valid for gnuplot.
99
- # Raises ArgumentError if invalid options found.
100
- # Now checks only terminal name.
101
- #
102
- # @param options [Hash] options to check (e.g. "{ term: 'qt', title: 'Plot title' }")
103
- def validate_terminal_options(options)
104
- terminal = options[:term]
105
- return unless terminal
106
- terminal = terminal[0] if terminal.is_a?(Array)
107
- message = 'Seems like your Gnuplot does not ' \
108
- "support that terminal (#{terminal}), please see " \
109
- 'supported terminals with Settings::available_terminals'
110
- fail(ArgumentError, message) unless valid_terminal?(terminal)
111
- end
112
- end
113
-
114
- ##
115
- # @private
116
- # You should implement #initialize in classes that use OptionsHelper
117
- def initialize(*_)
118
- fail NotImplementedError, 'You should implement #initialize' \
119
- ' in classes that use OptionsHelper!'
120
- end
121
-
122
- ##
123
- # @private
124
- # You should implement #new_with_options in classes that use OptionsHelper
125
- def new_with_options(*_)
126
- fail NotImplementedError, 'You should implement #new_with_options' \
127
- ' in classes that use OptionsHelper!'
128
- end
129
-
130
- ##
131
- # Create new Plot (or Dataset or Splot or Multiplot) object where current
132
- # options are merged with given. If no options
133
- # given it will just return existing set of options.
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
139
- # sin_graph = Plot.new(['sin(x)', title: 'Sin'], title: 'Sin on [0:3]', xrange: 0..3)
140
- # sin_graph.plot
141
- # sin_graph_update = sin_graph.options(title: 'Sin on [-10:10]', xrange: -10..10)
142
- # sin_graph_update.plot
143
- # # sin_graph IS NOT affected
144
- def options(**options)
145
- @options ||= Hamster::Hash.new
146
- if options.empty?
147
- @options
148
- else
149
- new_with_options(@options.merge(options))
150
- end
151
- end
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
-
169
- private
170
-
171
- ##
172
- # Return current option value if no value given. Create new
173
- # object with given option set if value given.
174
- def option(key, *value)
175
- if value.empty?
176
- value = options[key]
177
- value = value[0] if value && value.size == 1
178
- value
179
- else
180
- options(key => value)
181
- end
182
- end
183
-
184
- ##
185
- # Just set an option.
186
- def option!(key, *value)
187
- options!(key => value)
188
- end
189
- end
190
- end
1
+ module GnuplotRB
2
+ ##
3
+ # This module contains methods which are mixed into several classes
4
+ # to set, get and convert their options.
5
+ module OptionHandling
6
+ class << self
7
+ # Some values of options should be quoted to be read by gnuplot properly
8
+ #
9
+ # @todo update list with data from gnuplot documentation !!!
10
+ QUOTED_OPTIONS = %w(
11
+ title
12
+ output
13
+ xlabel
14
+ x2label
15
+ ylabel
16
+ y2label
17
+ clabel
18
+ cblabel
19
+ zlabel
20
+ rgb
21
+ font
22
+ background
23
+ format
24
+ format_x
25
+ format_y
26
+ format_xy
27
+ format_x2
28
+ format_y2
29
+ format_z
30
+ format_cb
31
+ timefmt
32
+ dt
33
+ dashtype
34
+ )
35
+
36
+ private_constant :QUOTED_OPTIONS
37
+
38
+ ##
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 ' '
43
+ def string_key(key)
44
+ key.to_s.gsub(/_/) { ' ' } + ' '
45
+ end
46
+
47
+ ##
48
+ # Recursive function that converts Ruby option to gnuplot string
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'
59
+ def option_to_string(key = nil, option)
60
+ return string_key(key) if !!option == option # check for boolean
61
+ value = ruby_class_to_gnuplot(option)
62
+ value = "\"#{value}\"" if QUOTED_OPTIONS.include?(key.to_s)
63
+ ## :+ here is necessary, because using #{value} will remove quotes
64
+ value = string_key(key) + value if key
65
+ value
66
+ end
67
+
68
+ ##
69
+ # @private
70
+ # Method for inner use.
71
+ # Needed to convert several ruby classes into
72
+ # value that should be piped to gnuplot.
73
+ def ruby_class_to_gnuplot(option_object)
74
+ case option_object
75
+ when Array
76
+ option_object.map { |el| option_to_string(el) }
77
+ .join(option_object[0].is_a?(Numeric) ? ',' : ' ')
78
+ when Hash
79
+ option_object.map { |i_key, i_val| option_to_string(i_key, i_val) }
80
+ .join(' ')
81
+ when Range
82
+ "[#{option_object.begin}:#{option_object.end}]"
83
+ else
84
+ option_object.to_s
85
+ end
86
+ end
87
+
88
+ ##
89
+ # Check if given terminal available for use.
90
+ #
91
+ # @param terminal [String] terminal to check (e.g. 'png', 'qt', 'gif')
92
+ # @return [Boolean] true or false
93
+ def valid_terminal?(terminal)
94
+ Settings.available_terminals.include?(terminal)
95
+ end
96
+
97
+ ##
98
+ # Check if given options are valid for gnuplot.
99
+ # Raises ArgumentError if invalid options found.
100
+ # Now checks only terminal name.
101
+ #
102
+ # @param options [Hash] options to check (e.g. "{ term: 'qt', title: 'Plot title' }")
103
+ def validate_terminal_options(options)
104
+ terminal = options[:term]
105
+ return unless terminal
106
+ terminal = terminal[0] if terminal.is_a?(Array)
107
+ message = 'Seems like your Gnuplot does not ' \
108
+ "support that terminal (#{terminal}), please see " \
109
+ 'supported terminals with Settings::available_terminals'
110
+ fail(ArgumentError, message) unless valid_terminal?(terminal)
111
+ end
112
+ end
113
+
114
+ ##
115
+ # @private
116
+ # You should implement #initialize in classes that use OptionsHelper
117
+ def initialize(*_)
118
+ fail NotImplementedError, 'You should implement #initialize' \
119
+ ' in classes that use OptionsHelper!'
120
+ end
121
+
122
+ ##
123
+ # @private
124
+ # You should implement #new_with_options in classes that use OptionsHelper
125
+ def new_with_options(*_)
126
+ fail NotImplementedError, 'You should implement #new_with_options' \
127
+ ' in classes that use OptionsHelper!'
128
+ end
129
+
130
+ ##
131
+ # Create new Plot (or Dataset or Splot or Multiplot) object where current
132
+ # options are merged with given. If no options
133
+ # given it will just return existing set of options.
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
139
+ # sin_graph = Plot.new(['sin(x)', title: 'Sin'], title: 'Sin on [0:3]', xrange: 0..3)
140
+ # sin_graph.plot
141
+ # sin_graph_update = sin_graph.options(title: 'Sin on [-10:10]', xrange: -10..10)
142
+ # sin_graph_update.plot
143
+ # # sin_graph IS NOT affected
144
+ def options(**options)
145
+ @options ||= Hamster::Hash.new
146
+ if options.empty?
147
+ @options
148
+ else
149
+ new_with_options(@options.merge(options))
150
+ end
151
+ end
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
+
169
+ private
170
+
171
+ ##
172
+ # Return current option value if no value given. Create new
173
+ # object with given option set if value given.
174
+ def option(key, *value)
175
+ if value.empty?
176
+ value = options[key]
177
+ value = value[0] if value && value.size == 1
178
+ value
179
+ else
180
+ options(key => value)
181
+ end
182
+ end
183
+
184
+ ##
185
+ # Just set an option.
186
+ def option!(key, *value)
187
+ options!(key => value)
188
+ end
189
+ end
190
+ end
@@ -1,208 +1,208 @@
1
- module GnuplotRB
2
- ##
3
- # This module contains methods that should be mixed into
4
- # plottable classes. It includes OptionHandling and
5
- # implements several plotting methods.
6
- module Plottable
7
- include OptionHandling
8
-
9
- ##
10
- # @private
11
- # You should implement #plot in classes that are Plottable
12
- def plot(*_)
13
- fail NotImplementedError, 'You should implement #plot in classes that are Plottable!'
14
- end
15
-
16
- ##
17
- # In this gem #method_missing is used both to handle
18
- # options and to handle plotting to specific terminal.
19
- #
20
- # == Options handling
21
- # === Overview
22
- # You may set options using #option_name(option_value) method.
23
- # A new object will be constructed with selected option set.
24
- # And finally you can get current value of any option using
25
- # #options_name without arguments.
26
- # === Arguments
27
- # * *option_value* - value to set an option. If none given
28
- # method will just return current option's value
29
- # === Examples
30
- # plot = Splot.new
31
- # new_plot = plot.title('Awesome plot')
32
- # plot.title #=> nil
33
- # new_plot.title #=> 'Awesome plot'
34
- #
35
- # == Plotting to specific term
36
- # === Overview
37
- # Gnuplot offers possibility to output graphics to many image formats.
38
- # The easiest way to to so is to use #to_<plot_name> methods.
39
- # === Arguments
40
- # * *options* - set of options related to terminal (size, font etc).
41
- # Be careful, some terminals have their own specific options.
42
- # === Examples
43
- # # font options specific for png term
44
- # multiplot.to_png('./result.png', size: [300, 500], font: ['arial', 12])
45
- # # font options specific for svg term
46
- # content = multiplot.to_svg(size: [100, 100], fname: 'Arial', fsize: 12)
47
- def method_missing(meth_id, *args)
48
- meth = meth_id.id2name
49
- case
50
- when meth[0..2] == 'to_'
51
- term = meth[3..-1]
52
- super unless OptionHandling.valid_terminal?(term)
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)
59
- else
60
- option(meth_id, *args)
61
- end
62
- end
63
-
64
- ##
65
- # @return [true] for existing methods and
66
- # #to_|term_name| when name is a valid terminal type.
67
- # @return [false] otherwise
68
- def respond_to?(meth_id)
69
- # Next line is here to force iRuby use #to_iruby
70
- # instead of #to_svg.
71
- return super if defined? IRuby
72
- meth = meth_id.id2name
73
- term = meth[0..2] == 'to_' && OptionHandling.valid_terminal?(meth[3..-1])
74
- term || super
75
- end
76
-
77
- ##
78
- # This method is used to embed plottable objects into iRuby notebooks. There is
79
- # {a notebook}[http://nbviewer.ipython.org/github/dilcom/gnuplotrb/blob/master/notebooks/basic_usage.ipynb]
80
- # with examples of its usage.
81
- def to_iruby
82
- available_terminals = {
83
- 'png' => 'image/png',
84
- 'pngcairo' => 'image/png',
85
- 'jpeg' => 'image/jpeg',
86
- 'svg' => 'image/svg+xml',
87
- 'dumb' => 'text/plain'
88
- }
89
- terminal, options = term.is_a?(Array) ? [term[0], term[1]] : [term, {}]
90
- terminal = 'svg' unless available_terminals.keys.include?(terminal)
91
- [available_terminals[terminal], send("to_#{terminal}".to_sym, **options)]
92
- end
93
-
94
- ##
95
- # @private
96
- # Output plot to specific terminal (possibly some file).
97
- # Explicit use should be avoided. This method is called from #method_missing
98
- # when it handles method names like #to_png(options).
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
102
- # and then read it and return binary contents of file
103
- # @param options [Hash] used in #plot
104
- # @example
105
- # ## plot here may be Plot, Splot, Multiplot or any other plottable class
106
- # plot.to_png('./result.png', size: [300, 500])
107
- # contents = plot.to_svg(size: [100, 100])
108
- # plot.to_dumb('./result.txt', size: [30, 15])
109
- def to_specific_term(terminal, path = nil, **options)
110
- if path
111
- result = plot(term: [terminal, options], output: path)
112
- else
113
- path = Dir::Tmpname.make_tmpname(terminal, 0)
114
- plot(term: [terminal, options], output: path)
115
- result = File.binread(path)
116
- File.delete(path)
117
- end
118
- result
119
- end
120
-
121
- ##
122
- # @return [Terminal] terminal object linked with this Plottable object
123
- def own_terminal
124
- @terminal ||= Terminal.new
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)
207
- end
208
- end
1
+ module GnuplotRB
2
+ ##
3
+ # This module contains methods that should be mixed into
4
+ # plottable classes. It includes OptionHandling and
5
+ # implements several plotting methods.
6
+ module Plottable
7
+ include OptionHandling
8
+
9
+ ##
10
+ # @private
11
+ # You should implement #plot in classes that are Plottable
12
+ def plot(*_)
13
+ fail NotImplementedError, 'You should implement #plot in classes that are Plottable!'
14
+ end
15
+
16
+ ##
17
+ # In this gem #method_missing is used both to handle
18
+ # options and to handle plotting to specific terminal.
19
+ #
20
+ # == Options handling
21
+ # === Overview
22
+ # You may set options using #option_name(option_value) method.
23
+ # A new object will be constructed with selected option set.
24
+ # And finally you can get current value of any option using
25
+ # #options_name without arguments.
26
+ # === Arguments
27
+ # * *option_value* - value to set an option. If none given
28
+ # method will just return current option's value
29
+ # === Examples
30
+ # plot = Splot.new
31
+ # new_plot = plot.title('Awesome plot')
32
+ # plot.title #=> nil
33
+ # new_plot.title #=> 'Awesome plot'
34
+ #
35
+ # == Plotting to specific term
36
+ # === Overview
37
+ # Gnuplot offers possibility to output graphics to many image formats.
38
+ # The easiest way to to so is to use #to_<plot_name> methods.
39
+ # === Arguments
40
+ # * *options* - set of options related to terminal (size, font etc).
41
+ # Be careful, some terminals have their own specific options.
42
+ # === Examples
43
+ # # font options specific for png term
44
+ # multiplot.to_png('./result.png', size: [300, 500], font: ['arial', 12])
45
+ # # font options specific for svg term
46
+ # content = multiplot.to_svg(size: [100, 100], fname: 'Arial', fsize: 12)
47
+ def method_missing(meth_id, *args)
48
+ meth = meth_id.id2name
49
+ case
50
+ when meth[0..2] == 'to_'
51
+ term = meth[3..-1]
52
+ super unless OptionHandling.valid_terminal?(term)
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)
59
+ else
60
+ option(meth_id, *args)
61
+ end
62
+ end
63
+
64
+ ##
65
+ # @return [true] for existing methods and
66
+ # #to_|term_name| when name is a valid terminal type.
67
+ # @return [false] otherwise
68
+ def respond_to?(meth_id)
69
+ # Next line is here to force iRuby use #to_iruby
70
+ # instead of #to_svg.
71
+ return super if defined? IRuby
72
+ meth = meth_id.id2name
73
+ term = meth[0..2] == 'to_' && OptionHandling.valid_terminal?(meth[3..-1])
74
+ term || super
75
+ end
76
+
77
+ ##
78
+ # This method is used to embed plottable objects into iRuby notebooks. There is
79
+ # {a notebook}[http://nbviewer.ipython.org/github/dilcom/gnuplotrb/blob/master/notebooks/basic_usage.ipynb]
80
+ # with examples of its usage.
81
+ def to_iruby
82
+ available_terminals = {
83
+ 'png' => 'image/png',
84
+ 'pngcairo' => 'image/png',
85
+ 'jpeg' => 'image/jpeg',
86
+ 'svg' => 'image/svg+xml',
87
+ 'dumb' => 'text/plain'
88
+ }
89
+ terminal, options = term.is_a?(Array) ? [term[0], term[1]] : [term, {}]
90
+ terminal = 'svg' unless available_terminals.keys.include?(terminal)
91
+ [available_terminals[terminal], send("to_#{terminal}".to_sym, **options)]
92
+ end
93
+
94
+ ##
95
+ # @private
96
+ # Output plot to specific terminal (possibly some file).
97
+ # Explicit use should be avoided. This method is called from #method_missing
98
+ # when it handles method names like #to_png(options).
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
102
+ # and then read it and return binary contents of file
103
+ # @param options [Hash] used in #plot
104
+ # @example
105
+ # ## plot here may be Plot, Splot, Multiplot or any other plottable class
106
+ # plot.to_png('./result.png', size: [300, 500])
107
+ # contents = plot.to_svg(size: [100, 100])
108
+ # plot.to_dumb('./result.txt', size: [30, 15])
109
+ def to_specific_term(terminal, path = nil, **options)
110
+ if path
111
+ result = plot(term: [terminal, options], output: path)
112
+ else
113
+ path = Dir::Tmpname.make_tmpname(terminal, 0)
114
+ plot(term: [terminal, options], output: path)
115
+ result = File.binread(path)
116
+ File.delete(path)
117
+ end
118
+ result
119
+ end
120
+
121
+ ##
122
+ # @return [Terminal] terminal object linked with this Plottable object
123
+ def own_terminal
124
+ @terminal ||= Terminal.new
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)
207
+ end
208
+ end