sparklines 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/sparklines.rb +121 -60
  2. data/test/test_all.rb +33 -0
  3. metadata +8 -8
data/lib/sparklines.rb CHANGED
@@ -74,7 +74,7 @@ Licensed under the MIT license.
74
74
  =end
75
75
  class Sparklines
76
76
 
77
- VERSION = '0.4.1'
77
+ VERSION = '0.4.2'
78
78
 
79
79
  @@label_margin = 5.0
80
80
  @@pointsize = 10.0
@@ -101,10 +101,12 @@ class Sparklines
101
101
  :min_color => 'blue',
102
102
  :max_color => 'green',
103
103
  :last_color => 'red',
104
+ :std_dev_color => '#efefef',
104
105
 
105
106
  :has_min => false,
106
107
  :has_max => false,
107
108
  :has_last => false,
109
+ :has_std_dev => false,
108
110
 
109
111
  :label => nil
110
112
  }
@@ -144,37 +146,37 @@ class Sparklines
144
146
  ##
145
147
  # Creates a continuous area sparkline. Relevant options.
146
148
  #
147
- # :step - An integer that determines the distance between each point on the sparkline. Defaults to 2.
148
- #
149
- # :height - An integer that determines what the height of the sparkline will be. Defaults to 14
150
- #
151
- # :upper - An integer that determines the threshold for colorization purposes. Any value less than upper will be colored using below_color, anything above and equal to upper will use above_color. Defaults to 50.
152
- #
153
- # :has_min - Determines whether a dot will be drawn at the lowest value or not. Defaults to false.
154
- #
155
- # :has_max - Determines whether a dot will be drawn at the highest value or not. Defaults to false.
156
- #
157
- # :has_last - Determines whether a dot will be drawn at the last value or not. Defaults to false.
158
- #
159
- # :min_color - A string or color code representing the color that the dot drawn at the smallest value will be displayed as. Defaults to blue.
160
- #
161
- # :max_color - A string or color code representing the color that the dot drawn at the largest value will be displayed as. Defaults to green.
162
- #
163
- # :last_color - A string or color code representing the color that the dot drawn at the last value will be displayed as. Defaults to red.
164
- #
165
- # :above_color - A string or color code representing the color to draw values above or equal the upper value. Defaults to red.
166
- #
167
- # :below_color - A string or color code representing the color to draw values below the upper value. Defaults to gray.
149
+ # :step - An integer that determines the distance between each point on the sparkline. Defaults to 2.
150
+ #
151
+ # :height - An integer that determines what the height of the sparkline will be. Defaults to 14
152
+ #
153
+ # :upper - An integer that determines the threshold for colorization purposes. Any value less than upper will be colored using below_color, anything above and equal to upper will use above_color. Defaults to 50.
154
+ #
155
+ # :has_min - Determines whether a dot will be drawn at the lowest value or not. Defaults to false.
156
+ #
157
+ # :has_max - Determines whether a dot will be drawn at the highest value or not. Defaults to false.
158
+ #
159
+ # :has_last - Determines whether a dot will be drawn at the last value or not. Defaults to false.
160
+ #
161
+ # :min_color - A string or color code representing the color that the dot drawn at the smallest value will be displayed as. Defaults to blue.
162
+ #
163
+ # :max_color - A string or color code representing the color that the dot drawn at the largest value will be displayed as. Defaults to green.
164
+ #
165
+ # :last_color - A string or color code representing the color that the dot drawn at the last value will be displayed as. Defaults to red.
166
+ #
167
+ # :above_color - A string or color code representing the color to draw values above or equal the upper value. Defaults to red.
168
+ #
169
+ # :below_color - A string or color code representing the color to draw values below the upper value. Defaults to gray.
168
170
 
169
171
  def area
170
172
 
171
- step = @options[:step].to_i
172
- height = @options[:height].to_i
173
+ step = @options[:step].to_f
174
+ height = @options[:height].to_f
173
175
  background_color = @options[:background_color]
