gruff 0.3.6 → 0.3.7

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.
@@ -11,13 +11,18 @@ require File.dirname(__FILE__) + '/stacked_mixin'
11
11
  class Gruff::SideStackedBar < Gruff::SideBar
12
12
  include StackedMixin
13
13
 
14
+ # Spacing factor applied between bars
15
+ attr_accessor :bar_spacing
16
+
14
17
  def draw
15
18
  @has_left_labels = true
16
19
  get_maximum_by_stack
17
20
  super
21
+ end
18
22
 
19
- return unless @has_data
23
+ protected
20
24
 
25
+ def draw_bars
21
26
  # Setup spacing.
22
27
  #
23
28
  # Columns sit stacked.
@@ -30,8 +35,6 @@ class Gruff::SideStackedBar < Gruff::SideBar
30
35
  padding = (@bar_width * (1 - @bar_spacing)) / 2
31
36
 
32
37
  @norm_data.each_with_index do |data_row, row_index|
33
- @d = @d.fill data_row[DATA_COLOR_INDEX]
34
-
35
38
  data_row[DATA_VALUES_INDEX].each_with_index do |data_point, point_index|
36
39
 
37
40
  ## using the original calcs from the stacked bar chart to get the difference between
@@ -42,7 +45,9 @@ class Gruff::SideStackedBar < Gruff::SideBar
42
45
  temp2 = @graph_left + @graph_width - height[point_index] - 1
43
46
  difference = temp2 - temp1
44
47
 
45
- left_x = length[point_index] #+ 1
48
+ @d = @d.fill data_row[DATA_COLOR_INDEX]
49
+
50
+ left_x = length[point_index] #+ 1
46
51
  left_y = @graph_top + (@bar_width * point_index) + padding
47
52
  right_x = left_x + difference
48
53
  right_y = left_y + @bar_width * @bar_spacing
@@ -61,8 +66,6 @@ class Gruff::SideStackedBar < Gruff::SideBar
61
66
  @d.draw(@base_image)
62
67
  end
63
68
 
64
- protected
65
-
66
69
  def larger_than_max?(data_point, index=0)
67
70
  max(data_point, index) > @maximum_value
68
71
  end
@@ -5,6 +5,9 @@ require File.dirname(__FILE__) + '/stacked_mixin'
5
5
  class Gruff::StackedBar < Gruff::Base
6
6
  include StackedMixin
7
7
 
8
+ # Spacing factor applied between bars
9
+ attr_accessor :bar_spacing
10
+
8
11
  # Draws a bar graph, but multiple sets are stacked on top of each other.
9
12
  def draw
10
13
  get_maximum_by_stack
@@ -0,0 +1,3 @@
1
+ module Gruff
2
+ VERSION = '0.3.7'
3
+ end
@@ -1,6 +1,8 @@
1
1
  $:.unshift(File.dirname(__FILE__) + "/../lib/")
2
2
  # require 'rubygems'
3
3
 
4
+ RMAGICK_BYPASS_VERSION_TEST = true
5
+
4
6
  require 'test/unit'
5
7
  require 'gruff'
6
8
  require 'fileutils'
@@ -37,7 +37,6 @@ class TestGruffBar < GruffTestCase
37
37
  def test_thousand_separators
38
38
  g = Gruff::Bar.new(600)
39
39
  g.title = "Formatted numbers"
40
- g.bar_spacing = 0.2
41
40
  g.marker_count = 8
42
41
  g.data("data", [4025, 1024, 50257, 703672, 1580456])
43
42
  g.write("test/output/bar_formatted_numbers.png")
@@ -284,6 +283,22 @@ class TestGruffBar < GruffTestCase
284
283
  write_test_file g, 'enhancements.png'
285
284
  end
286
285
 
