gruff 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/{rakefile → Rakefile} +1 -1
- data/lib/gruff.rb +0 -2
- data/lib/gruff/bar_conversion.rb +0 -8
- data/lib/gruff/base.rb +66 -35
- data/lib/gruff/pie.rb +1 -1
- data/lib/gruff/side_stacked_bar.rb +20 -19
- data/lib/gruff/stacked_bar.rb +1 -11
- data/test/bar_test.rb +8 -0
- data/test/line_test.rb +49 -33
- data/test/sidestacked_bar_test.rb +3 -11
- data/test/stacked_bar_test.rb +2 -47
- metadata +3 -3
data/{rakefile → Rakefile}
RENAMED
@@ -66,7 +66,7 @@ spec = Gem::Specification.new do |s|
|
|
66
66
|
s.require_path = 'lib'
|
67
67
|
s.autorequire = 'gruff'
|
68
68
|
|
69
|
-
s.files = [ "
|
69
|
+
s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
|
70
70
|
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
|
71
71
|
s.files = s.files + Dir.glob( "assets/*" ).delete_if { |item| item.include?( "\.svn" ) }
|
72
72
|
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) || item.include?("\.png") }
|
data/lib/gruff.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
# Extra full path added to fix some require errors on some installations.
|
3
2
|
|
4
3
|
require File.dirname(__FILE__) + '/gruff/base'
|
@@ -10,4 +9,3 @@ require File.dirname(__FILE__) + '/gruff/pie'
|
|
10
9
|
require File.dirname(__FILE__) + '/gruff/stacked_bar'
|
11
10
|
require File.dirname(__FILE__) + '/gruff/side_stacked_bar'
|
12
11
|
require File.dirname(__FILE__) + '/gruff/photo_bar'
|
13
|
-
|
data/lib/gruff/bar_conversion.rb
CHANGED
@@ -10,14 +10,6 @@
|
|
10
10
|
#
|
11
11
|
# $Log: bar_conversion.rb $
|
12
12
|
# $Log: Added comments $
|
13
|
-
# ------------------------------------------------------------------------
|
14
|
-
# This program was written by David Stokar is
|
15
|
-
# licensed under the GNU GPL license. Please see below for details. This
|
16
|
-
# header contains information regarding licensing terms under the GPL, and
|
17
|
-
# information regarding obtaining source code from the Author. Consequently,
|
18
|
-
# pursuant to section 3(c) of the GPL, you must accompany the information
|
19
|
-
# found in this header with any distribution you make of this Program.
|
20
|
-
# ------------------------------------------------------------------------
|
21
13
|
##############################################################################
|
22
14
|
|
23
15
|
#
|
data/lib/gruff/base.rb
CHANGED
@@ -3,21 +3,21 @@
|
|
3
3
|
#
|
4
4
|
# Author:: Geoffrey Grosenbach boss@topfunky.com
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# Originally Created:: October 23, 2005
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
8
|
+
# Extra thanks to Tim Hunter for writing RMagick,
|
9
|
+
# and also contributions by
|
10
|
+
# Jarkko Laine, Mike Perham, Andreas Schwarz,
|
11
|
+
# Alun Eyre, Guillaume Theoret, David Stokar,
|
12
|
+
# Paul Rogers, Dave Woodward, Frank Oxener,
|
13
|
+
# and a cast of thousands.
|
12
14
|
#
|
13
15
|
|
14
16
|
require 'RMagick'
|
15
17
|
|
16
|
-
#require 'yaml'
|
17
|
-
|
18
18
|
module Gruff
|
19
19
|
|
20
|
-
VERSION = '0.1.
|
20
|
+
VERSION = '0.1.1'
|
21
21
|
|
22
22
|
class Base
|
23
23
|
|
@@ -42,6 +42,9 @@ module Gruff
|
|
42
42
|
|
43
43
|
# Font used for titles, labels, etc. Works best if you provide the full path to the TTF font file.
|
44
44
|
# RMagick must be built with the Freetype libraries for this to work properly.
|
45
|
+
#
|
46
|
+
# Tries to find Bitstream Vera (Vera.ttf) in the location specified by
|
47
|
+
# ENV['MAGICK_FONT_PATH']. Uses default RMagick font otherwise.
|
45
48
|
attr_accessor :font
|
46
49
|
|
47
50
|
# Hide various elements
|
@@ -50,15 +53,20 @@ module Gruff
|
|
50
53
|
# Message shown when there is no data. Fits up to 20 characters. Defaults to "No Data."
|
51
54
|
attr_accessor :no_data_message
|
52
55
|
|
53
|
-
# Optionally set the size of the
|
56
|
+
# Optionally set the size of the font. Based on an 800x600px graph. Default is 20.
|
54
57
|
#
|
55
58
|
# Will be scaled down if graph is smaller than 800px wide.
|
56
59
|
attr_accessor :legend_font_size
|
57
60
|
|
58
|
-
|
61
|
+
attr_accessor :marker_font_size
|
62
|
+
|
63
|
+
attr_accessor :title_font_size
|
64
|
+
|
65
|
+
# If one numerical argument is given, the graph is drawn at 4/3 ratio according to the given width (800 results in 800x600, 400 gives 400x300, etc.).
|
59
66
|
#
|
60
|
-
#
|
61
|
-
#
|
67
|
+
# Or, send a geometry string for other ratios ('800x400', '400x225').
|
68
|
+
#
|
69
|
+
# Looks for Bitstream Vera as the default font. Expects an environment var of MAGICK_FONT_PATH to be set. (Uses RMagick's default font otherwise.)
|
62
70
|
def initialize(target_width=800)
|
63
71
|
|
64
72
|
if not Numeric === target_width
|
@@ -71,19 +79,22 @@ module Gruff
|
|
71
79
|
end
|
72
80
|
|
73
81
|
# Internal for calculations
|
74
|
-
@font = File.expand_path('Vera.ttf', ENV['MAGICK_FONT_PATH'])
|
75
|
-
@marker_pointsize = 21.0
|
76
82
|
@raw_columns = 800.0
|
77
83
|
@raw_rows = 800.0 * (@rows/@columns)
|
78
84
|
@column_count = 0
|
79
|
-
@maximum_value =
|
80
|
-
@minimum_value = 0
|
85
|
+
@maximum_value = @minimum_value = nil
|
81
86
|
@has_data = false
|
82
87
|
@data = Array.new
|
83
88
|
@labels = Hash.new
|
84
89
|
@labels_seen = Hash.new
|
85
90
|
@scale = @columns / @raw_columns
|
86
|
-
|
91
|
+
|
92
|
+
vera_font_path = File.expand_path('Vera.ttf', ENV['MAGICK_FONT_PATH'])
|
93
|
+
@font = File.exists?(vera_font_path) ? vera_font_path : nil
|
94
|
+
|
95
|
+
@marker_font_size = 21.0
|
96
|
+
@legend_font_size = 20.0
|
97
|
+
@title_font_size = 36.0
|
87
98
|
|
88
99
|
@no_data_message = "No Data"
|
89
100
|
|
@@ -204,16 +215,18 @@ module Gruff
|
|
204
215
|
data_points.each_with_index do |data_point, index|
|
205
216
|
next if data_point.nil?
|
206
217
|
|
207
|
-
# Setup max/min so spread starts at the low end of the data points
|
208
|
-
if @maximum_value
|
218
|
+
# Setup max/min so spread starts at the low end of the data points
|
219
|
+
if @maximum_value.nil? && @minimum_value.nil?
|
209
220
|
@maximum_value = @minimum_value = data_point
|
210
221
|
end
|
211
|
-
|
212
|
-
|
222
|
+
|
223
|
+
# TODO Doesn't work with stacked bar graphs
|
224
|
+
#Original: @maximum_value = larger_than_max?(data_point, index) ? max(data_point, index) : @maximum_value
|
225
|
+
@maximum_value = larger_than_max?(data_point) ? data_point : @maximum_value
|
213
226
|
if @maximum_value > 0
|
214
227
|
@has_data = true
|
215
228
|
end
|
216
|
-
@minimum_value = (data_point
|
229
|
+
@minimum_value = less_than_min?(data_point) ? data_point : @minimum_value
|
217
230
|
if @minimum_value < 0
|
218
231
|
@has_data = true
|
219
232
|
end
|
@@ -334,13 +347,13 @@ protected
|
|
334
347
|
marker_label = index * increment + @minimum_value.to_f
|
335
348
|
|
336
349
|
@d.fill = @marker_color
|
337
|
-
@d.font = @font
|
350
|
+
@d.font = @font if @font
|
338
351
|
@d.stroke = 'transparent'
|
339
|
-
@d.pointsize = scale_fontsize(@
|
352
|
+
@d.pointsize = scale_fontsize(@marker_font_size)
|
340
353
|
@d.gravity = EastGravity
|
341
354
|
@d = @d.annotate_scaled( @base_image,
|
342
355
|
100, 20,
|
343
|
-
-10, y - (@
|
356
|
+
-10, y - (@marker_font_size/2.0),
|
344
357
|
marker_label.to_s, @scale)
|
345
358
|
# "help", @scale)
|
346
359
|
end
|
@@ -355,8 +368,8 @@ protected
|
|
355
368
|
legend_square_width = 20 # small square with color of this item
|
356
369
|
|
357
370
|
# May fix legend drawing problem at small sizes
|
358
|
-
@d.font = @font
|
359
|
-
@d.pointsize = legend_font_size
|
371
|
+
@d.font = @font if @font
|
372
|
+
@d.pointsize = @legend_font_size
|
360
373
|
|
361
374
|
metrics = @d.get_type_metrics(@base_image, @legend_labels.join(''))
|
362
375
|
legend_text_width = metrics.width
|
@@ -368,8 +381,8 @@ protected
|
|
368
381
|
@legend_labels.each_with_index do |legend_label, index|
|
369
382
|
# Draw label
|
370
383
|
@d.fill = @marker_color
|
371
|
-
@d.font = @font
|
372
|
-
@d.pointsize = scale_fontsize(legend_font_size)
|
384
|
+
@d.font = @font if @font
|
385
|
+
@d.pointsize = scale_fontsize(@legend_font_size)
|
373
386
|
@d.stroke = 'transparent'
|
374
387
|
@d.font_weight = NormalWeight
|
375
388
|
@d.gravity = WestGravity
|
@@ -385,7 +398,7 @@ protected
|
|
385
398
|
@d = @d.rectangle(current_x_offset, 70 + legend_box_y_offset,
|
386
399
|
current_x_offset + legend_square_width, 70 + legend_square_width + legend_box_y_offset)
|
387
400
|
|
388
|
-
@d.pointsize = legend_font_size
|
401
|
+
@d.pointsize = @legend_font_size
|
389
402
|
metrics = @d.get_type_metrics(@base_image, legend_label.to_s)
|
390
403
|
current_string_offset = metrics.width + (legend_square_width * 2.7)
|
391
404
|
current_x_offset += current_string_offset
|
@@ -397,9 +410,9 @@ protected
|
|
397
410
|
return if (@hide_title || @title.nil?)
|
398
411
|
|
399
412
|
@d.fill = @marker_color
|
400
|
-
@d.font = @font
|
413
|
+
@d.font = @font if @font
|
401
414
|
@d.stroke = 'transparent'
|
402
|
-
@d.pointsize = scale_fontsize(
|
415
|
+
@d.pointsize = scale_fontsize(@title_font_size)
|
403
416
|
@d.font_weight = BoldWeight
|
404
417
|
@d.gravity = CenterGravity
|
405
418
|
@d = @d.annotate_scaled( @base_image,
|
@@ -415,10 +428,10 @@ protected
|
|
415
428
|
|
416
429
|
if !@labels[index].nil? && @labels_seen[index].nil?
|
417
430
|
@d.fill = @marker_color
|
418
|
-
@d.font = @font
|
431
|
+
@d.font = @font if @font
|
419
432
|
@d.stroke = 'transparent'
|
420
433
|
@d.font_weight = NormalWeight
|
421
|
-
@d.pointsize = scale_fontsize(@
|
434
|
+
@d.pointsize = scale_fontsize(@marker_font_size)
|
422
435
|
@d.gravity = CenterGravity
|
423
436
|
@d = @d.annotate_scaled(@base_image,
|
424
437
|
1, 1,
|
@@ -430,7 +443,7 @@ protected
|
|
430
443
|
|
431
444
|
def draw_no_data
|
432
445
|
@d.fill = @marker_color
|
433
|
-
@d.font = @font
|
446
|
+
@d.font = @font if @font
|
434
447
|
@d.stroke = 'transparent'
|
435
448
|
@d.font_weight = NormalWeight
|
436
449
|
@d.pointsize = scale_fontsize(80)
|
@@ -529,6 +542,24 @@ protected
|
|
529
542
|
total_sum
|
530
543
|
end
|
531
544
|
|
545
|
+
def get_maximum_by_stack
|
546
|
+
# Get sum of each stack
|
547
|
+
max_hash = {}
|
548
|
+
@data.each do |data_set|
|
549
|
+
data_set[DATA_VALUES_INDEX].each_with_index do |data_point, i|
|
550
|
+
max_hash[i] = 0.0 unless max_hash[i]
|
551
|
+
max_hash[i] += data_point.to_f
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
@maximum_value = 0
|
556
|
+
max_hash.keys.each do |key|
|
557
|
+
@maximum_value = max_hash[key] if max_hash[key] > @maximum_value
|
558
|
+
end
|
559
|
+
@minimum_value = 0
|
560
|
+
end
|
561
|
+
|
562
|
+
|
532
563
|
private
|
533
564
|
|
534
565
|
def increment_color
|
data/lib/gruff/pie.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# New gruff graph type added to enable sideways stacking bar charts (basically looks like a x/y
|
2
2
|
# flip of a standard stacking bar chart)
|
3
3
|
#
|
4
4
|
# alun.eyre@googlemail.com
|
@@ -29,13 +29,13 @@ class Gruff::SideStackedBar < Gruff::Base
|
|
29
29
|
marker_label = diff.abs * increment
|
30
30
|
|
31
31
|
@d.fill = @marker_color
|
32
|
-
@d.font = @font
|
32
|
+
@d.font = @font if @font
|
33
33
|
@d.stroke = 'transparent'
|
34
|
-
@d.pointsize = scale_fontsize(@
|
34
|
+
@d.pointsize = scale_fontsize(@marker_font_size)
|
35
35
|
# @d.gravity = NorthGravity
|
36
36
|
@d = @d.annotate_scaled( @base_image,
|
37
37
|
100, 20,
|
38
|
-
x - (@
|
38
|
+
x - (@marker_font_size/1.5), @graph_bottom + 40,
|
39
39
|
marker_label.to_s, @scale)
|
40
40
|
|
41
41
|
end
|
@@ -45,10 +45,10 @@ class Gruff::SideStackedBar < Gruff::Base
|
|
45
45
|
def draw_label(y_offset, index)
|
46
46
|
if !@labels[index].nil? && @labels_seen[index].nil?
|
47
47
|
@d.fill = @marker_color
|
48
|
-
@d.font = @font
|
48
|
+
@d.font = @font if @font
|
49
49
|
@d.stroke = 'transparent'
|
50
50
|
@d.font_weight = NormalWeight
|
51
|
-
@d.pointsize = scale_fontsize(@
|
51
|
+
@d.pointsize = scale_fontsize(@marker_font_size)
|
52
52
|
@d.gravity = CenterGravity
|
53
53
|
@d = @d.annotate_scaled(@base_image,
|
54
54
|
1, 1,
|
@@ -59,6 +59,7 @@ class Gruff::SideStackedBar < Gruff::Base
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def draw
|
62
|
+
get_maximum_by_stack
|
62
63
|
super
|
63
64
|
|
64
65
|
return unless @has_data
|
@@ -78,19 +79,19 @@ class Gruff::SideStackedBar < Gruff::Base
|
|
78
79
|
|
79
80
|
data_row[1].each_with_index do |data_point, point_index|
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
82
|
+
## using the original calcs from the stacked bar chart to get the difference between
|
83
|
+
## part of the bart chart we wish to stack.
|
84
|
+
temp1 = @graph_left + (@graph_width -
|
85
|
+
data_point * @graph_width -
|
86
|
+
height[point_index]) + 1
|
87
|
+
temp2 = @graph_left + @graph_width - height[point_index] - 1
|
88
|
+
difference = temp2 - temp1
|
89
|
+
|
90
|
+
left_x = length[point_index] #+ 1
|
91
|
+
left_y = @graph_top + (@bar_width * point_index)
|
92
|
+
right_x = left_x + difference
|
93
|
+
right_y = left_y + @bar_width * spacing_factor
|
94
|
+
length[point_index] += difference
|
94
95
|
height[point_index] += (data_point * @graph_width - 2)
|
95
96
|
|
96
97
|
@d = @d.rectangle(left_x, left_y, right_x, right_y)
|
data/lib/gruff/stacked_bar.rb
CHANGED
@@ -5,8 +5,8 @@ class Gruff::StackedBar < Gruff::Base
|
|
5
5
|
|
6
6
|
# Draws a bar graph, but multiple sets are stacked on top of each other.
|
7
7
|
def draw
|
8
|
+
get_maximum_by_stack
|
8
9
|
super
|
9
|
-
|
10
10
|
return unless @has_data
|
11
11
|
|
12
12
|
# Setup spacing.
|
@@ -45,15 +45,5 @@ class Gruff::StackedBar < Gruff::Base
|
|
45
45
|
|
46
46
|
@d.draw(@base_image)
|
47
47
|
end
|
48
|
-
|
49
|
-
protected
|
50
|
-
|
51
|
-
def larger_than_max?(data_point, index=0)
|
52
|
-
max(data_point, index) > @maximum_value
|
53
|
-
end
|
54
|
-
|
55
|
-
def max(data_point, index)
|
56
|
-
@data.inject(0) {|sum, item| sum + item[1][index]}
|
57
|
-
end
|
58
48
|
|
59
49
|
end
|
data/test/bar_test.rb
CHANGED
@@ -113,6 +113,14 @@ class TestGruffBar < Test::Unit::TestCase
|
|
113
113
|
g.write("test/output/bar_image_wide.png")
|
114
114
|
end
|
115
115
|
|
116
|
+
def test_nil_font
|
117
|
+
g = setup_basic_graph 400
|
118
|
+
g.title = "Nil Font"
|
119
|
+
g.font = nil
|
120
|
+
g.write "test/output/bar_nil_font.png"
|
121
|
+
end
|
122
|
+
|
123
|
+
|
116
124
|
def test_no_line_markers
|
117
125
|
g = setup_basic_graph(400)
|
118
126
|
g.title = "No Line Markers"
|
data/test/line_test.rb
CHANGED
@@ -39,7 +39,7 @@ class TestGruffLine < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
def test_line_small_values
|
41
41
|
@datasets = [
|
42
|
-
[:small, [0.
|
42
|
+
[:small, [0.1, 0.14356, 0.0, 0.5674839, 0.456]],
|
43
43
|
[:small2, [0.2, 0.3, 0.1, 0.05, 0.9]]
|
44
44
|
]
|
45
45
|
|
@@ -57,6 +57,28 @@ class TestGruffLine < Test::Unit::TestCase
|
|
57
57
|
end
|
58
58
|
g.write("test/output/line_small_small.png")
|
59
59
|
end
|
60
|
+
|
61
|
+
def test_line_starts_with_zero
|
62
|
+
@datasets = [
|
63
|
+
[:first0, [0, 5, 10, 8, 18]],
|
64
|
+
[:normal, [1, 2, 3, 4, 5]]
|
65
|
+
]
|
66
|
+
|
67
|
+
g = Gruff::Line.new
|
68
|
+
g.title = "Small Values Line Graph Test"
|
69
|
+
@datasets.each do |data|
|
70
|
+
g.data(data[0], data[1])
|
71
|
+
end
|
72
|
+
g.write("test/output/line_small_zero.png")
|
73
|
+
|
74
|
+
g = Gruff::Line.new(400)
|
75
|
+
g.title = "Small Values Line Graph Test 400px"
|
76
|
+
@datasets.each do |data|
|
77
|
+
g.data(data[0], data[1])
|
78
|
+
end
|
79
|
+
g.write("test/output/line_small_small_zero.png")
|
80
|
+
end
|
81
|
+
|
60
82
|
|
61
83
|
def test_line_large_values
|
62
84
|
@datasets = [
|
@@ -118,26 +140,6 @@ class TestGruffLine < Test::Unit::TestCase
|
|
118
140
|
g.write("test/output/line_similar_high_end_values.png")
|
119
141
|
end
|
120
142
|
|
121
|
-
|
122
|
-
# Requires the Creative Block font from http://www.blambot.com
|
123
|
-
def test_font
|
124
|
-
g = Gruff::Line.new
|
125
|
-
g.title = "Font Test"
|
126
|
-
g.labels = {
|
127
|
-
0 => '5/6',
|
128
|
-
2 => '5/15',
|
129
|
-
4 => '5/24',
|
130
|
-
6 => '5/30',
|
131
|
-
8 => '6/2',
|
132
|
-
10 => '6/4',
|
133
|
-
}
|
134
|
-
g.data('many points', (0..10).collect {|i| rand(100) })
|
135
|
-
g.font = File.expand_path('CREABBRG.TTF', ENV['MAGICK_FONT_PATH'])
|
136
|
-
|
137
|
-
# Default theme
|
138
|
-
g.write("test/output/line_font.png")
|
139
|
-
end
|
140
|
-
|
141
143
|
def test_dots_graph
|
142
144
|
g = Gruff::Line.new(false)
|
143
145
|
g.title = "Dots Test 800px"
|
@@ -420,31 +422,47 @@ class TestGruffLine < Test::Unit::TestCase
|
|
420
422
|
|
421
423
|
protected
|
422
424
|
|
425
|
+
# TODO Reset data after each theme
|
423
426
|
def line_graph_with_themes(size=nil)
|
424
|
-
|
425
|
-
g = Gruff::Line.new(size)
|
426
|
-
else
|
427
|
-
g = Gruff::Line.new
|
428
|
-
end
|
429
|
-
|
427
|
+
g = Gruff::Line.new(size)
|
430
428
|
g.title = "Multi-Line Graph Test #{size}"
|
431
429
|
g.labels = @sample_labels
|
430
|
+
g.baseline_value = 90
|
432
431
|
@datasets.each do |data|
|
433
432
|
g.data(data[0], data[1])
|
434
433
|
end
|
435
|
-
|
436
|
-
g.baseline_value = 90
|
437
|
-
|
438
434
|
# Default theme
|
439
435
|
g.write("test/output/line_theme_keynote_#{size}.png")
|
440
436
|
|
437
|
+
g = Gruff::Line.new(size)
|
438
|
+
g.title = "Multi-Line Graph Test #{size}"
|
439
|
+
g.labels = @sample_labels
|
440
|
+
g.baseline_value = 90
|
441
441
|
g.theme_37signals
|
442
|
+
@datasets.each do |data|
|
443
|
+
g.data(data[0], data[1])
|
444
|
+
end
|
442
445
|
g.write("test/output/line_theme_37signals_#{size}.png")
|
443
446
|
|
447
|
+
|
448
|
+
g = Gruff::Line.new(size)
|
449
|
+
g.title = "Multi-Line Graph Test #{size}"
|
450
|
+
g.labels = @sample_labels
|
451
|
+
g.baseline_value = 90
|
444
452
|
g.theme_rails_keynote
|
453
|
+
@datasets.each do |data|
|
454
|
+
g.data(data[0], data[1])
|
455
|
+
end
|
445
456
|
g.write("test/output/line_theme_rails_keynote_#{size}.png")
|
446
457
|
|
458
|
+
g = Gruff::Line.new(size)
|
459
|
+
g.title = "Multi-Line Graph Test #{size}"
|
460
|
+
g.labels = @sample_labels
|
461
|
+
g.baseline_value = 90
|
447
462
|
g.theme_odeo
|
463
|
+
@datasets.each do |data|
|
464
|
+
g.data(data[0], data[1])
|
465
|
+
end
|
448
466
|
g.write("test/output/line_theme_odeo_#{size}.png")
|
449
467
|
end
|
450
468
|
|
@@ -483,9 +501,7 @@ protected
|
|
483
501
|
}
|
484
502
|
g.data(:apples, [-1, -5, -20, -4])
|
485
503
|
g.data(:peaches, [-10, -8, -6, -3])
|
486
|
-
|
504
|
+
g
|
487
505
|
end
|
488
|
-
|
489
506
|
|
490
507
|
end
|
491
|
-
|
@@ -39,14 +39,7 @@ class TestGruffSideSideStackedBar < Test::Unit::TestCase
|
|
39
39
|
@datasets.each do |data|
|
40
40
|
g.data(data[0], data[1])
|
41
41
|
end
|
42
|
-
|
43
|
-
g.write("test/output/side_stacked_bar_keynote.png")
|
44
|
-
|
45
|
-
g.theme_rails_keynote
|
46
|
-
g.write("test/output/side_stacked_bar_rails_keynote.png")
|
47
|
-
|
48
|
-
g.theme_odeo
|
49
|
-
g.write("test/output/side_stacked_bar_odeo.png")
|
42
|
+
g.write "test/output/side_stacked_bar_keynote.png"
|
50
43
|
end
|
51
44
|
|
52
45
|
|
@@ -62,14 +55,13 @@ class TestGruffSideSideStackedBar < Test::Unit::TestCase
|
|
62
55
|
@datasets.each do |data|
|
63
56
|
g.data(data[0], data[1])
|
64
57
|
end
|
65
|
-
|
66
|
-
g.write("test/output/side_stacked_bar_keynote_small.png")
|
58
|
+
g.write "test/output/side_stacked_bar_keynote_small.png"
|
67
59
|
end
|
68
60
|
|
69
61
|
def test_wide
|
70
62
|
g = setup_basic_graph('800x400')
|
71
63
|
g.title = "Wide SSBar"
|
72
|
-
g.write
|
64
|
+
g.write "test/output/side_stacked_bar_wide.png"
|
73
65
|
end
|
74
66
|
|
75
67
|
protected
|
data/test/stacked_bar_test.rb
CHANGED
@@ -13,9 +13,6 @@ class TestGruffStackedBar < Test::Unit::TestCase
|
|
13
13
|
[:Jimmy, [25, 36, 86, 39]],
|
14
14
|
[:Charles, [80, 54, 67, 54]],
|
15
15
|
[:Julie, [22, 29, 35, 38]],
|
16
|
-
#[:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
|
17
|
-
#[:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
|
18
|
-
#["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
|
19
16
|
]
|
20
17
|
@sample_labels = {
|
21
18
|
0 => '5/6',
|
@@ -37,14 +34,7 @@ class TestGruffStackedBar < Test::Unit::TestCase
|
|
37
34
|
@datasets.each do |data|
|
38
35
|
g.data(data[0], data[1])
|
39
36
|
end
|
40
|
-
|
41
|
-
g.write("test/output/stacked_bar_keynote.png")
|
42
|
-
|
43
|
-
g.theme_rails_keynote
|
44
|
-
g.write("test/output/stacked_bar_rails_keynote.png")
|
45
|
-
|
46
|
-
g.theme_odeo
|
47
|
-
g.write("test/output/stacked_bar_odeo.png")
|
37
|
+
g.write "test/output/stacked_bar_keynote.png"
|
48
38
|
end
|
49
39
|
|
50
40
|
|
@@ -60,42 +50,7 @@ class TestGruffStackedBar < Test::Unit::TestCase
|
|
60
50
|
@datasets.each do |data|
|
61
51
|
g.data(data[0], data[1])
|
62
52
|
end
|
63
|
-
|
64
|
-
g.write("test/output/stacked_bar_keynote_small.png")
|
53
|
+
g.write "test/output/stacked_bar_keynote_small.png"
|
65
54
|
end
|
66
|
-
|
67
|
-
def test_bar_image_bg
|
68
|
-
g = Gruff::StackedBar.new
|
69
|
-
g.title = "Stacked Bar Graph With Image Background"
|
70
|
-
g.labels = {
|
71
|
-
0 => '5/6',
|
72
|
-
1 => '5/15',
|
73
|
-
2 => '5/24',
|
74
|
-
3 => '5/30',
|
75
|
-
}
|
76
|
-
@datasets.each do |data|
|
77
|
-
g.data(data[0], data[1])
|
78
|
-
end
|
79
|
-
|
80
|
-
g.theme_image_based
|
81
|
-
g.write("test/output/stacked_bar_image.png")
|
82
|
-
|
83
|
-
g = Gruff::StackedBar.new(400)
|
84
|
-
g.title = "Stacked Bar Graph With Image Background Small"
|
85
|
-
g.labels = {
|
86
|
-
0 => '5/6',
|
87
|
-
1 => '5/15',
|
88
|
-
2 => '5/24',
|
89
|
-
3 => '5/30',
|
90
|
-
}
|
91
|
-
@datasets.each do |data|
|
92
|
-
g.data(data[0], data[1])
|
93
|
-
end
|
94
|
-
|
95
|
-
g.theme_image_based
|
96
|
-
g.write("test/output/stacked_bar_image_small.png")
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
55
|
|
101
56
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: gruff
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-02-
|
6
|
+
version: 0.1.1
|
7
|
+
date: 2006-02-14
|
8
8
|
summary: Beautiful graphs for one or multiple datasets.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -27,7 +27,7 @@ platform: ruby
|
|
27
27
|
authors:
|
28
28
|
- Geoffrey Grosenbach
|
29
29
|
files:
|
30
|
-
-
|
30
|
+
- Rakefile
|
31
31
|
- README
|
32
32
|
- CHANGELOG
|
33
33
|
- MIT-LICENSE
|