174
176
 
175
177
  create_canvas((@norm_data.size - 1) * step + 4, height, background_color)
176
178
 
177
- upper = @options[:upper].to_i
179
+ upper = @options[:upper].to_f
178
180
 
179
181
  has_min = @options[:has_min]
180
182
  has_max = @options[:has_max]
@@ -203,7 +205,7 @@ class Sparklines
203
205
  @draw.rectangle(0,0,(@norm_data.size - 1) * step + 4,(height - 3 - upper/(101.0/(height-4))))
204
206
  end
205
207
  @draw.clip_path('top')
206
- @draw.polygon *coords.flatten
208
+ @draw.polygon(*coords.flatten)
207
209
 
208
210
  # Block off the top half of the image and draw the sparkline
209
211
  @draw.fill(below_color)
@@ -211,7 +213,7 @@ class Sparklines
211
213
  @draw.rectangle(0,(height - 3 - upper/(101.0/(height-4))),(@norm_data.size - 1) * step + 4,height)
212
214
  end
213
215
  @draw.clip_path('bottom')
214
- @draw.polygon *coords.flatten
216
+ @draw.polygon(*coords.flatten)
215
217
 
216
218
  # The sparkline looks kinda nasty if either the above_color or below_color gets the center line
217
219
  @draw.fill('black')
@@ -237,13 +239,13 @@ class Sparklines
237
239
  # A bar graph.
238
240
 
239
241
  def bar
240
- step = @options[:step].to_i
242
+ step = @options[:step].to_f
241
243
  height = @options[:height].to_f
242
244
  background_color = @options[:background_color]
243
245
 
244
246
  create_canvas(@norm_data.length * step + 2, height, background_color)
245
247
 
246
- upper = @options[:upper].to_i
248
+ upper = @options[:upper].to_f
247
249
  below_color = @options[:below_color]
248
250
  above_color = @options[:above_color]
249
251
 
@@ -265,32 +267,37 @@ class Sparklines
265
267
  ##
266
268
  # Creates a discretized sparkline
267
269
  #
268
- # :height - An integer that determines what the height of the sparkline will be. Defaults to 14
270
+ # :height - An integer that determines what the height of the sparkline will be. Defaults to 14
269
271
  #
270
- # :upper - An integer that determines the threshold for colorization purposes. Any value less than upper will be colored using below_color, anything above and equal to upper will use above_color. Defaults to 50.
272
+ # :upper - An integer that determines the threshold for colorization purposes. Any value less than upper will be colored using below_color, anything above and equal to upper will use above_color. Defaults to 50.
271
273
  #
272
- # :above_color - A string or color code representing the color to draw values above or equal the upper value. Defaults to red.
274
+ # :above_color - A string or color code representing the color to draw values above or equal the upper value. Defaults to red.
273
275
  #
274
- # :below_color - A string or color code representing the color to draw values below the upper value. Defaults to gray.
276
+ # :below_color - A string or color code representing the color to draw values below the upper value. Defaults to gray.
275
277
 
276
278
  def discrete
277
279
 
278
- height = @options[:height].to_i
279
- upper = @options[:upper].to_i
280
+ height = @options[:height].to_f
281
+ upper = @options[:upper].to_f
280
282
  background_color = @options[:background_color]
281
- step = @options[:step].to_i
283
+ step = @options[:step].to_f
284
+
285
+ width = @norm_data.size * step - 1
282
286
 
283
- create_canvas(@norm_data.size * step - 1, height, background_color)
287
+ create_canvas(width, height, background_color)
284
288
 
285
289
  below_color = @options[:below_color]
286
290
  above_color = @options[:above_color]
291
+ std_dev_color = @options[:std_dev_color]
292
+
293
+ drawstddevbox(width,height,std_dev_color) if @options[:has_std_dev] == true
287
294
 
288
295
  i = 0
