gruff 0.10.0-java → 0.13.0-java
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +24 -4
- data/.rubocop_todo.yml +94 -42
- data/.travis.yml +3 -6
- data/CHANGELOG.md +35 -0
- data/README.md +10 -1
- data/assets/fonts/LICENSE.txt +202 -0
- data/assets/fonts/Roboto-Bold.ttf +0 -0
- data/assets/fonts/Roboto-Regular.ttf +0 -0
- data/gruff.gemspec +8 -3
- data/lib/gruff.rb +8 -3
- data/lib/gruff/accumulator_bar.rb +0 -2
- data/lib/gruff/area.rb +2 -6
- data/lib/gruff/bar.rb +35 -35
- data/lib/gruff/base.rb +295 -188
- data/lib/gruff/bezier.rb +0 -4
- data/lib/gruff/bullet.rb +12 -14
- data/lib/gruff/dot.rb +8 -33
- data/lib/gruff/helper/bar_conversion.rb +34 -19
- data/lib/gruff/helper/bar_value_label.rb +68 -0
- data/lib/gruff/histogram.rb +25 -25
- data/lib/gruff/line.rb +29 -26
- data/lib/gruff/mini/bar.rb +1 -1
- data/lib/gruff/mini/legend.rb +9 -4
- data/lib/gruff/mini/pie.rb +1 -2
- data/lib/gruff/mini/side_bar.rb +1 -2
- data/lib/gruff/net.rb +19 -20
- data/lib/gruff/patch/rmagick.rb +22 -24
- data/lib/gruff/patch/string.rb +7 -4
- data/lib/gruff/photo_bar.rb +12 -16
- data/lib/gruff/pie.rb +19 -30
- data/lib/gruff/renderer/bezier.rb +4 -3
- data/lib/gruff/renderer/circle.rb +4 -3
- data/lib/gruff/renderer/dash_line.rb +4 -3
- data/lib/gruff/renderer/dot.rb +4 -3
- data/lib/gruff/renderer/ellipse.rb +4 -3
- data/lib/gruff/renderer/line.rb +14 -5
- data/lib/gruff/renderer/polygon.rb +5 -4
- data/lib/gruff/renderer/polyline.rb +4 -3
- data/lib/gruff/renderer/rectangle.rb +3 -2
- data/lib/gruff/renderer/renderer.rb +31 -38
- data/lib/gruff/renderer/text.rb +39 -9
- data/lib/gruff/scatter.rb +30 -44
- data/lib/gruff/scene.rb +0 -1
- data/lib/gruff/side_bar.rb +60 -45
- data/lib/gruff/side_stacked_bar.rb +30 -19
- data/lib/gruff/spider.rb +18 -17
- data/lib/gruff/stacked_area.rb +8 -7
- data/lib/gruff/stacked_bar.rb +28 -18
- data/lib/gruff/store/{base_data.rb → basic_data.rb} +9 -7
- data/lib/gruff/store/custom_data.rb +8 -6
- data/lib/gruff/store/store.rb +6 -5
- data/lib/gruff/store/xy_data.rb +10 -7
- data/lib/gruff/version.rb +1 -1
- metadata +36 -9
- data/Rakefile +0 -23
- data/docker/Dockerfile +0 -14
- data/docker/build.sh +0 -4
- data/docker/launch.sh +0 -4
- data/lib/gruff/helper/bar_value_label_mixin.rb +0 -30
data/lib/gruff/scene.rb
CHANGED
data/lib/gruff/side_bar.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'gruff/base'
|
|
4
|
-
|
|
5
3
|
# Graph with individual horizontal bars instead of vertical bars.
|
|
6
4
|
#
|
|
7
5
|
# Here's how to set up a Gruff::SideBar.
|
|
@@ -22,23 +20,29 @@ require 'gruff/base'
|
|
|
22
20
|
#
|
|
23
21
|
class Gruff::SideBar < Gruff::Base
|
|
24
22
|
# Spacing factor applied between bars.
|
|
25
|
-
|
|
23
|
+
attr_writer :bar_spacing
|
|
26
24
|
|
|
27
25
|
# Spacing factor applied between a group of bars belonging to the same label.
|
|
28
|
-
|
|
26
|
+
attr_writer :group_spacing
|
|
29
27
|
|
|
30
|
-
# Set the number output format
|
|
28
|
+
# Set the number output format string or lambda.
|
|
31
29
|
# Default is +"%.2f"+.
|
|
32
|
-
|
|
30
|
+
attr_writer :label_formatting
|
|
33
31
|
|
|
34
32
|
# Output the values for the bars on a bar graph.
|
|
35
33
|
# Default is +false+.
|
|
36
|
-
|
|
34
|
+
attr_writer :show_labels_for_bar_values
|
|
35
|
+
|
|
36
|
+
# Prevent drawing of column labels left of a side bar graph. Default is +false+.
|
|
37
|
+
attr_writer :hide_labels
|
|
37
38
|
|
|
38
39
|
def initialize_ivars
|
|
39
40
|
super
|
|
41
|
+
@bar_spacing = 0.9
|
|
42
|
+
@group_spacing = 10
|
|
40
43
|
@label_formatting = nil
|
|
41
44
|
@show_labels_for_bar_values = false
|
|
45
|
+
@hide_labels = false
|
|
42
46
|
end
|
|
43
47
|
private :initialize_ivars
|
|
44
48
|
|
|
@@ -51,20 +55,44 @@ class Gruff::SideBar < Gruff::Base
|
|
|
51
55
|
draw_bars
|
|
52
56
|
end
|
|
53
57
|
|
|
58
|
+
# With Side Bars use the data label for the marker value to the left of the bar.
|
|
59
|
+
# @deprecated
|
|
60
|
+
def use_data_label=(_value)
|
|
61
|
+
warn '#use_data_label is deprecated. It is no longer effective.'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
protected
|
|
65
|
+
|
|
66
|
+
def hide_labels?
|
|
67
|
+
@hide_labels
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def hide_left_label_area?
|
|
71
|
+
hide_labels?
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def hide_bottom_label_area?
|
|
75
|
+
@hide_line_markers
|
|
76
|
+
end
|
|
77
|
+
|
|
54
78
|
private
|
|
55
79
|
|
|
80
|
+
# Value to avoid completely overwriting the coordinate axis
|
|
81
|
+
AXIS_MARGIN = 0.5
|
|
82
|
+
|
|
56
83
|
def draw_bars
|
|
57
84
|
# Setup spacing.
|
|
58
85
|
#
|
|
59
|
-
@bar_spacing ||= 0.9
|
|
60
|
-
@group_spacing ||= 10
|
|
61
|
-
|
|
62
86
|
bars_width = (@graph_height - calculate_spacing) / column_count.to_f
|
|
63
87
|
bar_width = bars_width / store.length
|
|
64
|
-
height = Array.new(column_count, 0)
|
|
65
|
-
length = Array.new(column_count, @graph_left)
|
|
66
88
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
|
67
89
|
|
|
90
|
+
# Setup the BarConversion Object
|
|
91
|
+
conversion = Gruff::BarConversion.new(
|
|
92
|
+
top: @graph_right, bottom: @graph_left,
|
|
93
|
+
minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
|
|
94
|
+
)
|
|
95
|
+
|
|
68
96
|
# if we're a side stacked bar then we don't need to draw ourself at all
|
|
69
97
|
# because sometimes (due to different heights/min/max) you can actually
|
|
70
98
|
# see both graphs and it looks like crap
|
|
@@ -74,40 +102,27 @@ private
|
|
|
74
102
|
data_row.points.each_with_index do |data_point, point_index|
|
|
75
103
|
group_spacing = @group_spacing * @scale * point_index
|
|
76
104
|
|
|
77
|
-
# Using the original calcs from the stacked bar chart
|
|
78
|
-
# to get the difference between
|
|
79
|
-
# part of the bart chart we wish to stack.
|
|
80
|
-
temp1 = @graph_left + (@graph_width - data_point * @graph_width - height[point_index])
|
|
81
|
-
temp2 = @graph_left + @graph_width - height[point_index]
|
|
82
|
-
difference = temp2 - temp1
|
|
83
|
-
|
|
84
|
-
left_x = length[point_index] - 1
|
|
85
105
|
left_y = @graph_top + (bars_width * point_index) + (bar_width * row_index) + padding + group_spacing
|
|
86
|
-
right_x = left_x + difference
|
|
87
106
|
right_y = left_y + bar_width * @bar_spacing
|
|
88
107
|
|
|
89
|
-
|
|
108
|
+
left_x, right_x = conversion.get_top_bottom_scaled(data_point).sort
|
|
90
109
|
|
|
91
110
|
rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
|
|
92
|
-
rect_renderer.render(left_x, left_y, right_x, right_y)
|
|
111
|
+
rect_renderer.render(left_x + AXIS_MARGIN, left_y, right_x + AXIS_MARGIN, right_y)
|
|
93
112
|
|
|
94
113
|
# Calculate center based on bar_width and current row
|
|
114
|
+
label_center = left_y + bars_width / 2
|
|
95
115
|
|
|
96
|
-
if
|
|
97
|
-
|
|
98
|
-
draw_label(label_center, row_index, store.norm_data[row_index].label)
|
|
99
|
-
else
|
|
100
|
-
label_center = left_y + bars_width / 2
|
|
101
|
-
draw_label(label_center, point_index)
|
|
102
|
-
end
|
|
116
|
+
# Subtract half a bar width to center left if requested
|
|
117
|
+
draw_label(label_center, point_index)
|
|
103
118
|
if @show_labels_for_bar_values
|
|
104
|
-
|
|
105
|
-
|
|
119
|
+
bar_value_label = Gruff::BarValueLabel::SideBar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
|
|
120
|
+
bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
|
121
|
+
draw_value_label(x, y, text, true)
|
|
122
|
+
end
|
|
106
123
|
end
|
|
107
124
|
end
|
|
108
125
|
end
|
|
109
|
-
|
|
110
|
-
Gruff::Renderer.finish
|
|
111
126
|
end
|
|
112
127
|
|
|
113
128
|
# Instead of base class version, draws vertical background lines and label
|
|
@@ -115,7 +130,7 @@ private
|
|
|
115
130
|
return if @hide_line_markers
|
|
116
131
|
|
|
117
132
|
# Draw horizontal line markers and annotate with numbers
|
|
118
|
-
number_of_lines =
|
|
133
|
+
number_of_lines = marker_count
|
|
119
134
|
number_of_lines = 1 if number_of_lines == 0
|
|
120
135
|
|
|
121
136
|
# TODO: Round maximum marker value to a round number like 100, 0.1, 0.5, etc.
|
|
@@ -123,13 +138,16 @@ private
|
|
|
123
138
|
(0..number_of_lines).each do |index|
|
|
124
139
|
line_diff = (@graph_right - @graph_left) / number_of_lines
|
|
125
140
|
x = @graph_right - (line_diff * index) - 1
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
141
|
+
|
|
142
|
+
line_renderer = Gruff::Renderer::Line.new(color: @marker_color, shadow_color: @marker_shadow_color)
|
|
143
|
+
line_renderer.render(x, @graph_bottom, x, @graph_top)
|
|
129
144
|
|
|
130
145
|
unless @hide_line_numbers
|
|
131
|
-
|
|
132
|
-
|
|
146
|
+
diff = index - number_of_lines
|
|
147
|
+
marker_label = BigDecimal(diff.abs.to_s) * BigDecimal(increment.to_s) + BigDecimal(minimum_value.to_s)
|
|
148
|
+
label = x_axis_label(marker_label, @increment)
|
|
149
|
+
text_renderer = Gruff::Renderer::Text.new(label, font: @font, size: @marker_font_size, color: @font_color)
|
|
150
|
+
text_renderer.add_to_render_queue(0, 0, x, @graph_bottom + LABEL_MARGIN, Magick::CenterGravity)
|
|
133
151
|
end
|
|
134
152
|
end
|
|
135
153
|
end
|
|
@@ -137,12 +155,9 @@ private
|
|
|
137
155
|
##
|
|
138
156
|
# Draw on the Y axis instead of the X
|
|
139
157
|
|
|
140
|
-
def draw_label(y_offset, index
|
|
158
|
+
def draw_label(y_offset, index)
|
|
141
159
|
draw_unique_label(index) do
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
text_renderer = Gruff::Renderer::Text.new(lbl, font: @font, size: @marker_font_size, color: @font_color)
|
|
145
|
-
text_renderer.render(@graph_left - LABEL_MARGIN * 2, 1.0, 0.0, y_offset, Magick::EastGravity)
|
|
160
|
+
draw_label_at(@graph_left - LABEL_MARGIN, 1.0, 0.0, y_offset, @labels[index], Magick::EastGravity)
|
|
146
161
|
end
|
|
147
162
|
end
|
|
148
163
|
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'gruff/side_bar'
|
|
4
|
-
require 'gruff/helper/stacked_mixin'
|
|
5
|
-
|
|
6
3
|
#
|
|
7
4
|
# New gruff graph type added to enable sideways stacking bar charts
|
|
8
5
|
# (basically looks like a x/y flip of a standard stacking bar chart)
|
|
@@ -24,26 +21,31 @@ require 'gruff/helper/stacked_mixin'
|
|
|
24
21
|
#
|
|
25
22
|
class Gruff::SideStackedBar < Gruff::SideBar
|
|
26
23
|
include StackedMixin
|
|
27
|
-
include BarValueLabelMixin
|
|
28
24
|
|
|
29
25
|
# Spacing factor applied between bars.
|
|
30
|
-
|
|
26
|
+
attr_writer :bar_spacing
|
|
31
27
|
|
|
32
28
|
# Number of pixels between bar segments.
|
|
33
|
-
|
|
29
|
+
attr_writer :segment_spacing
|
|
34
30
|
|
|
35
|
-
# Set the number output format
|
|
31
|
+
# Set the number output format string or lambda.
|
|
36
32
|
# Default is +"%.2f"+.
|
|
37
|
-
|
|
33
|
+
attr_writer :label_formatting
|
|
38
34
|
|
|
39
35
|
# Output the values for the bars on a bar graph.
|
|
40
36
|
# Default is +false+.
|
|
41
|
-
|
|
37
|
+
attr_writer :show_labels_for_bar_values
|
|
38
|
+
|
|
39
|
+
# Prevent drawing of column labels left of a side stacked bar graph. Default is +false+.
|
|
40
|
+
attr_writer :hide_labels
|
|
42
41
|
|
|
43
42
|
def initialize_ivars
|
|
44
43
|
super
|
|
44
|
+
@bar_spacing = 0.9
|
|
45
|
+
@segment_spacing = 2.0
|
|
45
46
|
@label_formatting = nil
|
|
46
47
|
@show_labels_for_bar_values = false
|
|
48
|
+
@hide_labels = false
|
|
47
49
|
end
|
|
48
50
|
private :initialize_ivars
|
|
49
51
|
|
|
@@ -53,24 +55,35 @@ class Gruff::SideStackedBar < Gruff::SideBar
|
|
|
53
55
|
super
|
|
54
56
|
end
|
|
55
57
|
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
def hide_labels?
|
|
61
|
+
@hide_labels
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def hide_left_label_area?
|
|
65
|
+
hide_labels?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def hide_bottom_label_area?
|
|
69
|
+
@hide_line_markers
|
|
70
|
+
end
|
|
71
|
+
|
|
56
72
|
private
|
|
57
73
|
|
|
58
74
|
def draw_bars
|
|
59
75
|
# Setup spacing.
|
|
60
76
|
#
|
|
61
77
|
# Columns sit stacked.
|
|
62
|
-
@bar_spacing ||= 0.9
|
|
63
|
-
@segment_spacing ||= 2.0
|
|
64
|
-
|
|
65
78
|
bar_width = @graph_height / column_count.to_f
|
|
66
79
|
height = Array.new(column_count, 0)
|
|
67
80
|
length = Array.new(column_count, @graph_left)
|
|
68
81
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
|
69
|
-
|
|
82
|
+
stack_bar_value_label = Gruff::BarValueLabel::StackedBar.new
|
|
70
83
|
|
|
71
84
|
store.norm_data.each_with_index do |data_row, row_index|
|
|
72
85
|
data_row.points.each_with_index do |data_point, point_index|
|
|
73
|
-
## using the original
|
|
86
|
+
## using the original calculations from the stacked bar chart to get the difference between
|
|
74
87
|
## part of the bart chart we wish to stack.
|
|
75
88
|
temp1 = @graph_left + (@graph_width -
|
|
76
89
|
data_point * @graph_width -
|
|
@@ -85,8 +98,8 @@ private
|
|
|
85
98
|
length[point_index] += difference
|
|
86
99
|
height[point_index] += (data_point * @graph_width - 2)
|
|
87
100
|
|
|
88
|
-
bar_value_label
|
|
89
|
-
bar_value_label
|
|
101
|
+
bar_value_label = Gruff::BarValueLabel::SideBar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
|
|
102
|
+
stack_bar_value_label.add(bar_value_label, point_index)
|
|
90
103
|
|
|
91
104
|
# if a data point is 0 it can result in weird really thing lines
|
|
92
105
|
# that shouldn't even be there being drawn on top of the existing
|
|
@@ -104,11 +117,9 @@ private
|
|
|
104
117
|
end
|
|
105
118
|
|
|
106
119
|
if @show_labels_for_bar_values
|
|
107
|
-
|
|
120
|
+
stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
|
108
121
|
draw_value_label(x, y, text, true)
|
|
109
122
|
end
|
|
110
123
|
end
|
|
111
|
-
|
|
112
|
-
Gruff::Renderer.finish
|
|
113
124
|
end
|
|
114
125
|
end
|
data/lib/gruff/spider.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'gruff/base'
|
|
4
|
-
|
|
5
3
|
# Experimental!!! See also the Net graph.
|
|
6
4
|
#
|
|
7
5
|
# Here's how to set up a Gruff::Spider.
|
|
@@ -15,13 +13,11 @@ require 'gruff/base'
|
|
|
15
13
|
# g.data :Wisdom, [10]
|
|
16
14
|
# g.data 'Charisma', [16]
|
|
17
15
|
# g.write("spider.png")
|
|
18
|
-
|
|
16
|
+
#
|
|
19
17
|
class Gruff::Spider < Gruff::Base
|
|
20
18
|
# Hide all text.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
attr_reader :transparent_background
|
|
24
|
-
attr_accessor :rotation
|
|
19
|
+
attr_writer :hide_axes
|
|
20
|
+
attr_writer :rotation
|
|
25
21
|
|
|
26
22
|
def transparent_background=(value)
|
|
27
23
|
Gruff::Renderer.setup_transparent_background(@columns, @rows) if value
|
|
@@ -34,9 +30,16 @@ class Gruff::Spider < Gruff::Base
|
|
|
34
30
|
def initialize(max_value, target_width = 800)
|
|
35
31
|
super(target_width)
|
|
36
32
|
@max_value = max_value
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def initialize_ivars
|
|
36
|
+
super
|
|
37
37
|
@hide_legend = true
|
|
38
|
+
@hide_axes = false
|
|
39
|
+
@hide_text = false
|
|
38
40
|
@rotation = 0
|
|
39
41
|
end
|
|
42
|
+
private :initialize_ivars
|
|
40
43
|
|
|
41
44
|
def draw
|
|
42
45
|
@hide_line_markers = true
|
|
@@ -55,12 +58,10 @@ class Gruff::Spider < Gruff::Base
|
|
|
55
58
|
additive_angle = (2 * Math::PI) / store.length
|
|
56
59
|
|
|
57
60
|
# Draw axes
|
|
58
|
-
draw_axes(center_x, center_y, radius, additive_angle) unless hide_axes
|
|
61
|
+
draw_axes(center_x, center_y, radius, additive_angle) unless @hide_axes
|
|
59
62
|
|
|
60
63
|
# Draw polygon
|
|
61
64
|
draw_polygon(center_x, center_y, additive_angle)
|
|
62
|
-
|
|
63
|
-
Gruff::Renderer.finish
|
|
64
65
|
end
|
|
65
66
|
|
|
66
67
|
private
|
|
@@ -77,14 +78,14 @@ private
|
|
|
77
78
|
y = y_offset + ((radius + r_offset) * Math.sin(angle))
|
|
78
79
|
|
|
79
80
|
# 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.
|
|
81
|
+
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: @legend_font_size, color: @marker_color, weight: Magick::BoldWeight)
|
|
82
|
+
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
|
82
83
|
end
|
|
83
84
|
|
|
84
85
|
def draw_axes(center_x, center_y, radius, additive_angle, line_color = nil)
|
|
85
|
-
return if hide_axes
|
|
86
|
+
return if @hide_axes
|
|
86
87
|
|
|
87
|
-
current_angle = rotation * Math::PI / 180.0
|
|
88
|
+
current_angle = @rotation * Math::PI / 180.0
|
|
88
89
|
|
|
89
90
|
store.data.each do |data_row|
|
|
90
91
|
x_offset = radius * Math.cos(current_angle)
|
|
@@ -93,7 +94,7 @@ private
|
|
|
93
94
|
Gruff::Renderer::Line.new(color: line_color || data_row.color, width: 5.0)
|
|
94
95
|
.render(center_x, center_y, center_x + x_offset, center_y + y_offset)
|
|
95
96
|
|
|
96
|
-
draw_label(center_x, center_y, current_angle, radius, data_row.label.to_s) unless hide_text
|
|
97
|
+
draw_label(center_x, center_y, current_angle, radius, data_row.label.to_s) unless @hide_text
|
|
97
98
|
|
|
98
99
|
current_angle += additive_angle
|
|
99
100
|
end
|
|
@@ -101,7 +102,7 @@ private
|
|
|
101
102
|
|
|
102
103
|
def draw_polygon(center_x, center_y, additive_angle, color = nil)
|
|
103
104
|
points = []
|
|
104
|
-
current_angle = rotation * Math::PI / 180.0
|
|
105
|
+
current_angle = @rotation * Math::PI / 180.0
|
|
105
106
|
|
|
106
107
|
store.data.each do |data_row|
|
|
107
108
|
points << center_x + normalize_points(data_row.points.first) * Math.cos(current_angle)
|
|
@@ -113,6 +114,6 @@ private
|
|
|
113
114
|
end
|
|
114
115
|
|
|
115
116
|
def sums_for_spider
|
|
116
|
-
store.data.
|
|
117
|
+
store.data.sum { |data_row| data_row.points.first }
|
|
117
118
|
end
|
|
118
119
|
end
|
data/lib/gruff/stacked_area.rb
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'gruff/base'
|
|
4
|
-
require 'gruff/helper/stacked_mixin'
|
|
5
|
-
|
|
6
3
|
#
|
|
7
4
|
# Here's how to set up a Gruff::StackedArea.
|
|
8
5
|
#
|
|
@@ -15,7 +12,13 @@ require 'gruff/helper/stacked_mixin'
|
|
|
15
12
|
#
|
|
16
13
|
class Gruff::StackedArea < Gruff::Base
|
|
17
14
|
include StackedMixin
|
|
18
|
-
|
|
15
|
+
attr_writer :last_series_goes_on_bottom
|
|
16
|
+
|
|
17
|
+
def initialize_ivars
|
|
18
|
+
super
|
|
19
|
+
@last_series_goes_on_bottom = false
|
|
20
|
+
end
|
|
21
|
+
private :initialize_ivars
|
|
19
22
|
|
|
20
23
|
def draw
|
|
21
24
|
calculate_maximum_by_stack
|
|
@@ -28,7 +31,7 @@ class Gruff::StackedArea < Gruff::Base
|
|
|
28
31
|
height = Array.new(column_count, 0)
|
|
29
32
|
|
|
30
33
|
data_points = nil
|
|
31
|
-
iterator = last_series_goes_on_bottom ? :reverse_each : :each
|
|
34
|
+
iterator = @last_series_goes_on_bottom ? :reverse_each : :each
|
|
32
35
|
store.norm_data.public_send(iterator) do |data_row|
|
|
33
36
|
prev_data_points = data_points
|
|
34
37
|
data_points = []
|
|
@@ -63,7 +66,5 @@ class Gruff::StackedArea < Gruff::Base
|
|
|
63
66
|
|
|
64
67
|
Gruff::Renderer::Polygon.new(color: data_row.color).render(poly_points)
|
|
65
68
|
end
|
|
66
|
-
|
|
67
|
-
Gruff::Renderer.finish
|
|
68
69
|
end
|
|
69
70
|
end
|
data/lib/gruff/stacked_bar.rb
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'gruff/base'
|
|
4
|
-
require 'gruff/helper/stacked_mixin'
|
|
5
|
-
require 'gruff/helper/bar_value_label_mixin'
|
|
6
|
-
|
|
7
3
|
#
|
|
8
4
|
# Here's how to set up a Gruff::StackedBar.
|
|
9
5
|
#
|
|
@@ -16,26 +12,31 @@ require 'gruff/helper/bar_value_label_mixin'
|
|
|
16
12
|
#
|
|
17
13
|
class Gruff::StackedBar < Gruff::Base
|
|
18
14
|
include StackedMixin
|
|
19
|
-
include BarValueLabelMixin
|
|
20
15
|
|
|
21
16
|
# Spacing factor applied between bars.
|
|
22
|
-
|
|
17
|
+
attr_writer :bar_spacing
|
|
23
18
|
|
|
24
19
|
# Number of pixels between bar segments.
|
|
25
|
-
|
|
20
|
+
attr_writer :segment_spacing
|
|
26
21
|
|
|
27
|
-
# Set the number output format
|
|
22
|
+
# Set the number output format string or lambda.
|
|
28
23
|
# Default is +"%.2f"+.
|
|
29
|
-
|
|
24
|
+
attr_writer :label_formatting
|
|
30
25
|
|
|
31
26
|
# Output the values for the bars on a bar graph.
|
|
32
27
|
# Default is +false+.
|
|
33
|
-
|
|
28
|
+
attr_writer :show_labels_for_bar_values
|
|
29
|
+
|
|
30
|
+
# Prevent drawing of column labels below a stacked bar graph. Default is +false+.
|
|
31
|
+
attr_writer :hide_labels
|
|
34
32
|
|
|
35
33
|
def initialize_ivars
|
|
36
34
|
super
|
|
35
|
+
@bar_spacing = 0.9
|
|
36
|
+
@segment_spacing = 2
|
|
37
37
|
@label_formatting = nil
|
|
38
38
|
@show_labels_for_bar_values = false
|
|
39
|
+
@hide_labels = false
|
|
39
40
|
end
|
|
40
41
|
private :initialize_ivars
|
|
41
42
|
|
|
@@ -48,14 +49,11 @@ class Gruff::StackedBar < Gruff::Base
|
|
|
48
49
|
# Setup spacing.
|
|
49
50
|
#
|
|
50
51
|
# Columns sit stacked.
|
|
51
|
-
@bar_spacing ||= 0.9
|
|
52
|
-
@segment_spacing ||= 2
|
|
53
|
-
|
|
54
52
|
bar_width = @graph_width / column_count.to_f
|
|
55
53
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
|
56
54
|
|
|
57
55
|
height = Array.new(column_count, 0)
|
|
58
|
-
|
|
56
|
+
stack_bar_value_label = Gruff::BarValueLabel::StackedBar.new
|
|
59
57
|
|
|
60
58
|
store.norm_data.each_with_index do |data_row, row_index|
|
|
61
59
|
data_row.points.each_with_index do |data_point, point_index|
|
|
@@ -79,17 +77,29 @@ class Gruff::StackedBar < Gruff::Base
|
|
|
79
77
|
label_center = left_x + bar_width * @bar_spacing / 2.0
|
|
80
78
|
draw_label(label_center, point_index)
|
|
81
79
|
|
|
82
|
-
bar_value_label
|
|
83
|
-
bar_value_label
|
|
80
|
+
bar_value_label = Gruff::BarValueLabel::Bar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
|
|
81
|
+
stack_bar_value_label.add(bar_value_label, point_index)
|
|
84
82
|
end
|
|
85
83
|
end
|
|
86
84
|
|
|
87
85
|
if @show_labels_for_bar_values
|
|
88
|
-
|
|
86
|
+
stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
|
89
87
|
draw_value_label(x, y, text, true)
|
|
90
88
|
end
|
|
91
89
|
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
protected
|
|
93
|
+
|
|
94
|
+
def hide_labels?
|
|
95
|
+
@hide_labels
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def hide_left_label_area?
|
|
99
|
+
@hide_line_markers
|
|
100
|
+
end
|
|
92
101
|
|
|
93
|
-
|
|
102
|
+
def hide_bottom_label_area?
|
|
103
|
+
hide_labels?
|
|
94
104
|
end
|
|
95
105
|
end
|