gruff 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +10 -0
- data/Manifest.txt +35 -0
- data/{README → README.txt} +0 -0
- data/Rakefile +219 -201
- data/lib/gruff.rb +1 -1
- data/lib/gruff/bar.rb +8 -7
- data/lib/gruff/base.rb +58 -44
- data/lib/gruff/line.rb +1 -0
- data/lib/gruff/net.rb +16 -7
- data/lib/gruff/photo_bar.rb +1 -1
- data/lib/gruff/scene.rb +1 -1
- data/lib/gruff/spider.rb +2 -2
- data/test/{area_test.rb → test_area.rb} +0 -0
- data/test/{bar_test.rb → test_bar.rb} +0 -0
- data/test/{base_test.rb → test_base.rb} +0 -0
- data/test/{legend_test.rb → test_legend.rb} +0 -0
- data/test/{line_test.rb → test_line.rb} +21 -10
- data/test/{net_test.rb → test_net.rb} +0 -0
- data/test/test_photo.rb +41 -0
- data/test/{pie_test.rb → test_pie.rb} +0 -0
- data/test/{scene_test.rb → test_scene.rb} +0 -0
- data/test/{sidestacked_bar_test.rb → test_sidestacked_bar.rb} +0 -0
- data/test/{spider_test.rb → test_spider.rb} +0 -0
- data/test/{stacked_bar_test.rb → test_stacked_bar.rb} +0 -0
- metadata +32 -28
- data/assets/bubble.png +0 -0
- data/assets/pc306715.jpg +0 -0
- data/lib/CocoaMagick.rb +0 -311
- data/test/photo_test.rb +0 -41
data/lib/gruff.rb
CHANGED
@@ -10,6 +10,6 @@ require File.dirname(__FILE__) + '/gruff/spider'
|
|
10
10
|
require File.dirname(__FILE__) + '/gruff/net'
|
11
11
|
require File.dirname(__FILE__) + '/gruff/stacked_bar'
|
12
12
|
require File.dirname(__FILE__) + '/gruff/side_stacked_bar'
|
13
|
-
require File.dirname(__FILE__) + '/gruff/photo_bar'
|
13
|
+
# require File.dirname(__FILE__) + '/gruff/photo_bar'
|
14
14
|
|
15
15
|
require File.dirname(__FILE__) + '/gruff/scene'
|
data/lib/gruff/bar.rb
CHANGED
@@ -5,6 +5,11 @@ require File.dirname(__FILE__) + '/bar_conversion'
|
|
5
5
|
class Gruff::Bar < Gruff::Base
|
6
6
|
|
7
7
|
def draw
|
8
|
+
# Labels will be centered over the left of the bar if
|
9
|
+
# there are more labels than columns. This is basically the same
|
10
|
+
# as where it would be for a line graph.
|
11
|
+
@center_labels_over_point = (@labels.keys.length > @column_count ? true : false)
|
12
|
+
|
8
13
|
super
|
9
14
|
return unless @has_data
|
10
15
|
|
@@ -21,10 +26,6 @@ class Gruff::Bar < Gruff::Base
|
|
21
26
|
conversion.graph_height = @graph_height
|
22
27
|
conversion.graph_top = @graph_top
|
23
28
|
|
24
|
-
# Labels will be centered over the left of the bar if
|
25
|
-
# there are more labels than columns.
|
26
|
-
center_labels_left = (@labels.keys.length > @column_count ? true : false)
|
27
|
-
|
28
29
|
# Set up the right mode [1,2,3] see BarConversion for further explanation
|
29
30
|
if @minimum_value >= 0 then
|
30
31
|
# all bars go from zero to positiv
|
@@ -44,7 +45,6 @@ class Gruff::Bar < Gruff::Base
|
|
44
45
|
|
45
46
|
# iterate over all normalised data
|
46
47
|
@norm_data.each_with_index do |data_row, row_index|
|
47
|
-
@d = @d.fill data_row[DATA_COLOR_INDEX]
|
48
48
|
|
49
49
|
data_row[1].each_with_index do |data_point, point_index|
|
50
50
|
# Use incremented x and scaled y
|
@@ -56,6 +56,7 @@ class Gruff::Bar < Gruff::Base
|
|
56
56
|
conversion.getLeftYRightYscaled( data_point, conv )
|
57
57
|
|
58
58
|
# create new bar
|
59
|
+
@d = @d.fill data_row[DATA_COLOR_INDEX]
|
59
60
|
@d = @d.rectangle(left_x, conv[0], right_x, conv[1])
|
60
61
|
|
61
62
|
# Calculate center based on bar_width and current row
|
@@ -63,13 +64,13 @@ class Gruff::Bar < Gruff::Base
|
|
63
64
|
(@data.length * @bar_width * point_index) +
|
64
65
|
(@data.length * @bar_width / 2.0)
|
65
66
|
# Subtract half a bar width to center left if requested
|
66
|
-
draw_label(label_center - (
|
67
|
+
draw_label(label_center - (@center_labels_over_point ? @bar_width / 2.0 : 0.0), point_index)
|
67
68
|
end
|
68
69
|
|
69
70
|
end
|
70
71
|
|
71
72
|
# Draw the last label if requested
|
72
|
-
draw_label(@graph_right, @column_count) if
|
73
|
+
draw_label(@graph_right, @column_count) if @center_labels_over_point
|
73
74
|
|
74
75
|
@d.draw(@base_image)
|
75
76
|
end
|
data/lib/gruff/base.rb
CHANGED
@@ -20,7 +20,7 @@ require File.dirname(__FILE__) + '/deprecated'
|
|
20
20
|
|
21
21
|
module Gruff
|
22
22
|
|
23
|
-
VERSION = '0.2.
|
23
|
+
VERSION = '0.2.4'
|
24
24
|
|
25
25
|
class Base
|
26
26
|
|
@@ -48,6 +48,11 @@ module Gruff
|
|
48
48
|
# Example: 0 => 2005, 3 => 2006, 5 => 2007, 7 => 2008
|
49
49
|
attr_accessor :labels
|
50
50
|
|
51
|
+
# Used internally for spacing.
|
52
|
+
#
|
53
|
+
# By default, labels are centered over the point they represent.
|
54
|
+
attr_accessor :center_labels_over_point
|
55
|
+
|
51
56
|
# A label for the bottom of the graph
|
52
57
|
attr_accessor :x_axis_label
|
53
58
|
|
@@ -70,10 +75,10 @@ module Gruff
|
|
70
75
|
#
|
71
76
|
# Tries to find Bitstream Vera (Vera.ttf) in the location specified by
|
72
77
|
# ENV['MAGICK_FONT_PATH']. Uses default RMagick font otherwise.
|
73
|
-
|
78
|
+
attr_reader :font
|
74
79
|
|
75
80
|
# Hide various elements
|
76
|
-
attr_accessor :hide_line_markers, :hide_legend, :hide_title
|
81
|
+
attr_accessor :hide_line_markers, :hide_legend, :hide_title, :hide_line_numbers
|
77
82
|
|
78
83
|
# Message shown when there is no data. Fits up to 20 characters. Defaults to "No Data."
|
79
84
|
attr_accessor :no_data_message
|
@@ -104,7 +109,10 @@ module Gruff
|
|
104
109
|
#
|
105
110
|
# If you use this, you must set it after you have given all your data to the graph object.
|
106
111
|
attr_accessor :maximum_value
|
107
|
-
|
112
|
+
|
113
|
+
# Set to false if you don't want the data to be sorted with largest avg values at the back.
|
114
|
+
attr_accessor :sort
|
115
|
+
|
108
116
|
# Experimental
|
109
117
|
attr_accessor :additional_line_values
|
110
118
|
|
@@ -138,6 +146,8 @@ module Gruff
|
|
138
146
|
@data = Array.new
|
139
147
|
@labels = Hash.new
|
140
148
|
@labels_seen = Hash.new
|
149
|
+
@sort = true
|
150
|
+
@title = nil
|
141
151
|
|
142
152
|
@scale = @columns / @raw_columns
|
143
153
|
|
@@ -150,31 +160,22 @@ module Gruff
|
|
150
160
|
|
151
161
|
@no_data_message = "No Data"
|
152
162
|
|
153
|
-
@hide_line_markers = @hide_legend = @hide_title = false
|
163
|
+
@hide_line_markers = @hide_legend = @hide_title = @hide_line_numbers = false
|
164
|
+
@center_labels_over_point = true
|
154
165
|
|
155
166
|
@additional_line_values = []
|
156
167
|
@additional_line_colors = []
|
168
|
+
|
169
|
+
@x_axis_label = @y_axis_label = nil
|
170
|
+
@y_axis_increment = nil
|
171
|
+
@stacked = nil
|
172
|
+
@norm_data = nil
|
157
173
|
|
158
174
|
reset_themes()
|
159
175
|
theme_keynote()
|
160
176
|
end
|
161
177
|
|
162
|
-
# Add a color to the list of available colors for lines.
|
163
|
-
#
|
164
|
-
# Example:
|
165
|
-
# add_color('#c0e9d3')
|
166
|
-
def add_color(colorname)
|
167
|
-
@colors << colorname
|
168
|
-
end
|
169
178
|
|
170
|
-
# Replace the entire color list with a new array of colors. You need to have one more color
|
171
|
-
# than the number of datasets you intend to draw. Also aliased as the colors= setter method.
|
172
|
-
#
|
173
|
-
# Example:
|
174
|
-
# replace_colors('#cc99cc', '#d9e043', '#34d8a2')
|
175
|
-
def replace_colors(color_list=[])
|
176
|
-
@colors = color_list
|
177
|
-
end
|
178
179
|
|
179
180
|
# You can set a theme manually. Assign a hash to this method before you send your data.
|
180
181
|
#
|
@@ -204,9 +205,9 @@ module Gruff
|
|
204
205
|
@marker_color = options[:marker_color]
|
205
206
|
@additional_line_colors = options[:additional_line_colors]
|
206
207
|
if not options[:background_colors].nil?
|
207
|
-
@base_image = render_gradiated_background
|
208
|
+
@base_image = render_gradiated_background(*options[:background_colors])
|
208
209
|
else
|
209
|
-
@base_image = render_image_background
|
210
|
+
@base_image = render_image_background(*options[:background_image])
|
210
211
|
end
|
211
212
|
end
|
212
213
|
|
@@ -223,6 +224,7 @@ module Gruff
|
|
223
224
|
@colors << colorname
|
224
225
|
end
|
225
226
|
|
227
|
+
|
226
228
|
# Replace the entire color list with a new array of colors. You need to have one more color
|
227
229
|
# than the number of datasets you intend to draw. Also aliased as the colors= setter method.
|
228
230
|
#
|
@@ -231,6 +233,7 @@ module Gruff
|
|
231
233
|
def replace_colors(color_list=[])
|
232
234
|
@colors = color_list
|
233
235
|
end
|
236
|
+
|
234
237
|
|
235
238
|
# A color scheme similar to the popular presentation software.
|
236
239
|
def theme_keynote
|
@@ -375,11 +378,13 @@ protected
|
|
375
378
|
make_stacked if @stacked
|
376
379
|
setup_drawing()
|
377
380
|
|
378
|
-
debug
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
381
|
+
debug do
|
382
|
+
# Outer margin
|
383
|
+
@d.rectangle( LEFT_MARGIN, TOP_MARGIN,
|
384
|
+
@raw_columns - RIGHT_MARGIN, @raw_rows - BOTTOM_MARGIN)
|
385
|
+
# Graph area box
|
386
|
+
@d.rectangle( @graph_left, @graph_top, @graph_right, @graph_bottom)
|
387
|
+
end
|
383
388
|
end
|
384
389
|
|
385
390
|
# Draws the decorations.
|
@@ -395,7 +400,7 @@ protected
|
|
395
400
|
|
396
401
|
normalize()
|
397
402
|
setup_graph_measurements()
|
398
|
-
sort_norm_data() # Sort norm_data with avg largest values set first (for display)
|
403
|
+
sort_norm_data() if @sort # Sort norm_data with avg largest values set first (for display)
|
399
404
|
|
400
405
|
draw_legend()
|
401
406
|
draw_line_markers()
|
@@ -440,15 +445,22 @@ protected
|
|
440
445
|
@graph_right_margin,
|
441
446
|
@graph_bottom_margin) = [LEFT_MARGIN, RIGHT_MARGIN, BOTTOM_MARGIN]
|
442
447
|
else
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
448
|
+
# Shift graph if left line numbers are hidden
|
449
|
+
line_number_width = @hide_line_numbers ?
|
450
|
+
0.0 :
|
451
|
+
(calculate_width(@marker_font_size, label(@maximum_value.to_f)) + LABEL_MARGIN * 2)
|
452
|
+
|
453
|
+
@graph_left = LEFT_MARGIN +
|
454
|
+
line_number_width +
|
455
|
+
(@y_axis_label.nil? ? 0.0 : @marker_caps_height + LABEL_MARGIN * 2)
|
447
456
|
# Make space for half the width of the rightmost column label.
|
448
457
|
# Might be greater than the number of columns if between-style bar markers are used.
|
449
458
|
last_label = @labels.keys.sort.last.to_i
|
450
|
-
|
451
|
-
|
459
|
+
extra_room_for_long_label = (last_label >= (@column_count-1) && @center_labels_over_point) ?
|
460
|
+
calculate_width(@marker_font_size, @labels[last_label])/2.0 :
|
461
|
+
0
|
462
|
+
@graph_right_margin = RIGHT_MARGIN + extra_room_for_long_label
|
463
|
+
|
452
464
|
@graph_bottom_margin = BOTTOM_MARGIN +
|
453
465
|
@marker_caps_height + LABEL_MARGIN
|
454
466
|
end
|
@@ -541,17 +553,19 @@ protected
|
|
541
553
|
|
542
554
|
marker_label = index * @increment + @minimum_value.to_f
|
543
555
|
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
556
|
+
unless @hide_line_numbers
|
557
|
+
@d.fill = @marker_color
|
558
|
+
@d.font = @font if @font
|
559
|
+
@d.stroke = 'transparent'
|
560
|
+
@d.pointsize = scale_fontsize(@marker_font_size)
|
561
|
+
@d.gravity = EastGravity
|
549
562
|
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
563
|
+
# Vertically center with 1.0 for the height
|
564
|
+
@d = @d.annotate_scaled( @base_image,
|
565
|
+
@graph_left - LABEL_MARGIN, 1.0,
|
566
|
+
0.0, y,
|
567
|
+
label(marker_label), @scale)
|
568
|
+
end
|
555
569
|
end
|
556
570
|
|
557
571
|
# Submitted by a contibutor...the utility escapes me
|
data/lib/gruff/line.rb
CHANGED
data/lib/gruff/net.rb
CHANGED
@@ -4,6 +4,15 @@ require File.dirname(__FILE__) + '/base'
|
|
4
4
|
# Experimental!!! See also the Spider graph.
|
5
5
|
class Gruff::Net < Gruff::Base
|
6
6
|
|
7
|
+
# Hide parts of the graph to fit more datapoints, or for a different appearance.
|
8
|
+
attr_accessor :hide_dots
|
9
|
+
|
10
|
+
def initialize(*args)
|
11
|
+
super
|
12
|
+
|
13
|
+
@hide_dots = false
|
14
|
+
end
|
15
|
+
|
7
16
|
def draw
|
8
17
|
|
9
18
|
super
|
@@ -121,13 +130,13 @@ private
|
|
121
130
|
|
122
131
|
end
|
123
132
|
|
124
|
-
|
125
|
-
class Float
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
133
|
+
# # This method is already in Float
|
134
|
+
# class Float
|
135
|
+
# # Used for degree => radian conversions
|
136
|
+
# def deg2rad
|
137
|
+
# self * (Math::PI/180.0)
|
138
|
+
# end
|
139
|
+
# end
|
131
140
|
|
132
141
|
|
133
142
|
|
data/lib/gruff/photo_bar.rb
CHANGED
data/lib/gruff/scene.rb
CHANGED
data/lib/gruff/spider.rb
CHANGED
@@ -7,9 +7,9 @@ require File.dirname(__FILE__) + '/base'
|
|
7
7
|
class Gruff::Spider < Gruff::Base
|
8
8
|
|
9
9
|
# Hide all text
|
10
|
-
|
10
|
+
attr_reader :hide_text
|
11
11
|
attr_accessor :hide_axes
|
12
|
-
|
12
|
+
attr_reader :transparent_background
|
13
13
|
|
14
14
|
def transparent_background=(value)
|
15
15
|
@transparent_background = value
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -58,7 +58,7 @@ class TestGruffLine < GruffTestCase
|
|
58
58
|
end
|
59
59
|
|
60
60
|
|
61
|
-
def
|
61
|
+
def test_should_not_hang_with_0_0_100
|
62
62
|
g = Gruff::Line.new(320)
|
63
63
|
g.title = "Hang Value Graph Test"
|
64
64
|
g.data('test', [0,0,100])
|
@@ -66,15 +66,16 @@ class TestGruffLine < GruffTestCase
|
|
66
66
|
g.write("test/output/line_hang_value.png")
|
67
67
|
end
|
68
68
|
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
69
|
+
# TODO
|
70
|
+
# def test_fix_crash
|
71
|
+
# g = Gruff::Line.new(370)
|
72
|
+
# g.title = "Crash Test"
|
73
|
+
# g.data "ichi", [5]
|
74
|
+
# g.data "ni", [0]
|
75
|
+
# g.data "san", [0]
|
76
|
+
# g.data "shi", [0]
|
77
|
+
# g.write("test/output/line_crash_fix_test.png")
|
78
|
+
# end
|
78
79
|
|
79
80
|
|
80
81
|
def test_line_small_values
|
@@ -424,6 +425,16 @@ class TestGruffLine < GruffTestCase
|
|
424
425
|
g.write('test/output/line_many_numbers.png')
|
425
426
|
end
|
426
427
|
|
428
|
+
def test_no_hide_line_no_labels
|
429
|
+
g = Gruff::Line.new
|
430
|
+
g.title = "No Hide Line No Labels"
|
431
|
+
@datasets.each do |data|
|
432
|
+
g.data(data[0], data[1])
|
433
|
+
end
|
434
|
+
g.hide_line_markers = false
|
435
|
+
g.write('test/output/line_no_hide.png')
|
436
|
+
end
|
437
|
+
|
427
438
|
protected
|
428
439
|
|
429
440
|
# TODO Reset data after each theme
|
File without changes
|
data/test/test_photo.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + "/gruff_test_case"
|
4
|
+
|
5
|
+
class TestGruffPhotoBar < GruffTestCase
|
6
|
+
|
7
|
+
# def setup
|
8
|
+
# @datasets = [
|
9
|
+
# [:Jimmy, [25, 36, 86, 39]],
|
10
|
+
# [:Charles, [80, 54, 67, 54]],
|
11
|
+
# # [:Charity, [0, nil, 100, 90]],
|
12
|
+
# ]
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# def test_bar_graph
|
16
|
+
# bar_graph_sized
|
17
|
+
# bar_graph_sized(400)
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# protected
|
22
|
+
#
|
23
|
+
# def bar_graph_sized(size=800)
|
24
|
+
# g = Gruff::PhotoBar.new(size)
|
25
|
+
# g.title = "Photo Bar Graph Test #{size}px"
|
26
|
+
# g.labels = {
|
27
|
+
# 0 => '5/6',
|
28
|
+
# 1 => '5/15',
|
29
|
+
# 2 => '5/24',
|
30
|
+
# 3 => '5/30',
|
31
|
+
# }
|
32
|
+
# @datasets.each do |data|
|
33
|
+
# g.data(*data)
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# g.theme = 'plastik'
|
37
|
+
#
|
38
|
+
# g.write("test/output/photo_plastik_#{size}.png")
|
39
|
+
# end
|
40
|
+
|
41
|
+
end
|