289
296
  @norm_data.each do |r|
290
297
  color = (r >= upper) ? above_color : below_color
291
298
  @draw.stroke(color)
292
- @draw.line(i, (@canvas.rows - r/(101.0/(height-4))-4).to_i,
293
- i, (@canvas.rows - r/(101.0/(height-4))).to_i)
299
+ @draw.line(i, (@canvas.rows - r/(101.0/(height-4))-4).to_f,
300
+ i, (@canvas.rows - r/(101.0/(height-4))).to_f)
294
301
  i += step
295
302
  end
296
303
 
@@ -302,14 +309,14 @@ class Sparklines
302
309
  ##
303
310
  # Creates a pie-chart sparkline
304
311
  #
305
- # :diameter - An integer that determines what the size of the sparkline will be. Defaults to 20
312
+ # :diameter - An integer that determines what the size of the sparkline will be. Defaults to 20
306
313
  #
307
- # :share_color - A string or color code representing the color to draw the share of the pie represented by percent. Defaults to red.
314
+ # :share_color - A string or color code representing the color to draw the share of the pie represented by percent. Defaults to red.
308
315
  #
309
- # :remain_color - A string or color code representing the color to draw the pie not taken by the share color. Defaults to lightgrey.
316
+ # :remain_color - A string or color code representing the color to draw the pie not taken by the share color. Defaults to lightgrey.
310
317
 
311
318
  def pie
312
- diameter = @options[:diameter].to_i
319
+ diameter = @options[:diameter].to_f
313
320
  background_color = @options[:background_color]
314
321
 
315
322
  create_canvas(diameter, diameter, background_color)
@@ -370,29 +377,35 @@ class Sparklines
370
377
  ##
371
378
  # Creates a smooth sparkline.
372
379
  #
373
- # :step - An integer that determines the distance between each point on the sparkline. Defaults to 2.
380
+ # :step - An integer that determines the distance between each point on the sparkline. Defaults to 2.
381
+ #
382
+ # :height - An integer that determines what the height of the sparkline will be. Defaults to 14
374
383
  #
375
- # :height - An integer that determines what the height of the sparkline will be. Defaults to 14
384
+ # :has_min - Determines whether a dot will be drawn at the lowest value or not. Defaults to false.
376
385
  #
377
- # :has_min - Determines whether a dot will be drawn at the lowest value or not. Defaults to false.
386
+ # :has_max - Determines whether a dot will be drawn at the highest value or not. Defaults to false.
378
387
  #
379
- # :has_max - Determines whether a dot will be drawn at the highest value or not. Defaults to false.
388
+ # :has_last - Determines whether a dot will be drawn at the last value or not. Defaults to false.
380
389
  #
381
- # :has_last - Determines whether a dot will be drawn at the last value or not. Defaults to false.
390
+ # :has_std_dev - Determines whether there will be a standard deviation bar behind the smooth graph or not. Defaults to false.
382
391
  #
383
- # :min_color - A string or color code representing the color that the dot drawn at the smallest value will be displayed as. Defaults to blue.
392
+ # :min_color - A string or color code representing the color that the dot drawn at the smallest value will be displayed as. Defaults to blue.
384
393
  #
385
- # :max_color - A string or color code representing the color that the dot drawn at the largest value will be displayed as. Defaults to green.
394
+ # :max_color - A string or color code representing the color that the dot drawn at the largest value will be displayed as. Defaults to green.
386
395
  #
387
- # :last_color - A string or color code representing the color that the dot drawn at the last value will be displayed as. Defaults to red.
396
+ # :last_color - A string or color code representing the color that the dot drawn at the last value will be displayed as. Defaults to red.
397
+ #
398
+ # :std_dev_color - A string or color code representing the color that the standard deviation bar behind the smooth graph will be displayed as. Defaults to #efefef
388
399
 
389
400
  def smooth
390
401
 
