gruff 0.1.0 → 0.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.
- 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
|