gruff 0.12.2 → 0.13.0
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 +3 -0
- data/.rubocop_todo.yml +9 -17
- data/CHANGELOG.md +12 -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 +3 -2
- data/lib/gruff.rb +1 -1
- data/lib/gruff/bar.rb +14 -27
- data/lib/gruff/base.rb +67 -21
- data/lib/gruff/dot.rb +3 -4
- data/lib/gruff/helper/bar_conversion.rb +27 -12
- data/lib/gruff/helper/bar_value_label.rb +68 -0
- data/lib/gruff/renderer/text.rb +10 -2
- data/lib/gruff/scatter.rb +14 -29
- data/lib/gruff/side_bar.rb +31 -34
- data/lib/gruff/side_stacked_bar.rb +5 -6
- data/lib/gruff/stacked_bar.rb +5 -6
- data/lib/gruff/version.rb +1 -1
- metadata +24 -7
- data/lib/gruff/helper/bar_value_label_mixin.rb +0 -33
data/lib/gruff/side_bar.rb
CHANGED
@@ -19,15 +19,13 @@
|
|
19
19
|
# g.write('sidebar.png')
|
20
20
|
#
|
21
21
|
class Gruff::SideBar < Gruff::Base
|
22
|
-
using String::GruffCommify
|
23
|
-
|
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
|
|
@@ -57,6 +55,12 @@ class Gruff::SideBar < Gruff::Base
|
|
57
55
|
draw_bars
|
58
56
|
end
|
59
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
|
+
|
60
64
|
protected
|
61
65
|
|
62
66
|
def hide_labels?
|
@@ -73,15 +77,22 @@ protected
|
|
73
77
|
|
74
78
|
private
|
75
79
|
|
80
|
+
# Value to avoid completely overwriting the coordinate axis
|
81
|
+
AXIS_MARGIN = 0.5
|
82
|
+
|
76
83
|
def draw_bars
|
77
84
|
# Setup spacing.
|
78
85
|
#
|
79
86
|
bars_width = (@graph_height - calculate_spacing) / column_count.to_f
|
80
87
|
bar_width = bars_width / store.length
|
81
|
-
height = Array.new(column_count, 0)
|
82
|
-
length = Array.new(column_count, @graph_left)
|
83
88
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
84
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
|
+
|
85
96
|
# if we're a side stacked bar then we don't need to draw ourself at all
|
86
97
|
# because sometimes (due to different heights/min/max) you can actually
|
87
98
|
# see both graphs and it looks like crap
|
@@ -91,35 +102,24 @@ private
|
|
91
102
|
data_row.points.each_with_index do |data_point, point_index|
|
92
103
|
group_spacing = @group_spacing * @scale * point_index
|
93
104
|
|
94
|
-
# Using the original calculations from the stacked bar chart
|
95
|
-
# to get the difference between
|
96
|
-
# part of the bart chart we wish to stack.
|
97
|
-
temp1 = @graph_left + (@graph_width - data_point * @graph_width - height[point_index])
|
98
|
-
temp2 = @graph_left + @graph_width - height[point_index]
|
99
|
-
difference = temp2 - temp1
|
100
|
-
|
101
|
-
left_x = length[point_index] - 1
|
102
105
|
left_y = @graph_top + (bars_width * point_index) + (bar_width * row_index) + padding + group_spacing
|
103
|
-
right_x = left_x + difference
|
104
106
|
right_y = left_y + bar_width * @bar_spacing
|
105
107
|
|
106
|
-
|
108
|
+
left_x, right_x = conversion.get_top_bottom_scaled(data_point).sort
|
107
109
|
|
108
110
|
rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
|
109
|
-
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)
|
110
112
|
|
111
113
|
# Calculate center based on bar_width and current row
|
114
|
+
label_center = left_y + bars_width / 2
|
112
115
|
|
113
|
-
if
|
114
|
-
|
115
|
-
draw_label(label_center, row_index, store.norm_data[row_index].label)
|
116
|
-
else
|
117
|
-
label_center = left_y + bars_width / 2
|
118
|
-
draw_label(label_center, point_index)
|
119
|
-
end
|
116
|
+
# Subtract half a bar width to center left if requested
|
117
|
+
draw_label(label_center, point_index)
|
120
118
|
if @show_labels_for_bar_values
|
121
|
-
|
122
|
-
|
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
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
@@ -142,11 +142,11 @@ private
|
|
142
142
|
line_renderer = Gruff::Renderer::Line.new(color: @marker_color, shadow_color: @marker_shadow_color)
|
143
143
|
line_renderer.render(x, @graph_bottom, x, @graph_top)
|
144
144
|
|
145
|
-
diff = index - number_of_lines
|
146
|
-
marker_label = diff.abs * increment + minimum_value
|
147
|
-
|
148
145
|
unless @hide_line_numbers
|
149
|
-
|
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
150
|
text_renderer.add_to_render_queue(0, 0, x, @graph_bottom + LABEL_MARGIN, Magick::CenterGravity)
|
151
151
|
end
|
152
152
|
end
|
@@ -155,12 +155,9 @@ private
|
|
155
155
|
##
|
156
156
|
# Draw on the Y axis instead of the X
|
157
157
|
|
158
|
-
def draw_label(y_offset, index
|
158
|
+
def draw_label(y_offset, index)
|
159
159
|
draw_unique_label(index) do
|
160
|
-
|
161
|
-
|
162
|
-
text_renderer = Gruff::Renderer::Text.new(lbl, font: @font, size: @marker_font_size, color: @font_color)
|
163
|
-
text_renderer.add_to_render_queue(@graph_left - LABEL_MARGIN, 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)
|
164
161
|
end
|
165
162
|
end
|
166
163
|
|
@@ -21,7 +21,6 @@
|
|
21
21
|
#
|
22
22
|
class Gruff::SideStackedBar < Gruff::SideBar
|
23
23
|
include StackedMixin
|
24
|
-
include BarValueLabelMixin
|
25
24
|
|
26
25
|
# Spacing factor applied between bars.
|
27
26
|
attr_writer :bar_spacing
|
@@ -29,7 +28,7 @@ class Gruff::SideStackedBar < Gruff::SideBar
|
|
29
28
|
# Number of pixels between bar segments.
|
30
29
|
attr_writer :segment_spacing
|
31
30
|
|
32
|
-
# Set the number output format
|
31
|
+
# Set the number output format string or lambda.
|
33
32
|
# Default is +"%.2f"+.
|
34
33
|
attr_writer :label_formatting
|
35
34
|
|
@@ -80,7 +79,7 @@ private
|
|
80
79
|
height = Array.new(column_count, 0)
|
81
80
|
length = Array.new(column_count, @graph_left)
|
82
81
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
83
|
-
|
82
|
+
stack_bar_value_label = Gruff::BarValueLabel::StackedBar.new
|
84
83
|
|
85
84
|
store.norm_data.each_with_index do |data_row, row_index|
|
86
85
|
data_row.points.each_with_index do |data_point, point_index|
|
@@ -99,8 +98,8 @@ private
|
|
99
98
|
length[point_index] += difference
|
100
99
|
height[point_index] += (data_point * @graph_width - 2)
|
101
100
|
|
102
|
-
bar_value_label
|
103
|
-
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)
|
104
103
|
|
105
104
|
# if a data point is 0 it can result in weird really thing lines
|
106
105
|
# that shouldn't even be there being drawn on top of the existing
|
@@ -118,7 +117,7 @@ private
|
|
118
117
|
end
|
119
118
|
|
120
119
|
if @show_labels_for_bar_values
|
121
|
-
|
120
|
+
stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
122
121
|
draw_value_label(x, y, text, true)
|
123
122
|
end
|
124
123
|
end
|
data/lib/gruff/stacked_bar.rb
CHANGED
@@ -12,7 +12,6 @@
|
|
12
12
|
#
|
13
13
|
class Gruff::StackedBar < Gruff::Base
|
14
14
|
include StackedMixin
|
15
|
-
include BarValueLabelMixin
|
16
15
|
|
17
16
|
# Spacing factor applied between bars.
|
18
17
|
attr_writer :bar_spacing
|
@@ -20,7 +19,7 @@ class Gruff::StackedBar < Gruff::Base
|
|
20
19
|
# Number of pixels between bar segments.
|
21
20
|
attr_writer :segment_spacing
|
22
21
|
|
23
|
-
# Set the number output format
|
22
|
+
# Set the number output format string or lambda.
|
24
23
|
# Default is +"%.2f"+.
|
25
24
|
attr_writer :label_formatting
|
26
25
|
|
@@ -54,7 +53,7 @@ class Gruff::StackedBar < Gruff::Base
|
|
54
53
|
padding = (bar_width * (1 - @bar_spacing)) / 2
|
55
54
|
|
56
55
|
height = Array.new(column_count, 0)
|
57
|
-
|
56
|
+
stack_bar_value_label = Gruff::BarValueLabel::StackedBar.new
|
58
57
|
|
59
58
|
store.norm_data.each_with_index do |data_row, row_index|
|
60
59
|
data_row.points.each_with_index do |data_point, point_index|
|
@@ -78,13 +77,13 @@ class Gruff::StackedBar < Gruff::Base
|
|
78
77
|
label_center = left_x + bar_width * @bar_spacing / 2.0
|
79
78
|
draw_label(label_center, point_index)
|
80
79
|
|
81
|
-
bar_value_label
|
82
|
-
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)
|
83
82
|
end
|
84
83
|
end
|
85
84
|
|
86
85
|
if @show_labels_for_bar_values
|
87
|
-
|
86
|
+
stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
88
87
|
draw_value_label(x, y, text, true)
|
89
88
|
end
|
90
89
|
end
|
data/lib/gruff/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gruff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geoffrey Grosenbach
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-05-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rmagick
|
@@ -31,28 +31,28 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 1.
|
34
|
+
version: 1.12.1
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 1.
|
41
|
+
version: 1.12.1
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rubocop-performance
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: 1.10.
|
48
|
+
version: 1.10.2
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: 1.10.
|
55
|
+
version: 1.10.2
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: histogram
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,6 +109,20 @@ dependencies:
|
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: simplecov
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
112
126
|
- !ruby/object:Gem::Dependency
|
113
127
|
name: yard
|
114
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,6 +155,9 @@ files:
|
|
141
155
|
- Gemfile
|
142
156
|
- MIT-LICENSE
|
143
157
|
- README.md
|
158
|
+
- assets/fonts/LICENSE.txt
|
159
|
+
- assets/fonts/Roboto-Bold.ttf
|
160
|
+
- assets/fonts/Roboto-Regular.ttf
|
144
161
|
- assets/plastik/blue.png
|
145
162
|
- assets/plastik/green.png
|
146
163
|
- assets/plastik/red.png
|
@@ -155,7 +172,7 @@ files:
|
|
155
172
|
- lib/gruff/bullet.rb
|
156
173
|
- lib/gruff/dot.rb
|
157
174
|
- lib/gruff/helper/bar_conversion.rb
|
158
|
-
- lib/gruff/helper/
|
175
|
+
- lib/gruff/helper/bar_value_label.rb
|
159
176
|
- lib/gruff/helper/stacked_mixin.rb
|
160
177
|
- lib/gruff/histogram.rb
|
161
178
|
- lib/gruff/line.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# @private
|
4
|
-
module Gruff::Base::BarValueLabelMixin
|
5
|
-
using String::GruffCommify
|
6
|
-
|
7
|
-
# @private
|
8
|
-
class BarValueLabel
|
9
|
-
attr_accessor :coordinates, :values
|
10
|
-
|
11
|
-
def initialize(size, bar_width)
|
12
|
-
@coordinates = Array.new(size)
|
13
|
-
@values = Hash.new(0)
|
14
|
-
@bar_width = bar_width
|
15
|
-
end
|
16
|
-
|
17
|
-
def prepare_rendering(format)
|
18
|
-
@coordinates.each_with_index do |(left_x, left_y, right_x, _right_y), index|
|
19
|
-
value = @values[index]
|
20
|
-
val = (format || '%.2f') % value
|
21
|
-
y = value >= 0 ? left_y - 30 : left_y + 12
|
22
|
-
yield left_x + (right_x - left_x) / 2, y, val.commify
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def prepare_sidebar_rendering(format)
|
27
|
-
@coordinates.each_with_index do |(_left_x, _left_y, right_x, right_y), index|
|
28
|
-
val = (format || '%.2f') % @values[index]
|
29
|
-
yield right_x + 40, right_y - @bar_width / 2, val.commify
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|