391
- step = @options[:step].to_i
392
- height = @options[:height].to_i
402
+ step = @options[:step].to_f
403
+ height = @options[:height].to_f
393
404
  background_color = @options[:background_color]
394
405
 
395
- create_canvas((@norm_data.size - 1) * step + 4, height, background_color)
406
+ width = (@norm_data.size - 1) * step + 4
407
+
408
+ create_canvas(width, height, background_color)
396
409
 
397
410
  min_color = @options[:min_color]
398
411
  max_color = @options[:max_color]
@@ -401,6 +414,10 @@ class Sparklines
401
414
  has_max = @options[:has_max]
402
415
  has_last = @options[:has_last]
403
416
  line_color = @options[:line_color]
417
+ has_std_dev = @options[:has_std_dev]
418
+ std_dev_color = @options[:std_dev_color]
419
+
420
+ drawstddevbox(width,height,std_dev_color) if has_std_dev == true
404
421
 
405
422
  @draw.stroke(line_color)
406
423
  coords = []
@@ -434,16 +451,16 @@ class Sparklines
434
451
  # down, 1 is regular down, 0 is no value, 1 is up, and 2 is exceptional up.
435
452
  # * options - a hash that takes parameters
436
453
  #
437
- # :height - height of the sparkline
454
+ # :height - height of the sparkline
438
455
  #
439
- # :whisker_color - the color of regular whiskers; defaults to black
456
+ # :whisker_color - the color of regular whiskers; defaults to black
440
457
  #
441
- # :exception_color - the color of exceptional whiskers; defaults to red
458
+ # :exception_color - the color of exceptional whiskers; defaults to red
442
459
 
443
460
  def whisker
444
461
 
445
- # step = @options[:step].to_i
446
- height = @options[:height].to_i
462
+ # step = @options[:step].to_f
463
+ height = @options[:height].to_f
447
464
  background_color = @options[:background_color]
448
465
 
449
466
  create_canvas((@data.size - 1) * 2, height, background_color)
@@ -505,7 +522,7 @@ private
505
522
  end
506
523
 
507
524
  ##
508
- # * :arr - an array of points (represented as two element arrays)
525
+ # :arr - an array of points (represented as two element arrays)
509
526
 
510
527
  def open_ended_polyline(arr)