286
+ def test_bar_spacing
287
+ g = setup_basic_graph
288
+ g.bar_spacing = 0
289
+ g.title = "100% spacing between bars"
290
+ g.write("test/output/bar_spacing_full.png")
291
+
292
+ g = setup_basic_graph
293
+ g.bar_spacing = 0.5
294
+ g.title = "50% spacing between bars"
295
+ g.write("test/output/bar_spacing_half.png")
296
+
297
+ g = setup_basic_graph
298
+ g.bar_spacing = 1
299
+ g.title = "0% spacing between bars"
300
+ g.write("test/output/bar_spacing_none.png")
301
+ end
287
302
 
288
303
  protected
289
304
 
@@ -15,28 +15,28 @@ class TestGruffLine < GruffTestCase
15
15
  :font_color => 'black',
16
16
  :background_colors => 'transparent'
17
17
  }
18
-
18
+
19
19
  g.labels = {
20
- 0 => '5/6',
21
- 1 => '5/15',
22
- 2 => '5/24',
23
- 3 => '5/30',
20
+ 0 => '5/6',
21
+ 1 => '5/15',
22
+ 2 => '5/24',
23
+ 3 => '5/30',
24
24
  }
25
25
  g.data(:apples, [-1, 0, 4, -4])
26
26
  g.data(:peaches, [10, 8, 6, 3])
27
27
  g.write("test/output/line_transparent.png")
28
28
  end
29
-
29
+
30
30
  def test_line_graph_with_themes
31
31
  line_graph_with_themes()
32
32
  line_graph_with_themes(400)
33
33
  end
34
-
34
+
35
35
  def test_one_value
36
36
  g = Gruff::Line.new
37
37
  g.title = "One Value"
38
38
  g.labels = {
39
- 0 => '1',
39
+ 0 => '1',
40
40
  1 => '2'
41
41
  }
42
42
  g.data('one', 1)
@@ -48,7 +48,7 @@ class TestGruffLine < GruffTestCase
48
48
  g = Gruff::Line.new
49
49
  g.title = "One Value in an Array"
50
50
  g.labels = {
51
- 0 => '1',
51
+ 0 => '1',
52
52
  1 => '2'
53
53
  }
54
54
  g.data('one', [1])
@@ -76,8 +76,8 @@ class TestGruffLine < GruffTestCase
76
76
  # g.write("test/output/line_crash_fix_test.png")
77
77
  # end
78
78
 
