gnuplotrb 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +66 -3
- data/Rakefile +3 -4
- data/gnuplotrb.gemspec +1 -1
- data/lib/gnuplotrb.rb +5 -0
- data/lib/gnuplotrb/animation.rb +36 -9
- data/lib/gnuplotrb/external_classes/array.rb +1 -0
- data/lib/gnuplotrb/external_classes/daru.rb +8 -0
- data/lib/gnuplotrb/external_classes/string.rb +2 -3
- data/lib/gnuplotrb/fit.rb +188 -160
- data/lib/gnuplotrb/mixins/error_handling.rb +6 -4
- data/lib/gnuplotrb/mixins/option_handling.rb +60 -34
- data/lib/gnuplotrb/mixins/plottable.rb +109 -26
- data/lib/gnuplotrb/multiplot.rb +123 -44
- data/lib/gnuplotrb/plot.rb +145 -42
- data/lib/gnuplotrb/splot.rb +8 -8
- data/lib/gnuplotrb/staff/datablock.rb +54 -12
- data/lib/gnuplotrb/staff/dataset.rb +118 -48
- data/lib/gnuplotrb/staff/settings.rb +24 -21
- data/lib/gnuplotrb/staff/terminal.rb +68 -34
- data/lib/gnuplotrb/version.rb +3 -1
- metadata +7 -6
@@ -1,35 +1,39 @@
|
|
1
1
|
module GnuplotRB
|
2
2
|
##
|
3
|
-
# This module takes care of path to gnuplot executable
|
4
|
-
# and checking its version.
|
3
|
+
# This module takes care of path to gnuplot executable and checking its version.
|
5
4
|
module Settings
|
6
5
|
##
|
7
|
-
#
|
8
|
-
# required to have modern gnuplot installed.
|
6
|
+
# GnuplotRB can work with Gnuplot 5.0+
|
9
7
|
MIN_GNUPLOT_VERSION = 5.0
|
10
8
|
|
11
9
|
class << self
|
12
10
|
##
|
13
|
-
# Max fit dely is used inside fit function.
|
14
|
-
# If it waits for output more than max_fit_delay seconds
|
15
|
-
# this behaviour is considered as errorneus.
|
16
11
|
# For heavy calculations max_fit_delay may be increased.
|
17
12
|
attr_writer :max_fit_delay
|
13
|
+
##
|
14
|
+
# Get max fit delay.
|
15
|
+
#
|
16
|
+
# Max fit delay (5s by default) is used inside Fit::fit function.
|
17
|
+
# If it waits for output more than max_fit_delay seconds
|
18
|
+
# this behaviour is considered as errorneus.
|
19
|
+
# @return [Integer] seconds to wait for output
|
18
20
|
def max_fit_delay
|
19
21
|
@max_fit_delay ||= 5
|
20
22
|
end
|
23
|
+
|
21
24
|
##
|
22
|
-
# ====== Overview
|
23
25
|
# Get path that should be used to run gnuplot executable.
|
24
|
-
# Default value: 'gnuplot'
|
26
|
+
# Default value: 'gnuplot'.
|
27
|
+
# @return [String] path to gnuplot executable
|
25
28
|
def gnuplot_path
|
26
29
|
self.gnuplot_path = 'gnuplot' unless defined?(@gnuplot_path)
|
27
30
|
@gnuplot_path
|
28
31
|
end
|
29
32
|
|
30
33
|
##
|
31
|
-
# ====== Overview
|
32
34
|
# Set path to gnuplot executable.
|
35
|
+
# @param path [String] path to gnuplot executable
|
36
|
+
# @return given path
|
33
37
|
def gnuplot_path=(path)
|
34
38
|
validate_version(path)
|
35
39
|
opts = { stdin_data: "set term\n" }
|
@@ -41,29 +45,28 @@ module GnuplotRB
|
|
41
45
|
end
|
42
46
|
|
43
47
|
##
|
44
|
-
#
|
45
|
-
#
|
46
|
-
# available for that gnuplot.
|
48
|
+
# Get list of terminals (png, html, qt, jpeg etc) available for this gnuplot.
|
49
|
+
# @return [Array of String] array of terminals available for this gnuplot
|
47
50
|
def available_terminals
|
48
51
|
gnuplot_path
|
49
52
|
@available_terminals
|
50
53
|
end
|
51
54
|
|
52
55
|
##
|
53
|
-
#
|
54
|
-
#
|
55
|
-
# gnuplot executable.
|
56
|
+
# Get gnuplot version. Uses gnuplot_path to find gnuplot executable.
|
57
|
+
# @return [Numeric] gnuplot version
|
56
58
|
def version
|
57
59
|
gnuplot_path
|
58
60
|
@version
|
59
61
|
end
|
60
62
|
|
61
63
|
##
|
62
|
-
#
|
63
|
-
#
|
64
|
-
# version with ::MIN_GNUPLOT_VERSION.
|
65
|
-
#
|
66
|
-
#
|
64
|
+
# @private
|
65
|
+
# Validate gnuplot version. Compares current gnuplot's
|
66
|
+
# version with ::MIN_GNUPLOT_VERSION. Throws exception if version is
|
67
|
+
# less than min.
|
68
|
+
#
|
69
|
+
# @param path [String] path to gnuplot executable
|
67
70
|
def validate_version(path)
|
68
71
|
@version = IO.popen("#{path} --version")
|
69
72
|
.read
|
@@ -1,33 +1,49 @@
|
|
1
1
|
module GnuplotRB
|
2
2
|
##
|
3
|
-
# === Overview
|
4
3
|
# Terminal keeps open pipe to gnuplot process, cares about naming in-memory
|
5
4
|
# datablocks (just indexing with sequential integers). All the output
|
6
5
|
# to gnuplot handled by this class. Terminal also handles options passed
|
7
6
|
# to gnuplot as 'set key value'.
|
8
7
|
class Terminal
|
9
8
|
include ErrorHandling
|
9
|
+
|
10
|
+
# order is important for some options
|
10
11
|
OPTION_ORDER = [:term, :output, :multiplot, :timefmt, :xrange]
|
11
12
|
|
13
|
+
private_constant :OPTION_ORDER
|
14
|
+
|
12
15
|
class << self
|
13
16
|
##
|
14
17
|
# Close given gnuplot pipe
|
18
|
+
# @param stream [IO] pipe to close
|
15
19
|
def close_arg(stream)
|
16
20
|
stream.puts
|
17
21
|
stream.puts 'exit'
|
18
22
|
Process.waitpid(stream.pid)
|
19
23
|
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Plot test page for given term_name into file
|
27
|
+
# with file_name (optional).
|
28
|
+
#
|
29
|
+
# Test page contains possibilities of the term.
|
30
|
+
# @param term_name [String] terminal name ('png', 'gif', 'svg' etc)
|
31
|
+
# @param file_name [String] filename to output image if needed
|
32
|
+
# and chosen terminal supports image output
|
33
|
+
# @return nil
|
34
|
+
def test(term_name, file_name = nil)
|
35
|
+
Terminal.new.set(term: term_name).test(file_name)
|
36
|
+
end
|
20
37
|
end
|
21
38
|
|
22
39
|
##
|
23
|
-
#
|
24
|
-
# Creates new Terminal connected with gnuplot.
|
40
|
+
# Create new Terminal connected with gnuplot.
|
25
41
|
# Uses Settings::gnuplot_path to find gnuplot
|
26
42
|
# executable. Each time you create Terminal it starts new
|
27
43
|
# gnuplot subprocess which is closed after GC deletes
|
28
44
|
# linked Terminal object.
|
29
|
-
#
|
30
|
-
#
|
45
|
+
#
|
46
|
+
# @param :persist [Boolean] gnuplot's "-persist" option
|
31
47
|
def initialize(persist: false)
|
32
48
|
@cmd = Settings.gnuplot_path
|
33
49
|
@current_datablock = 0
|
@@ -41,11 +57,10 @@ module GnuplotRB
|
|
41
57
|
end
|
42
58
|
|
43
59
|
##
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
# ====== Examples
|
60
|
+
# Output datablock to this gnuplot terminal.
|
61
|
+
#
|
62
|
+
# @param data [String] data stored in datablock
|
63
|
+
# @example
|
49
64
|
# data = "1 1\n2 4\n3 9"
|
50
65
|
# Terminal.new.store_datablock(data)
|
51
66
|
# #=> returns '$DATA1'
|
@@ -64,14 +79,15 @@ module GnuplotRB
|
|
64
79
|
end
|
65
80
|
|
66
81
|
##
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
82
|
+
# Convert given options to gnuplot format.
|
83
|
+
#
|
84
|
+
# For "{ opt1: val1, .. , optN: valN }" it returns
|
70
85
|
# set opt1 val1
|
71
86
|
# ..
|
72
87
|
# set optN valN
|
73
|
-
#
|
74
|
-
#
|
88
|
+
#
|
89
|
+
# @param ptions [Hash] options to convert
|
90
|
+
# @return [String] options in Gnuplot format
|
75
91
|
def options_hash_to_string(options)
|
76
92
|
result = ''
|
77
93
|
options.sort_by { |key, _| OPTION_ORDER.find_index(key) || -1 }.each do |key, value|
|
@@ -85,15 +101,16 @@ module GnuplotRB
|
|
85
101
|
end
|
86
102
|
|
87
103
|
##
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
104
|
+
# Applie given options to current gnuplot instance.
|
105
|
+
#
|
106
|
+
# For "{ opt1: val1, .. , optN: valN }" it will output to gnuplot
|
91
107
|
# set opt1 val1
|
92
108
|
# ..
|
93
109
|
# set optN valN
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
110
|
+
#
|
111
|
+
# @param options [Hash] options to set
|
112
|
+
# @return [Terminal] self
|
113
|
+
# @example
|
97
114
|
# set({term: ['qt', size: [100, 100]]})
|
98
115
|
# #=> outputs to gnuplot: "set term qt size 100,100\n"
|
99
116
|
def set(options)
|
@@ -102,10 +119,10 @@ module GnuplotRB
|
|
102
119
|
end
|
103
120
|
|
104
121
|
##
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
122
|
+
# Unset options
|
123
|
+
#
|
124
|
+
# @param *options [Sequence of Symbol] each symbol considered as option key
|
125
|
+
# @return [Terminal] self
|
109
126
|
def unset(*options)
|
110
127
|
options.flatten
|
111
128
|
.sort_by { |key| OPTION_ORDER.find_index(key) || -1 }
|
@@ -114,9 +131,10 @@ module GnuplotRB
|
|
114
131
|
end
|
115
132
|
|
116
133
|
##
|
117
|
-
# ====== Overview
|
118
134
|
# Short way to plot Datablock, Plot or Splot object.
|
119
135
|
# Other items will be just piped out to gnuplot.
|
136
|
+
# @param item Object that should be outputted to Gnuplot
|
137
|
+
# @return [Terminal] self
|
120
138
|
def <<(item)
|
121
139
|
if item.is_a? Plottable
|
122
140
|
item.plot(self)
|
@@ -127,17 +145,17 @@ module GnuplotRB
|
|
127
145
|
end
|
128
146
|
|
129
147
|
##
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
148
|
+
# Just put *command* + "\n" to gnuplot pipe.
|
149
|
+
# @param command [String] command to send
|
150
|
+
# @return [Terminal] self
|
133
151
|
def stream_puts(command)
|
134
152
|
stream_print("#{command}\n")
|
135
153
|
end
|
136
154
|
|
137
155
|
##
|
138
|
-
#
|
139
|
-
#
|
140
|
-
#
|
156
|
+
# Just print *command* to gnuplot pipe.
|
157
|
+
# @param command [String] command to send
|
158
|
+
# @return [Terminal] self
|
141
159
|
def stream_print(command)
|
142
160
|
check_errors
|
143
161
|
@in.print(command)
|
@@ -145,9 +163,11 @@ module GnuplotRB
|
|
145
163
|
end
|
146
164
|
|
147
165
|
##
|
148
|
-
#
|
166
|
+
# @deprecated
|
149
167
|
# Call replot on gnuplot. This will execute last plot once again
|
150
168
|
# with rereading data.
|
169
|
+
# @param options [Hash] options will be set before replotting
|
170
|
+
# @return [Terminal] self
|
151
171
|
def replot(**options)
|
152
172
|
set(options)
|
153
173
|
stream_puts('replot')
|
@@ -157,12 +177,26 @@ module GnuplotRB
|
|
157
177
|
end
|
158
178
|
|
159
179
|
##
|
160
|
-
# ====== Overview
|
161
180
|
# Send gnuplot command to turn it off and for its Process to quit.
|
162
181
|
# Closes pipe so Terminal object should not be used after #close call.
|
163
182
|
def close
|
164
183
|
check_errors
|
165
184
|
Terminal.close_arg(@in)
|
166
185
|
end
|
186
|
+
|
187
|
+
|
188
|
+
##
|
189
|
+
# Plot test page into file with file_name (optional).
|
190
|
+
#
|
191
|
+
# Test page contains possibilities of the term.
|
192
|
+
# @param file_name [String] filename to output image if needed
|
193
|
+
# and chosen terminal supports image output
|
194
|
+
# @return nil
|
195
|
+
def test(file_name = nil)
|
196
|
+
set(output: file_name) if file_name
|
197
|
+
stream_puts('test')
|
198
|
+
unset(:output)
|
199
|
+
nil
|
200
|
+
end
|
167
201
|
end
|
168
202
|
end
|
data/lib/gnuplotrb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gnuplotrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Evgrafov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hamster
|
@@ -67,19 +67,19 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: yard
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0.8'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '0.8'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,8 +185,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
185
|
version: '0'
|
186
186
|
requirements: []
|
187
187
|
rubyforge_project:
|
188
|
-
rubygems_version: 2.
|
188
|
+
rubygems_version: 2.2.3
|
189
189
|
signing_key:
|
190
190
|
specification_version: 4
|
191
191
|
summary: Ruby bindings for gnuplot
|
192
192
|
test_files: []
|
193
|
+
has_rdoc:
|