511
528
  0.upto(arr.length - 2) { |i|
@@ -521,6 +538,7 @@ private
521
538
  def create_canvas(w, h, bkg_col)
522
539
  @draw = Magick::Draw.new
523
540
  @draw.pointsize = @@pointsize # TODO Use height
541
+ @draw.pointsize = @options[:font_size] if @options.has_key?(:font_size)
524
542
  @canvas = Magick::Image.new(w , h) { self.background_color = bkg_col }
525
543
 
526
544
  # Make room for label and last value
@@ -544,6 +562,7 @@ private
544
562
  else
545
563
  @font = nil
546
564
  end
565
+ @font = @options[:font] if @options.has_key?(:font)
547
566
 
548
567
  @draw.fill = 'black'
549
568
  @draw.font = @font if @font
@@ -571,6 +590,17 @@ private
571
590
  @draw.rectangle(pt[0]-offset, pt[1]-offset, pt[0]+offset, pt[1]+offset)
572
591
  end
573
592
 
593
+ ##
594
+ # Utility to draw the standard deviation box
595
+ #
596
+ def drawstddevbox(width,height,color)
597
+ mid=@norm_data.inject(0) {|sum,v| sum+=v}/@norm_data.size
598
+ std_dev = standard_deviation(@norm_data)/100*height
599
+ @draw.stroke 'transparent'
600
+ @draw.fill(color)
601
+ @draw.rectangle(0, mid-std_dev, width, mid+std_dev)
602
+ end
603
+
574
604
  def calculate_width(text)
575
605
  @draw.get_type_metrics(@canvas, text.to_s).width
576
606
  end
@@ -579,4 +609,35 @@ private
579
609
  @draw.get_type_metrics(@canvas, 'X').height
580
610
  end
581
611
 
612
+ ##
613
+ # Calculation helper for standard deviation.
614
+ #
615
+ # Thanks to Warren Seen
616
+ # http://warrenseen.com/blog/2006/03/13/how-to-calculate-standard-deviation/
617
+ def variance(population)
618
+ n = 0
619
+ mean = 0.0
620
+ s = 0.0
621
+ population.each { |x|
622
+ n = n + 1
623
+ delta = x - mean
624
+ mean = mean + (delta / n)
625
+ s = s + delta * (x - mean)
626
+ }
627
+ # if you want to calculate std deviation
628
+ # of a sample change this to "s / (n-1)"
629
+ return s / n
630
+ end
631
+
632
+ ##
633
+ # Calculate the standard deviation of a population
634
+ #
635
+ # accepts: an array, the population
636
+ # returns: the standard deviation
637
+ def standard_deviation(population)
638
+ Math.sqrt(variance(population))
639
+ end
640
+
641
+
582
642
  end
643
+
data/test/test_all.rb CHANGED
@@ -25,6 +25,15 @@ class SparklinesTest < Test::Unit::TestCase
25
25
  end
26
26
  end
27
27
 
28
+ def test_whisker_decimals
29
+ @data = (1..200).map {|n| n.to_f/100 }
30
+ quick_graph("labeled_whisker_decimals",
31
+ :height => 30,
32
+ :type => 'smooth',
33
+ :label => 'png'
34
+ )
35
+ end
36
+
28
37
  def test_whisker_random
29
38
  # Need data ranging from -2 to +2
30
39
  @data = (1..40).map { |i| rand(3) * (rand(2) == 1 ? -1 : 1) }
@@ -131,6 +140,30 @@ class SparklinesTest < Test::Unit::TestCase
131
140
  Sparklines.plot_to_file("#{@output_dir}/error.png", 0, :type => 'nonexistent')
132
141
  end
133
142
 
143
+ def test_standard_deviation
144
+ # values = (1..100).map { |v| rand(100) }
145
+ #
146
+ # File.open("test.png","w+") do |f|
147
+ # f.puts Sparklines.plot(
148
+ # values,
149
+ # :type => 'smooth',
150
+ # :height => 100,
151
+ # :line_color => '#666',
152
+ # :has_std_dev => true,
153
+ # :std_dev_color => '#efffef'
154
+ # )
155
+ # end
156
+
157
+ quick_graph('standard_deviation', {
158
+ :type => 'smooth',
159
+ :height => 100,
160
+ :line_color => '#666',
161
+ :has_std_dev => true,
162
+ :std_dev_color => '#cccccc'
163
+ })
164
+
165
+ end
166
+
134
167
  private
135
168
 
136
169
  def quick_graph(name, options)
metadata CHANGED
@@ -3,12 +3,11 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: sparklines
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.1
7
- date: 2006-10-20 00:00:00 -07:00
6
+ version: 0.4.2
7
+ date: 2007-06-15 00:00:00 -07:00
8
8
  summary: Tiny graphs.
9
9
  require_paths:
10
10
  - lib
11
- - test
12
11
  email: boss@topfunky.com
13
12
  homepage: http://nubyonrails.com/pages/sparklines
14
13
  rubyforge_project: sparklines
@@ -39,10 +38,11 @@ files:
39
38
  - test/output
40
39
  test_files:
41
40
  - test/test_all.rb
42
- rdoc_options: []
43
-
44
- extra_rdoc_files: []
45
-
41
+ rdoc_options:
42
+ - --main
43
+ - README.txt
44
+ extra_rdoc_files:
45
+ - Manifest.txt
46
46
  executables: []
47
47
 
48
48
  extensions: []
@@ -57,5 +57,5 @@ dependencies:
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: 1.1.1
60
+ version: 1.2.1
61
61
  version: