grada 1.1.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.
Files changed (2) hide show
  1. data/lib/grada.rb +241 -0
  2. metadata +93 -0
data/lib/grada.rb ADDED
@@ -0,0 +1,241 @@
1
+ require 'gnuplot'
2
+
3
+ class Grada
4
+ # Not valid the format of the object to construct the graph
5
+ #
6
+ class NotValidArrayError < RuntimeError; end
7
+
8
+ # Not valid the content of the array you're passing to build the graph
9
+ #
10
+ class NotValidDataError < RuntimeError; end
11
+
12
+ # Can't build the plot
13
+ #
14
+ class NoPlotDataError < RuntimeError; end
15
+
16
+ attr_reader :x
17
+ attr_reader :y
18
+
19
+ DEFAULT_OPTIONS = {width: 1600,
20
+ height: 400,
21
+ title: "Graph",
22
+ x_label: "X",
23
+ y_label: "Y",
24
+ with: 'lines',
25
+ graph_type: :default}
26
+
27
+ # Hello GraDA
28
+ #
29
+
30
+ def self.hi
31
+ puts "Hello GraDA"
32
+ end
33
+
34
+ # Initialize object with the data you want to plot.
35
+ # It can vary depending on the type of graph.
36
+ # The second argument is optional.
37
+ #
38
+ # Example:
39
+ # >> radiation_levels_median_per_day = [0.001,0.01,1,10,1000]
40
+ # >> radiation_days = [0,1,2,3,4]
41
+ # >> grada = Grada.new(radiation_days, radiation_levels_median_per_day)
42
+ # => #<Grada:0x007f962a8dc9b8 @x=[0, 1, 2, 3, 4], @y=[0.001, 0.01, 1, 10, 1000]>
43
+ # Arguments:
44
+ # x: (Array)
45
+ # y: (Array) *optional*
46
+
47
+ def initialize(x, y = nil)
48
+
49
+ @x = validate(x)
50
+ @y = y.nil? ? y : validate(y)
51
+ end
52
+
53
+ # Displays a graph in a window.
54
+ # You can specify all the options that you need:
55
+ # *width* (Integer)
56
+ # *height* (Integer)
57
+ # *title* (Integer)
58
+ # *x_label* (String)
59
+ # *y_label* (String)
60
+ # *graph_type* (:histogram, :heatmap) default: :default
61
+ # *with* ('points', 'linespoints') default: 'lines'
62
+ #
63
+ #
64
+ # Example:
65
+ # >> grada.display
66
+ # => ""
67
+ # >> grada.display({ title: 'Atomic Device X', x_label: 'Day', y_label: 'smSv', with: 'points' })
68
+ # => ""
69
+ # Arguments:
70
+ # opts: (Hash) *optional*
71
+
72
+ def display(opts = {})
73
+ @opts = DEFAULT_OPTIONS.merge(opts)
74
+
75
+ if @opts[:graph_type] == :histogram
76
+ population_data?(@x)
77
+
78
+ plot_histogram do |plot|
79
+ plot.set "terminal x11 size #{@opts[:width]},#{@opts[:height]}"
80
+ end
81
+ elsif @opts[:graph_type] == :heatmap
82
+ Matrix.columns(@x) rescue raise NoPlotDataError
83
+ @opts[:with] = 'image'
84
+
85
+ plot_heat_map
86
+ else
87
+ raise NoPlotDataError if @y.nil?
88
+
89
+ plot_and do |plot|
90
+ plot.set "terminal x11 size #{@opts[:width]},#{@opts[:height]}"
91
+ end
92
+ end
93
+ end
94
+
95
+ # Save the graph in a png file.
96
+ # You can specify all the options that you need as _display_ but also need to specify the file
97
+ #
98
+ # Example:
99
+ # >> grada.save({ filename: 'secret/radiation_levels/ffa/zonex/devicex/radiation_level_malaga.png' ,title: 'Atomic Device X', x_label: 'Day', y_label: 'smSv', with: 'points' })
100
+ # => ""
101
+ # Arguments:
102
+ # opts: (Hash) *optional*
103
+
104
+ def save(opts = {})
105
+ @opts = DEFAULT_OPTIONS.merge(opts)
106
+
107
+ return nil if @opts[:filename].nil?
108
+
109
+ if @opts[:graph_type] == :histogram
110
+ population_data?(@x)
111
+
112
+ plot_histogram do |plot|
113
+ plot.output @opts[:filename]
114
+ plot.set "terminal x11 size #{@opts[:width]},#{@opts[:height]}"
115
+ plot.terminal 'png'
116
+ end
117
+ elsif @opts[:graph_type] == :heatmap
118
+ Matrix.columns(@x) rescue raise NoPlotDataError
119
+ @opts[:with] = 'image'
120
+
121
+ plot_heat_map do |plot|
122
+ plot.output @opts[:filename]
123
+ plot.terminal 'png'
124
+ end
125
+ else
126
+ raise NoPlotDataError if @y.nil?
127
+
128
+ plot_and do |plot|
129
+ plot.output @opts[:filename]
130
+ plot.set "terminal x11 size #{@opts[:width]*10},#{@opts[:height]}"
131
+ plot.terminal 'png'
132
+ end
133
+ end
134
+ end
135
+
136
+ private
137
+
138
+ def validate(l)
139
+ raise NotValidArrayError if ! l.is_a?(Array)
140
+
141
+ l.each do |elem|
142
+ raise NotValidDataError if ! ( elem.is_a?(Float) || elem.is_a?(Integer) || elem.is_a?(Array) || elem.is_a?(Hash))
143
+ end
144
+ end
145
+
146
+ def population_data?(l)
147
+ raise NotValidArrayError if ! l.is_a?(Array)
148
+
149
+ l.each do |elem|
150
+ raise NotValidDataError if ! ( elem.is_a?(Float) || elem.is_a?(Integer))
151
+ end
152
+ end
153
+
154
+ def multiple_data?(l)
155
+ if l.is_a?(Array)
156
+ l.each do |elem|
157
+ return false if ! elem.is_a?(Hash)
158
+ end
159
+
160
+ return true
161
+ end
162
+
163
+ false
164
+ end
165
+
166
+ def plot_and(&block)
167
+ ::Gnuplot.open do |gp|
168
+ ::Gnuplot::Plot.new(gp) do |plot|
169
+ block[plot] if block
170
+
171
+ plot.title @opts[:title]
172
+
173
+ plot.xlabel @opts[:x_label]
174
+ plot.ylabel @opts[:y_label]
175
+
176
+ if multiple_data?(@y)
177
+ @y.each do |dic|
178
+ dic.each do |k, v|
179
+ if k.to_sym != :with
180
+ raise NoPlotDataError if ! v.nil? && @x.size != v.size
181
+
182
+ plot.data << ::Gnuplot::DataSet.new([@x,v]) do |ds|
183
+ ds.with = dic[:with] || @opts[:with]
184
+ ds.title = "#{k}"
185
+ end
186
+ end
187
+ end
188
+ end
189
+ else
190
+ raise NoPlotDataError if ! @y.nil? && @x.size != @y.size
191
+
192
+ plot.data << ::Gnuplot::DataSet.new([@x,@y]) do |ds|
193
+ ds.with = @opts[:with]
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ def plot_histogram(&block)
201
+ ::Gnuplot.open do |gp|
202
+ ::Gnuplot::Plot.new(gp) do |plot|
203
+ block[plot] if block
204
+
205
+ plot.title @opts[:title]
206
+
207
+ plot.set "style data histogram"
208
+ plot.xlabel @opts[:x_label]
209
+ plot.ylabel "Frecuency"
210
+
211
+ x = @x.sort.group_by { |xi| xi }.map{|k,v| v.count }
212
+
213
+ plot.data << ::Gnuplot::DataSet.new(x) do |ds|
214
+ ds.with = @opts[:with]
215
+ end
216
+ end
217
+ end
218
+ end
219
+
220
+ def plot_heat_map(&block)
221
+ ::Gnuplot.open do |gp|
222
+ ::Gnuplot::Plot.new(gp) do |plot|
223
+ block[plot] if block
224
+
225
+ plot.set "pm3d map"
226
+ plot.set "palette color"
227
+ plot.set "xrange [0:#{@x.size-1}]"
228
+ plot.set "yrange [0:#{@x.size-1}]"
229
+ plot.set "cbrange [#{@opts[:min]}:#{@opts[:max]}]"
230
+ plot.set "cblabel \"#{@opts[:x_label]}\""
231
+ plot.set "palette model RGB"
232
+ plot.set "palette define"
233
+
234
+ plot.title @opts[:title]
235
+ plot.data = [::Gnuplot::DataSet.new(Matrix.columns(@x)) do |ds|
236
+ ds.with = @opts[:with]
237
+ end]
238
+ end
239
+ end
240
+ end
241
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grada
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Enrique Figuerola
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.11.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.11.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: gnuplot
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 2.6.2
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.6.2
62
+ description: Graphic Data Analysis gem
63
+ email: hard_rock15@msn.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - lib/grada.rb
69
+ homepage: https://github.com/emfigo/grada
70
+ licenses: []
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 1.8.23
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: GraDA
93
+ test_files: []