gruff 0.10.0-java → 0.11.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -3
- data/.rubocop_todo.yml +1 -19
- data/CHANGELOG.md +11 -0
- data/Rakefile +24 -0
- data/lib/gruff/area.rb +2 -2
- data/lib/gruff/bar.rb +5 -5
- data/lib/gruff/base.rb +173 -149
- data/lib/gruff/bullet.rb +12 -7
- data/lib/gruff/dot.rb +8 -28
- data/lib/gruff/helper/bar_conversion.rb +6 -6
- data/lib/gruff/histogram.rb +25 -24
- data/lib/gruff/line.rb +24 -15
- data/lib/gruff/mini/legend.rb +1 -1
- data/lib/gruff/net.rb +15 -15
- data/lib/gruff/photo_bar.rb +12 -12
- data/lib/gruff/pie.rb +18 -25
- data/lib/gruff/renderer/line.rb +10 -2
- data/lib/gruff/renderer/renderer.rb +7 -2
- data/lib/gruff/renderer/text.rb +11 -0
- data/lib/gruff/scatter.rb +20 -15
- data/lib/gruff/side_bar.rb +12 -10
- data/lib/gruff/side_stacked_bar.rb +6 -7
- data/lib/gruff/spider.rb +16 -11
- data/lib/gruff/stacked_area.rb +8 -2
- data/lib/gruff/stacked_bar.rb +6 -7
- data/lib/gruff/store/base_data.rb +4 -0
- data/lib/gruff/store/custom_data.rb +4 -0
- data/lib/gruff/store/store.rb +1 -1
- data/lib/gruff/store/xy_data.rb +4 -0
- data/lib/gruff/version.rb +1 -1
- metadata +2 -2
data/lib/gruff/renderer/line.rb
CHANGED
@@ -6,10 +6,18 @@ module Gruff
|
|
6
6
|
|
7
7
|
def initialize(args = {})
|
8
8
|
@color = args[:color]
|
9
|
+
@shadow_color = args[:shadow_color]
|
9
10
|
@width = args[:width]
|
10
11
|
end
|
11
12
|
|
12
13
|
def render(start_x, start_y, end_x, end_y)
|
14
|
+
render_line(start_x, start_y, end_x, end_y, @color)
|
15
|
+
render_line(start_x, start_y + 1, end_x, end_y + 1, @shadow_color) if @shadow_color
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def render_line(start_x, start_y, end_x, end_y, color)
|
13
21
|
# FIXME(uwe): Workaround for Issue #66
|
14
22
|
# https://github.com/topfunky/gruff/issues/66
|
15
23
|
# https://github.com/rmagick/rmagick/issues/82
|
@@ -24,8 +32,8 @@ module Gruff
|
|
24
32
|
draw = Renderer.instance.draw
|
25
33
|
|
26
34
|
draw.push
|
27
|
-
draw.stroke(
|
28
|
-
draw.fill(
|
35
|
+
draw.stroke(color)
|
36
|
+
draw.fill(color)
|
29
37
|
draw.stroke_width(@width) if @width
|
30
38
|
draw.line(start_x, start_y, end_x, end_y)
|
31
39
|
draw.pop
|
@@ -7,7 +7,7 @@ module Gruff
|
|
7
7
|
class Renderer
|
8
8
|
include Singleton
|
9
9
|
|
10
|
-
attr_accessor :draw, :image, :scale
|
10
|
+
attr_accessor :draw, :image, :scale, :text_renderers
|
11
11
|
|
12
12
|
class << self
|
13
13
|
def setup(columns, rows, font, scale, theme_options)
|
@@ -21,6 +21,7 @@ module Gruff
|
|
21
21
|
Renderer.instance.draw = draw
|
22
22
|
Renderer.instance.scale = scale
|
23
23
|
Renderer.instance.image = image
|
24
|
+
Renderer.instance.text_renderers = []
|
24
25
|
end
|
25
26
|
|
26
27
|
def setup_transparent_background(columns, rows)
|
@@ -42,6 +43,10 @@ module Gruff
|
|
42
43
|
image = Renderer.instance.image
|
43
44
|
|
44
45
|
draw.draw(image)
|
46
|
+
|
47
|
+
Renderer.instance.text_renderers.each do |renderer|
|
48
|
+
renderer.render(renderer.width, renderer.height, renderer.x, renderer.y, renderer.gravity)
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
def write(file_name)
|
@@ -102,7 +107,7 @@ module Gruff
|
|
102
107
|
|
103
108
|
if @gradated_background_retry_count < 3
|
104
109
|
@gradated_background_retry_count += 1
|
105
|
-
gradated_background(top_color, bottom_color, direct)
|
110
|
+
gradated_background(columns, rows, top_color, bottom_color, direct)
|
106
111
|
else
|
107
112
|
raise e
|
108
113
|
end
|
data/lib/gruff/renderer/text.rb
CHANGED
@@ -11,6 +11,17 @@ module Gruff
|
|
11
11
|
@rotation = args[:rotation]
|
12
12
|
end
|
13
13
|
|
14
|
+
attr_reader :width, :height, :x, :y, :gravity
|
15
|
+
def add_to_render_queue(width, height, x, y, gravity = Magick::NorthGravity)
|
16
|
+
@width = width
|
17
|
+
@height = height
|
18
|
+
@x = x
|
19
|
+
@y = y
|
20
|
+
@gravity = gravity
|
21
|
+
|
22
|
+
Renderer.instance.text_renderers << self
|
23
|
+
end
|
24
|
+
|
14
25
|
def render(width, height, x, y, gravity = Magick::NorthGravity)
|
15
26
|
draw = Renderer.instance.draw
|
16
27
|
image = Renderer.instance.image
|
data/lib/gruff/scatter.rb
CHANGED
@@ -13,33 +13,38 @@ require 'gruff/base'
|
|
13
13
|
class Gruff::Scatter < Gruff::Base
|
14
14
|
# Maximum X Value. The value will get overwritten by the max in the
|
15
15
|
# datasets.
|
16
|
-
|
16
|
+
attr_writer :maximum_x_value
|
17
17
|
|
18
18
|
# Minimum X Value. The value will get overwritten by the min in the
|
19
19
|
# datasets.
|
20
|
-
|
20
|
+
attr_writer :minimum_x_value
|
21
21
|
|
22
22
|
# The number of vertical lines shown for reference.
|
23
|
-
|
23
|
+
attr_writer :marker_x_count
|
24
24
|
|
25
25
|
# Attributes to allow customising the size of the points.
|
26
|
-
|
27
|
-
|
26
|
+
attr_writer :circle_radius
|
27
|
+
attr_writer :stroke_width
|
28
28
|
|
29
29
|
# Allow disabling the significant rounding when labeling the X axis.
|
30
30
|
# This is useful when working with a small range of high values (for example, a date range of months, while seconds as units).
|
31
|
-
|
31
|
+
attr_writer :disable_significant_rounding_x_axis
|
32
32
|
|
33
33
|
# Allow enabling vertical lines. When you have a lot of data, they can work great.
|
34
|
-
|
34
|
+
attr_writer :enable_vertical_line_markers
|
35
35
|
|
36
36
|
# Allow using vertical labels in the X axis (and setting the label margin).
|
37
|
-
|
38
|
-
|
37
|
+
attr_writer :x_label_margin
|
38
|
+
attr_writer :use_vertical_x_labels
|
39
39
|
|
40
40
|
# Allow passing lambdas to format labels.
|
41
|
-
|
42
|
-
|
41
|
+
attr_writer :y_axis_label_format
|
42
|
+
attr_writer :x_axis_label_format
|
43
|
+
|
44
|
+
def initialize_store
|
45
|
+
@store = Gruff::Store.new(Gruff::Store::XYData)
|
46
|
+
end
|
47
|
+
private :initialize_store
|
43
48
|
|
44
49
|
def initialize_ivars
|
45
50
|
super
|
@@ -56,8 +61,6 @@ class Gruff::Scatter < Gruff::Base
|
|
56
61
|
@x_axis_label_format = nil
|
57
62
|
@x_label_margin = nil
|
58
63
|
@y_axis_label_format = nil
|
59
|
-
|
60
|
-
@store = Gruff::Store.new(Gruff::Store::XYData)
|
61
64
|
end
|
62
65
|
private :initialize_ivars
|
63
66
|
|
@@ -202,7 +205,9 @@ private
|
|
202
205
|
# TODO: Fix the vertical lines, and enable them by default. Not pretty when they don't match up with top y-axis line
|
203
206
|
if @enable_vertical_line_markers
|
204
207
|
x = @graph_left + @graph_width - index.to_f * increment_x_scaled
|
205
|
-
|
208
|
+
|
209
|
+
line_renderer = Gruff::Renderer::Line.new(color: @marker_color, shadow_color: @marker_shadow_color)
|
210
|
+
line_renderer.render(x, @graph_top, x, @graph_bottom)
|
206
211
|
end
|
207
212
|
|
208
213
|
unless @hide_line_numbers
|
@@ -213,7 +218,7 @@ private
|
|
213
218
|
label = vertical_label(marker_label, @x_increment)
|
214
219
|
rotation = -90.0 if @use_vertical_x_labels
|
215
220
|
text_renderer = Gruff::Renderer::Text.new(label, font: @font, size: @marker_font_size, color: @font_color, rotation: rotation)
|
216
|
-
text_renderer.
|
221
|
+
text_renderer.add_to_render_queue(1.0, 1.0, x_offset, y_offset)
|
217
222
|
end
|
218
223
|
end
|
219
224
|
end
|
data/lib/gruff/side_bar.rb
CHANGED
@@ -22,21 +22,23 @@ require 'gruff/base'
|
|
22
22
|
#
|
23
23
|
class Gruff::SideBar < Gruff::Base
|
24
24
|
# Spacing factor applied between bars.
|
25
|
-
|
25
|
+
attr_writer :bar_spacing
|
26
26
|
|
27
27
|
# Spacing factor applied between a group of bars belonging to the same label.
|
28
|
-
|
28
|
+
attr_writer :group_spacing
|
29
29
|
|
30
30
|
# Set the number output format for labels using sprintf.
|
31
31
|
# Default is +"%.2f"+.
|
32
|
-
|
32
|
+
attr_writer :label_formatting
|
33
33
|
|
34
34
|
# Output the values for the bars on a bar graph.
|
35
35
|
# Default is +false+.
|
36
|
-
|
36
|
+
attr_writer :show_labels_for_bar_values
|
37
37
|
|
38
38
|
def initialize_ivars
|
39
39
|
super
|
40
|
+
@bar_spacing = 0.9
|
41
|
+
@group_spacing = 10
|
40
42
|
@label_formatting = nil
|
41
43
|
@show_labels_for_bar_values = false
|
42
44
|
end
|
@@ -56,9 +58,6 @@ private
|
|
56
58
|
def draw_bars
|
57
59
|
# Setup spacing.
|
58
60
|
#
|
59
|
-
@bar_spacing ||= 0.9
|
60
|
-
@group_spacing ||= 10
|
61
|
-
|
62
61
|
bars_width = (@graph_height - calculate_spacing) / column_count.to_f
|
63
62
|
bar_width = bars_width / store.length
|
64
63
|
height = Array.new(column_count, 0)
|
@@ -123,13 +122,16 @@ private
|
|
123
122
|
(0..number_of_lines).each do |index|
|
124
123
|
line_diff = (@graph_right - @graph_left) / number_of_lines
|
125
124
|
x = @graph_right - (line_diff * index) - 1
|
126
|
-
|
125
|
+
|
126
|
+
line_renderer = Gruff::Renderer::Line.new(color: @marker_color, shadow_color: @marker_shadow_color)
|
127
|
+
line_renderer.render(x, @graph_bottom, x, @graph_top)
|
128
|
+
|
127
129
|
diff = index - number_of_lines
|
128
130
|
marker_label = diff.abs * increment + minimum_value
|
129
131
|
|
130
132
|
unless @hide_line_numbers
|
131
133
|
text_renderer = Gruff::Renderer::Text.new(marker_label, font: @font, size: @marker_font_size, color: @font_color)
|
132
|
-
text_renderer.
|
134
|
+
text_renderer.add_to_render_queue(0, 0, x, @graph_bottom + LABEL_MARGIN, Magick::CenterGravity)
|
133
135
|
end
|
134
136
|
end
|
135
137
|
end
|
@@ -142,7 +144,7 @@ private
|
|
142
144
|
lbl = @use_data_label ? label : @labels[index]
|
143
145
|
|
144
146
|
text_renderer = Gruff::Renderer::Text.new(lbl, font: @font, size: @marker_font_size, color: @font_color)
|
145
|
-
text_renderer.
|
147
|
+
text_renderer.add_to_render_queue(@graph_left - LABEL_MARGIN, 1.0, 0.0, y_offset, Magick::EastGravity)
|
146
148
|
end
|
147
149
|
end
|
148
150
|
|
@@ -27,21 +27,23 @@ class Gruff::SideStackedBar < Gruff::SideBar
|
|
27
27
|
include BarValueLabelMixin
|
28
28
|
|
29
29
|
# Spacing factor applied between bars.
|
30
|
-
|
30
|
+
attr_writer :bar_spacing
|
31
31
|
|
32
32
|
# Number of pixels between bar segments.
|
33
|
-
|
33
|
+
attr_writer :segment_spacing
|
34
34
|
|
35
35
|
# Set the number output format for labels using sprintf.
|
36
36
|
# Default is +"%.2f"+.
|
37
|
-
|
37
|
+
attr_writer :label_formatting
|
38
38
|
|
39
39
|
# Output the values for the bars on a bar graph.
|
40
40
|
# Default is +false+.
|
41
|
-
|
41
|
+
attr_writer :show_labels_for_bar_values
|
42
42
|
|
43
43
|
def initialize_ivars
|
44
44
|
super
|
45
|
+
@bar_spacing = 0.9
|
46
|
+
@segment_spacing = 2.0
|
45
47
|
@label_formatting = nil
|
46
48
|
@show_labels_for_bar_values = false
|
47
49
|
end
|
@@ -59,9 +61,6 @@ private
|
|
59
61
|
# Setup spacing.
|
60
62
|
#
|
61
63
|
# Columns sit stacked.
|
62
|
-
@bar_spacing ||= 0.9
|
63
|
-
@segment_spacing ||= 2.0
|
64
|
-
|
65
64
|
bar_width = @graph_height / column_count.to_f
|
66
65
|
height = Array.new(column_count, 0)
|
67
66
|
length = Array.new(column_count, @graph_left)
|
data/lib/gruff/spider.rb
CHANGED
@@ -18,10 +18,8 @@ require 'gruff/base'
|
|
18
18
|
|
19
19
|
class Gruff::Spider < Gruff::Base
|
20
20
|
# Hide all text.
|
21
|
-
|
22
|
-
|
23
|
-
attr_reader :transparent_background
|
24
|
-
attr_accessor :rotation
|
21
|
+
attr_writer :hide_axes
|
22
|
+
attr_writer :rotation
|
25
23
|
|
26
24
|
def transparent_background=(value)
|
27
25
|
Gruff::Renderer.setup_transparent_background(@columns, @rows) if value
|
@@ -34,9 +32,16 @@ class Gruff::Spider < Gruff::Base
|
|
34
32
|
def initialize(max_value, target_width = 800)
|
35
33
|
super(target_width)
|
36
34
|
@max_value = max_value
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize_ivars
|
38
|
+
super
|
37
39
|
@hide_legend = true
|
40
|
+
@hide_axes = false
|
41
|
+
@hide_text = false
|
38
42
|
@rotation = 0
|
39
43
|
end
|
44
|
+
private :initialize_ivars
|
40
45
|
|
41
46
|
def draw
|
42
47
|
@hide_line_markers = true
|
@@ -55,7 +60,7 @@ class Gruff::Spider < Gruff::Base
|
|
55
60
|
additive_angle = (2 * Math::PI) / store.length
|
56
61
|
|
57
62
|
# Draw axes
|
58
|
-
draw_axes(center_x, center_y, radius, additive_angle) unless hide_axes
|
63
|
+
draw_axes(center_x, center_y, radius, additive_angle) unless @hide_axes
|
59
64
|
|
60
65
|
# Draw polygon
|
61
66
|
draw_polygon(center_x, center_y, additive_angle)
|
@@ -77,14 +82,14 @@ private
|
|
77
82
|
y = y_offset + ((radius + r_offset) * Math.sin(angle))
|
78
83
|
|
79
84
|
# Draw label
|
80
|
-
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: legend_font_size, color: @marker_color, weight: Magick::BoldWeight)
|
81
|
-
text_renderer.
|
85
|
+
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: @legend_font_size, color: @marker_color, weight: Magick::BoldWeight)
|
86
|
+
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
82
87
|
end
|
83
88
|
|
84
89
|
def draw_axes(center_x, center_y, radius, additive_angle, line_color = nil)
|
85
|
-
return if hide_axes
|
90
|
+
return if @hide_axes
|
86
91
|
|
87
|
-
current_angle = rotation * Math::PI / 180.0
|
92
|
+
current_angle = @rotation * Math::PI / 180.0
|
88
93
|
|
89
94
|
store.data.each do |data_row|
|
90
95
|
x_offset = radius * Math.cos(current_angle)
|
@@ -93,7 +98,7 @@ private
|
|
93
98
|
Gruff::Renderer::Line.new(color: line_color || data_row.color, width: 5.0)
|
94
99
|
.render(center_x, center_y, center_x + x_offset, center_y + y_offset)
|
95
100
|
|
96
|
-
draw_label(center_x, center_y, current_angle, radius, data_row.label.to_s) unless hide_text
|
101
|
+
draw_label(center_x, center_y, current_angle, radius, data_row.label.to_s) unless @hide_text
|
97
102
|
|
98
103
|
current_angle += additive_angle
|
99
104
|
end
|
@@ -101,7 +106,7 @@ private
|
|
101
106
|
|
102
107
|
def draw_polygon(center_x, center_y, additive_angle, color = nil)
|
103
108
|
points = []
|
104
|
-
current_angle = rotation * Math::PI / 180.0
|
109
|
+
current_angle = @rotation * Math::PI / 180.0
|
105
110
|
|
106
111
|
store.data.each do |data_row|
|
107
112
|
points << center_x + normalize_points(data_row.points.first) * Math.cos(current_angle)
|
data/lib/gruff/stacked_area.rb
CHANGED
@@ -15,7 +15,13 @@ require 'gruff/helper/stacked_mixin'
|
|
15
15
|
#
|
16
16
|
class Gruff::StackedArea < Gruff::Base
|
17
17
|
include StackedMixin
|
18
|
-
|
18
|
+
attr_writer :last_series_goes_on_bottom
|
19
|
+
|
20
|
+
def initialize_ivars
|
21
|
+
super
|
22
|
+
@last_series_goes_on_bottom = false
|
23
|
+
end
|
24
|
+
private :initialize_ivars
|
19
25
|
|
20
26
|
def draw
|
21
27
|
calculate_maximum_by_stack
|
@@ -28,7 +34,7 @@ class Gruff::StackedArea < Gruff::Base
|
|
28
34
|
height = Array.new(column_count, 0)
|
29
35
|
|
30
36
|
data_points = nil
|
31
|
-
iterator = last_series_goes_on_bottom ? :reverse_each : :each
|
37
|
+
iterator = @last_series_goes_on_bottom ? :reverse_each : :each
|
32
38
|
store.norm_data.public_send(iterator) do |data_row|
|
33
39
|
prev_data_points = data_points
|
34
40
|
data_points = []
|
data/lib/gruff/stacked_bar.rb
CHANGED
@@ -19,21 +19,23 @@ class Gruff::StackedBar < Gruff::Base
|
|
19
19
|
include BarValueLabelMixin
|
20
20
|
|
21
21
|
# Spacing factor applied between bars.
|
22
|
-
|
22
|
+
attr_writer :bar_spacing
|
23
23
|
|
24
24
|
# Number of pixels between bar segments.
|
25
|
-
|
25
|
+
attr_writer :segment_spacing
|
26
26
|
|
27
27
|
# Set the number output format for labels using sprintf.
|
28
28
|
# Default is +"%.2f"+.
|
29
|
-
|
29
|
+
attr_writer :label_formatting
|
30
30
|
|
31
31
|
# Output the values for the bars on a bar graph.
|
32
32
|
# Default is +false+.
|
33
|
-
|
33
|
+
attr_writer :show_labels_for_bar_values
|
34
34
|
|
35
35
|
def initialize_ivars
|
36
36
|
super
|
37
|
+
@bar_spacing = 0.9
|
38
|
+
@segment_spacing = 2
|
37
39
|
@label_formatting = nil
|
38
40
|
@show_labels_for_bar_values = false
|
39
41
|
end
|
@@ -48,9 +50,6 @@ class Gruff::StackedBar < Gruff::Base
|
|
48
50
|
# Setup spacing.
|
49
51
|
#
|
50
52
|
# Columns sit stacked.
|
51
|
-
@bar_spacing ||= 0.9
|
52
|
-
@segment_spacing ||= 2
|
53
|
-
|
54
53
|
bar_width = @graph_width / column_count.to_f
|
55
54
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
56
55
|
|
data/lib/gruff/store/store.rb
CHANGED
data/lib/gruff/store/xy_data.rb
CHANGED
data/lib/gruff/version.rb
CHANGED