79
-
80
- def test_line_small_values
79
+
80
+ def test_line_small_values
81
81
  @datasets = [
82
82
  [:small, [0.1, 0.14356, 0.0, 0.5674839, 0.456]],
83
83
  [:small2, [0.2, 0.3, 0.1, 0.05, 0.9]]
@@ -119,8 +119,8 @@ class TestGruffLine < GruffTestCase
119
119
  g.write("test/output/line_small_small_zero.png")
120
120
  end
121
121
 
122
-
123
- def test_line_large_values
122
+
123
+ def test_line_large_values
124
124
  @datasets = [
125
125
  [:large, [100_005, 35_000, 28_000, 27_000]],
126
126
  [:large2, [35_000, 28_000, 27_000, 100_005]],
@@ -140,15 +140,15 @@ class TestGruffLine < GruffTestCase
140
140
 
141
141
  g.write("test/output/line_large.png")
142
142
  end
143
-
143
+
144
144
  # def test_long_title
145
- #
145
+ #
146
146
  # end
147
- #
147
+ #
148
148
  # def test_add_colors
149
- #
149
+ #
150
150
  # end
151
- #
151
+ #
152
152
 
153
153
  def test_request_too_many_colors
154
154
  g = Gruff::Line.new
@@ -160,22 +160,22 @@ class TestGruffLine < GruffTestCase
160
160
  @datasets.each do |data|
161
161
  g.data("#{data[0]}-B", data[1].map {|d| d + 20})
162
162
  end
163
- g.write("test/output/line_more_sets_than_colors.png")
163
+ g.write("test/output/line_more_sets_than_colors.png")
164
164
  end
165
-
166
- #
165
+
166
+ #
167
167
  # def test_add_data
168
- #
168
+ #
169
169
  # end
170
170
 
171
171
  def test_many_datapoints
172
172
  g = Gruff::Line.new
173
173
  g.title = "Many Multi-Line Graph Test"
174
174
  g.labels = {
175
- 0 => 'June',
176
- 10 => 'July',
177
- 30 => 'August',
178
- 50 => 'September',
175
+ 0 => 'June',
176
+ 10 => 'July',
177
+ 30 => 'August',
178
+ 50 => 'September',
179
179
  }
180
180
  g.data('many points', (0..50).collect {|i| rand(100) })
181
181
  g.x_axis_label = "Months"
@@ -192,7 +192,7 @@ class TestGruffLine < GruffTestCase
192
192
  g.title = "Similar High End Values Test"
193
193
  g.data('similar points', @dataset )
194
194
  g.write("test/output/line_similar_high_end_values.png")
195
-
195
+
196
196
  g = Gruff::Line.new
197
197
  g.title = "Similar High End Values With Floor"
198
198
  g.data('similar points', @dataset )
@@ -205,11 +205,11 @@ class TestGruffLine < GruffTestCase
205
205
  g = Gruff::Line.new(400)
206
206
  g.title = "Many Values Line Test 400px"
207
207
  g.labels = {
208
- 0 => '5/6',
209
- 10 => '5/15',
210
- 20 => '5/24',
211
- 30 => '5/30',
212
- 40 => '6/4',
208
+ 0 => '5/6',
209
+ 10 => '5/15',
210
+ 20 => '5/24',
211
+ 30 => '5/30',
212
+ 40 => '6/4',
213
213
  50 => '6/16'
214
214
  }
215
215
  %w{jimmy jane philip arthur julie bert}.each do |student_name|
@@ -224,11 +224,11 @@ class TestGruffLine < GruffTestCase
224
224
  g = Gruff::Line.new(300)
225
225
  g.title = "Tiny Test 300px"
226
226
  g.labels = {
227
- 0 => '5/6',
228
- 10 => '5/15',
229
- 20 => '5/24',
230
- 30 => '5/30',
231
- 40 => '6/4',
227
+ 0 => '5/6',
228
+ 10 => '5/15',
229
+ 20 => '5/24',
230
+ 30 => '5/30',
231
+ 40 => '6/4',
232
232
  50 => '6/16'
233
233
  }
234
234
  %w{jimmy jane philip arthur julie bert}.each do |student_name|
@@ -244,7 +244,7 @@ class TestGruffLine < GruffTestCase
244
244
  g.title = "No Data"
245
245
  # Default theme
246
246
  g.write("test/output/line_no_data.png")
247
-
247
+
248
248
  g = Gruff::Line.new(400)
249
249
  g.title = "No Data Title"
250
250
  g.no_data_message = 'There is no data'
@@ -259,7 +259,7 @@ class TestGruffLine < GruffTestCase
259
259
  g.data(:gus, [0,0,0,0])
260
260
 
261
261
  # Default theme
262
- g.write("test/output/line_no_data_other.png")
262
+ g.write("test/output/line_no_data_other.png")
263
263
  end
264
264
 
265
265
 
@@ -279,7 +279,7 @@ class TestGruffLine < GruffTestCase
279
279
  end
280
280
 
281
281
  # Default theme
282
- g.write("test/output/line_some_nil_points.png")
282
+ g.write("test/output/line_some_nil_points.png")
283
283
  end
284
284
 
285
285
  def test_no_title
@@ -296,7 +296,7 @@ class TestGruffLine < GruffTestCase
296
296
  g = setup_basic_graph(400)
297
297
  g.title = "No Line Markers"
298
298
  g.hide_line_markers = true
299
- g.write("test/output/line_no_line_markers.png")
299
+ g.write("test/output/line_no_line_markers.png")
300
300
  end
301
301
 
302
302
  def test_no_legend
@@ -312,14 +312,14 @@ class TestGruffLine < GruffTestCase
312
312
  g.hide_line_markers = true
313
313
  g.hide_legend = true
314
314
  g.hide_title = true
315
- g.write("test/output/line_nothing_but_the_graph.png")
315
+ g.write("test/output/line_nothing_but_the_graph.png")
316
316
  end
317
317
 
318
318
  def test_baseline_larger_than_data
319
319
  g = setup_basic_graph(400)
320
320
  g.title = "Baseline Larger Than Data"
321
321
  g.baseline_value = 150
322
- g.write("test/output/line_large_baseline.png")
322
+ g.write("test/output/line_large_baseline.png")
323
323
  end
324
324
 
325
325
 
@@ -327,20 +327,20 @@ class TestGruffLine < GruffTestCase
327
327
  g = setup_basic_graph(400)
328
328
  g.title = "Hide Dots"
329
329
  g.hide_dots = true
330
- g.write("test/output/line_hide_dots.png")
330
+ g.write("test/output/line_hide_dots.png")
331
331
  end
332
332
 
333
333
  def test_hide_lines
334
334
  g = setup_basic_graph(400)
335
335
  g.title = "Hide Lines"
336
336
  g.hide_lines = true
337
- g.write("test/output/line_hide_lines.png")
337
+ g.write("test/output/line_hide_lines.png")
338
338
  end
339
339
 
340
340
  def test_wide_graph
341
341
  g = setup_basic_graph('800x400')
342
342
  g.title = "Wide Graph"
343
- g.write("test/output/line_wide_graph.png")
343
+ g.write("test/output/line_wide_graph.png")
344
344
 
345
345
  g = setup_basic_graph('400x200')
346
346
  g.title = "Wide Graph Small"
@@ -350,7 +350,7 @@ class TestGruffLine < GruffTestCase
350
350
  def test_negative
351
351
  g = setup_pos_neg(800)
352
352
  g.write("test/output/line_pos_neg.png")
353
-
353
+
354
354
  g = setup_pos_neg(400)
355
355
  g.title = 'Pos/Neg Line Test Small'
356
356
  g.write("test/output/line_pos_neg_400.png")
@@ -359,13 +359,13 @@ class TestGruffLine < GruffTestCase
359
359
  def test_all_negative
360
360
  g = setup_all_neg(800)
361
361
  g.write("test/output/line_all_neg.png")
362
-
362
+
363
363
  g = setup_all_neg(400)
364
364
  g.title = 'All Neg Line Test Small'
365
365
  g.write("test/output/line_all_neg_400.png")
366
366
  end
367
367
 
368
- def test_many_numbers
368
+ def test_many_numbers
369
369
  g = Gruff::Line.new('400x170')
370
370
  g.title = "Line Test, Many Numbers"
371
371
 
@@ -419,7 +419,7 @@ class TestGruffLine < GruffTestCase
419
419
  { :date => '23'},
420
420
  { :date => '24'},
421
421
  { :date => '25'},
422
- { :date => '26'},
422
+ { :date => '26'},
423
423
  { :date => '27',
424
424
  :wpm => 37,
425
425
  :errors => 3,
@@ -448,7 +448,28 @@ class TestGruffLine < GruffTestCase
448
448
  g.hide_line_markers = false
449
449
  g.write('test/output/line_no_hide.png')
450
450
  end
451
-
451
+
452
+ def test_xy_data
453
+ g = Gruff::Line.new
454
+ g.title = "X/Y Dataset"
455
+ g.dataxy("Apples", [1,3,4,5,6,10], [1, 2, 3, 4, 4, 3])
456
+ g.dataxy("Bapples", [1,3,4,5,7,9], [1, 1, 2, 2, 3, 3])
457
+ g.data("Capples", [1, 1, 2, 2, 3, 3])
458
+ g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
459
+ g.write('test/output/data_xy.png')
460
+ end
461
+
462
+ def test_xy_data_pairs
463
+ g = Gruff::Line.new
464
+ g.title = "X/Y Dataset"
465
+ g.dataxy("Apples", [[1,1], [3,2],[4,3],[5,4],[6,4],[10,3]])
466
+ g.dataxy("Bapples", [[1,1],[3,1],[4,2],[5,2],[7,3],[9,3]])
467
+ g.data("Capples", [1, 1, 2, 2, 3, 3])
468
+ g.dataxy("Dapples", [[1,1],[2,3],[5,8],[13,21]])
469
+ g.dataxy("Eapples", [[1,1],[2,3],[5,8],[13,21],[13,8],[5,3],[2,1],[1,1]])
470
+ g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
471
+ g.write('test/output/data_xy_pairs.png')
472
+ end
452
473
 
453
474
  def test_jruby_error
454
475
  g = Gruff::Line.new
@@ -462,13 +483,30 @@ class TestGruffLine < GruffTestCase
462
483
  g.legend_font_size = 12
463
484
  g.marker_font_size = 16
464
485
  g.hide_dots = false
465
- g.label_max_decimals = 1
466
486
 
467
487
  g.write('test/output/line_jruby_error.png')
468
488
  end
469
489
 
490
+ def test_marker_label_accuracy
491
+ g = Gruff::Line.new
492
+ g.title = "Marker label accuracy"
493
+ g.labels = {
494
+ 0 => '1',
495
+ 1 => '2',
496
+ 2 => '3',
497
+ 3 => '4',
498
+ 4 => '5'
499
+ }
500
+ g.data('first', [0.5, 0.51, 0.52, 0.53, 0.54])
501
+ g.data('second', [0.6, 0.61, 0.62, 0.63, 0.64])
502
+ g.data('third', [0.7, 0.71, 0.72, 0.73, 0.74])
503
+
504
+ g.write("test/output/line_marker_label_accuracy.png")
505
+ end
506
+
507
+
470
508
  private
471
-
509
+
472
510
  def bmi(params={})
473
511
  g = basic_graph()
474
512
 
@@ -492,7 +530,7 @@ private
492
530
  end
493
531
  # Default theme
494
532
  g.write("test/output/line_theme_keynote_#{size}.png")
495
-
533
+
496
534
  g = Gruff::Line.new(size)
497
535
  g.title = "Multi-Line Graph Test #{size}"
498
536
  g.labels = @labels
@@ -502,7 +540,7 @@ private
502
540
  g.data(data[0], data[1])
503
541
  end
504
542
  g.write("test/output/line_theme_37signals_#{size}.png")
505
-
543
+
506
544
  g = Gruff::Line.new(size)
507
545
  g.title = "Multi-Line Graph Test #{size}"
508
546
  g.labels = @labels
@@ -512,7 +550,7 @@ private
512
550
  g.data(data[0], data[1])
513
551
  end
514
552
  g.write("test/output/line_theme_rails_keynote_#{size}.png")
515
-
553
+
516
554
  g = Gruff::Line.new(size)
517
555
  g.title = "Multi-Line Graph Test #{size}"
518
556
  g.labels = @labels
@@ -528,10 +566,10 @@ private
528
566
  g = Gruff::Line.new(size)
529
567
  g.title = "Pos/Neg Line Graph Test"
530
568
  g.labels = {
531
- 0 => '5/6',
532
- 1 => '5/15',
533
- 2 => '5/24',
534
- 3 => '5/30',
569
+ 0 => '5/6',
570
+ 1 => '5/15',
571
+ 2 => '5/24',
572
+ 3 => '5/30',
535
573
  }
536
574
  g.data(:apples, [-1, 0, 4, -4])
537
575
  g.data(:peaches, [10, 8, 6, 3])
@@ -543,10 +581,10 @@ private
543
581
  g = Gruff::Line.new(size)
544
582
  g.title = "All Neg Line Graph Test"
545
583
  g.labels = {
546
- 0 => '5/6',
547
- 1 => '5/15',
548
- 2 => '5/24',
549
- 3 => '5/30',
584
+ 0 => '5/6',
585
+ 1 => '5/15',
586
+ 2 => '5/24',
587
+ 3 => '5/30',
550
588
  }
551
589
  g.data(:apples, [-1, -5, -20, -4])
552
590
  g.data(:peaches, [-10, -8, -6, -3])