gruff 0.25.0 → 0.27.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/.editorconfig +2 -2
- data/.github/ISSUE_TEMPLATE/report.yml +41 -0
- data/.github/workflows/ci.yml +62 -9
- data/.rubocop.yml +5 -1
- data/CHANGELOG.md +22 -1
- data/Gemfile +8 -3
- data/README.md +9 -3
- data/gruff.gemspec +1 -1
- data/lib/gruff/accumulator_bar.rb +3 -1
- data/lib/gruff/area.rb +5 -2
- data/lib/gruff/bar.rb +18 -9
- data/lib/gruff/base.rb +205 -71
- data/lib/gruff/bezier.rb +6 -3
- data/lib/gruff/box.rb +40 -16
- data/lib/gruff/bubble.rb +9 -2
- data/lib/gruff/bullet.rb +8 -1
- data/lib/gruff/candlestick.rb +30 -8
- data/lib/gruff/dot.rb +13 -3
- data/lib/gruff/font.rb +12 -4
- data/lib/gruff/helper/bar_conversion.rb +12 -1
- data/lib/gruff/helper/bar_mixin.rb +19 -1
- data/lib/gruff/helper/bar_value_label.rb +22 -4
- data/lib/gruff/helper/stacked_mixin.rb +21 -1
- data/lib/gruff/histogram.rb +14 -5
- data/lib/gruff/line.rb +31 -12
- data/lib/gruff/mini/bar.rb +2 -2
- data/lib/gruff/mini/legend.rb +10 -1
- data/lib/gruff/mini/pie.rb +2 -2
- data/lib/gruff/mini/side_bar.rb +2 -2
- data/lib/gruff/net.rb +12 -7
- data/lib/gruff/patch/rmagick.rb +2 -0
- data/lib/gruff/patch/string.rb +1 -1
- data/lib/gruff/pie.rb +46 -11
- data/lib/gruff/renderer/bezier.rb +7 -0
- data/lib/gruff/renderer/circle.rb +11 -0
- data/lib/gruff/renderer/dash_line.rb +11 -0
- data/lib/gruff/renderer/dot.rb +11 -0
- data/lib/gruff/renderer/ellipse.rb +12 -0
- data/lib/gruff/renderer/line.rb +10 -0
- data/lib/gruff/renderer/polygon.rb +6 -0
- data/lib/gruff/renderer/polyline.rb +8 -0
- data/lib/gruff/renderer/rectangle.rb +11 -0
- data/lib/gruff/renderer/renderer.rb +16 -5
- data/lib/gruff/renderer/text.rb +19 -2
- data/lib/gruff/scatter.rb +16 -8
- data/lib/gruff/side_bar.rb +19 -10
- data/lib/gruff/side_stacked_bar.rb +15 -11
- data/lib/gruff/spider.rb +9 -2
- data/lib/gruff/stacked_area.rb +6 -1
- data/lib/gruff/stacked_bar.rb +16 -10
- data/lib/gruff/store/basic_data.rb +36 -2
- data/lib/gruff/store/store.rb +16 -3
- data/lib/gruff/store/xy_data.rb +32 -2
- data/lib/gruff/store/xy_pointsizes_data.rb +36 -3
- data/lib/gruff/themes.rb +2 -0
- data/lib/gruff/version.rb +3 -1
- data/lib/gruff.rb +3 -1
- data/sig/generated/gruff/accumulator_bar.rbs +19 -0
- data/sig/generated/gruff/area.rbs +27 -0
- data/sig/generated/gruff/bar.rbs +74 -0
- data/sig/generated/gruff/base.rbs +672 -0
- data/sig/generated/gruff/bezier.rbs +24 -0
- data/sig/generated/gruff/box.rbs +88 -0
- data/sig/generated/gruff/bubble.rbs +69 -0
- data/sig/generated/gruff/bullet.rbs +30 -0
- data/sig/generated/gruff/candlestick.rbs +79 -0
- data/sig/generated/gruff/dot.rbs +44 -0
- data/sig/generated/gruff/font.rbs +35 -0
- data/sig/generated/gruff/helper/bar_conversion.rbs +27 -0
- data/sig/generated/gruff/helper/bar_mixin.rbs +22 -0
- data/sig/generated/gruff/helper/bar_value_label.rbs +41 -0
- data/sig/generated/gruff/helper/stacked_mixin.rbs +27 -0
- data/sig/generated/gruff/histogram.rbs +42 -0
- data/sig/generated/gruff/line.rbs +165 -0
- data/sig/generated/gruff/net.rbs +52 -0
- data/sig/generated/gruff/pie.rbs +131 -0
- data/sig/generated/gruff/renderer/bezier.rbs +15 -0
- data/sig/generated/gruff/renderer/circle.rbs +19 -0
- data/sig/generated/gruff/renderer/dash_line.rbs +19 -0
- data/sig/generated/gruff/renderer/dot.rbs +27 -0
- data/sig/generated/gruff/renderer/ellipse.rbs +20 -0
- data/sig/generated/gruff/renderer/line.rbs +24 -0
- data/sig/generated/gruff/renderer/polyline.rbs +16 -0
- data/sig/generated/gruff/renderer/rectangle.rbs +19 -0
- data/sig/generated/gruff/renderer/renderer.rbs +43 -0
- data/sig/generated/gruff/renderer/text.rbs +38 -0
- data/sig/generated/gruff/scatter.rbs +112 -0
- data/sig/generated/gruff/side_bar.rbs +78 -0
- data/sig/generated/gruff/side_stacked_bar.rbs +52 -0
- data/sig/generated/gruff/spider.rbs +50 -0
- data/sig/generated/gruff/stacked_area.rbs +25 -0
- data/sig/generated/gruff/stacked_bar.rbs +56 -0
- data/sig/generated/gruff/store/basic_data.rbs +48 -0
- data/sig/generated/gruff/store/store.rbs +53 -0
- data/sig/generated/gruff/store/xy_data.rbs +58 -0
- data/sig/generated/gruff/store/xy_pointsizes_data.rbs +61 -0
- data/sig/generated/gruff/themes.rbs +24 -0
- data/sig/generated/gruff/version.rbs +5 -0
- data/sig/generated/gruff.rbs +20 -0
- metadata +46 -6
data/lib/gruff/histogram.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
require 'histogram'
|
4
6
|
|
5
7
|
#
|
@@ -15,19 +17,24 @@ require 'histogram'
|
|
15
17
|
#
|
16
18
|
class Gruff::Histogram < Gruff::Bar
|
17
19
|
# Specifies interpolation between the min and max of the set. Default is +10+.
|
18
|
-
attr_writer :bin_width
|
20
|
+
attr_writer :bin_width #: Float | Integer
|
19
21
|
|
20
22
|
# Specifies minimum value for bin.
|
21
|
-
attr_writer :minimum_bin
|
23
|
+
attr_writer :minimum_bin #: Float | Integer
|
22
24
|
|
23
25
|
# Specifies maximum value for bin.
|
24
|
-
attr_writer :maximum_bin
|
26
|
+
attr_writer :maximum_bin #: Float | Integer
|
25
27
|
|
26
|
-
|
28
|
+
# @rbs target_width: (String | Float | Integer)
|
29
|
+
# @rbs return: void
|
30
|
+
def initialize(target_width = DEFAULT_TARGET_WIDTH)
|
27
31
|
super
|
28
32
|
@data = []
|
29
33
|
end
|
30
34
|
|
35
|
+
# @rbs name: String | Symbol
|
36
|
+
# @rbs data_points: Array[Float | Integer] | nil
|
37
|
+
# @rbs color: String
|
31
38
|
def data(name, data_points = [], color = nil)
|
32
39
|
@data << [name, Array(data_points), color]
|
33
40
|
end
|
@@ -46,7 +53,7 @@ private
|
|
46
53
|
if data_points.empty?
|
47
54
|
store.add(name, [], color)
|
48
55
|
else
|
49
|
-
bins, freqs = HistogramArray.new(data_points).histogram(bin_width: @bin_width, min: @minimum_bin, max: @maximum_bin)
|
56
|
+
bins, freqs = HistogramArray.new(data_points.compact).histogram(bin_width: @bin_width, min: @minimum_bin, max: @maximum_bin) # steep:ignore
|
50
57
|
bins.each_with_index do |bin, index|
|
51
58
|
@labels[index] = bin
|
52
59
|
end
|
@@ -58,7 +65,9 @@ private
|
|
58
65
|
end
|
59
66
|
|
60
67
|
# @private
|
68
|
+
# @rbs inherits Array[Float | Integer | nil]
|
61
69
|
class HistogramArray < Array
|
70
|
+
# @rbs skip
|
62
71
|
include ::Histogram
|
63
72
|
end
|
64
73
|
end
|
data/lib/gruff/line.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
#
|
4
6
|
# Here's how to make a Gruff::Line.
|
5
7
|
#
|
@@ -14,31 +16,32 @@
|
|
14
16
|
#
|
15
17
|
class Gruff::Line < Gruff::Base
|
16
18
|
# Allow for reference lines ( which are like baseline ... just allowing for more & on both axes ).
|
17
|
-
attr_accessor :reference_lines
|
18
|
-
attr_writer :reference_line_default_color
|
19
|
-
attr_writer :reference_line_default_width
|
19
|
+
attr_accessor :reference_lines #: Hash[Symbol, untyped]
|
20
|
+
attr_writer :reference_line_default_color #: String
|
21
|
+
attr_writer :reference_line_default_width #: Float | Integer
|
20
22
|
|
21
23
|
# Allow for vertical marker lines.
|
22
|
-
attr_writer :show_vertical_markers
|
24
|
+
attr_writer :show_vertical_markers #: bool
|
23
25
|
|
24
26
|
# Dimensions of lines and dots; calculated based on dataset size if left unspecified.
|
25
|
-
attr_writer :line_width
|
26
|
-
attr_writer :dot_radius
|
27
|
+
attr_writer :line_width #: Float | Integer
|
28
|
+
attr_writer :dot_radius #: Float | Integer
|
27
29
|
|
28
30
|
# default is +'circle'+, other options include +square+ and +diamond+.
|
29
|
-
attr_writer :dot_style
|
31
|
+
attr_writer :dot_style #: :square | :circle | :diamond | 'square' | 'circle' | 'diamond'
|
30
32
|
|
31
33
|
# Hide parts of the graph to fit more data points, or for a different appearance.
|
32
|
-
attr_writer :hide_dots
|
34
|
+
attr_writer :hide_dots #: bool
|
35
|
+
attr_writer :hide_lines #: bool
|
33
36
|
|
34
37
|
# accessors for support of xy data.
|
35
|
-
attr_writer :minimum_x_value
|
38
|
+
attr_writer :minimum_x_value #: Float
|
36
39
|
|
37
40
|
# accessors for support of xy data.
|
38
|
-
attr_writer :maximum_x_value
|
41
|
+
attr_writer :maximum_x_value #: Float
|
39
42
|
|
40
43
|
# The number of vertical lines shown.
|
41
|
-
attr_writer :marker_x_count
|
44
|
+
attr_writer :marker_x_count #: Integer
|
42
45
|
|
43
46
|
# Call with target pixel width of graph (+800+, +400+, +300+), and/or +false+ to omit lines (points only).
|
44
47
|
#
|
@@ -47,6 +50,8 @@ class Gruff::Line < Gruff::Base
|
|
47
50
|
# g = Gruff::Line.new(false) # Defaults to 800px wide, no lines (for backwards compatibility)
|
48
51
|
#
|
49
52
|
# The preferred way is to call {#hide_dots=} or {#hide_lines=} instead.
|
53
|
+
#
|
54
|
+
# @rbs return: void
|
50
55
|
def initialize(*args)
|
51
56
|
raise ArgumentError, 'Wrong number of arguments' if args.length > 2
|
52
57
|
|
@@ -58,6 +63,8 @@ class Gruff::Line < Gruff::Base
|
|
58
63
|
end
|
59
64
|
|
60
65
|
# Get the value if somebody has defined it.
|
66
|
+
#
|
67
|
+
# @rbs return: Float | Integer | nil
|
61
68
|
def baseline_value
|
62
69
|
if @reference_lines.key?(:baseline)
|
63
70
|
@reference_lines[:baseline][:value]
|
@@ -65,17 +72,21 @@ class Gruff::Line < Gruff::Base
|
|
65
72
|
end
|
66
73
|
|
67
74
|
# Set a value for a baseline reference line..
|
75
|
+
#
|
76
|
+
# @rbs new_value: Float | Integer
|
68
77
|
def baseline_value=(new_value)
|
69
78
|
@reference_lines[:baseline] ||= {}
|
70
79
|
@reference_lines[:baseline][:value] = new_value
|
71
80
|
end
|
72
81
|
|
82
|
+
# @rbs return: Float | Integer | nil
|
73
83
|
def baseline_color
|
74
84
|
if @reference_lines.key?(:baseline)
|
75
85
|
@reference_lines[:baseline][:color]
|
76
86
|
end
|
77
87
|
end
|
78
88
|
|
89
|
+
# @rbs new_value: Float | Integer
|
79
90
|
def baseline_color=(new_value)
|
80
91
|
@reference_lines[:baseline] ||= {}
|
81
92
|
@reference_lines[:baseline][:color] = new_value
|
@@ -93,8 +104,11 @@ class Gruff::Line < Gruff::Base
|
|
93
104
|
# be used.
|
94
105
|
#
|
95
106
|
# @param name [String, Symbol] The name of the dataset.
|
107
|
+
# @rbs name: String | Symbol
|
96
108
|
# @param data_points [Array] The array of dataset.
|
109
|
+
# @rbs data_points: Array[nil | Float | Integer] | nil
|
97
110
|
# @param color [String] The color for drawing graph of dataset.
|
111
|
+
# @rbs color: String
|
98
112
|
#
|
99
113
|
# @note
|
100
114
|
# If you want to use a preset theme, you must set it before calling {#data}.
|
@@ -139,6 +153,11 @@ class Gruff::Line < Gruff::Base
|
|
139
153
|
# In this example the labels are drawn at x positions 2, 4, and 6:
|
140
154
|
# g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006'}
|
141
155
|
# # The 0 => '2003' label will be ignored since it is outside the chart range.
|
156
|
+
#
|
157
|
+
# @rbs name: String | Symbol
|
158
|
+
# @rbs x_data_points: Array[nil | Float | Integer] | Array[[nil | Float | Integer, nil | Float | Integer]] | nil
|
159
|
+
# @rbs y_data_points: Array[nil | Float | Integer] | nil | String
|
160
|
+
# @rbs color: String
|
142
161
|
def dataxy(name, x_data_points = [], y_data_points = [], color = nil)
|
143
162
|
# make sure it's an array
|
144
163
|
x_data_points = Array(x_data_points)
|
@@ -152,7 +171,7 @@ class Gruff::Line < Gruff::Base
|
|
152
171
|
y_data_points = Array(y_data_points)
|
153
172
|
end
|
154
173
|
|
155
|
-
raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length
|
174
|
+
raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length # steep:ignore
|
156
175
|
|
157
176
|
# call the existing data routine for the x/y data.
|
158
177
|
store.add(name, x_data_points, y_data_points, color)
|
data/lib/gruff/mini/bar.rb
CHANGED
@@ -31,12 +31,12 @@ private
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def setup_data
|
34
|
-
expand_canvas_for_vertical_legend
|
34
|
+
expand_canvas_for_vertical_legend # steep:ignore
|
35
35
|
super
|
36
36
|
end
|
37
37
|
|
38
38
|
def draw_graph
|
39
39
|
super
|
40
|
-
draw_vertical_legend
|
40
|
+
draw_vertical_legend # steep:ignore
|
41
41
|
end
|
42
42
|
end
|
data/lib/gruff/mini/legend.rb
CHANGED
@@ -13,6 +13,8 @@ module Gruff::Mini::Legend
|
|
13
13
|
|
14
14
|
# The canvas needs to be bigger so we can put the legend beneath it.
|
15
15
|
def expand_canvas_for_vertical_legend
|
16
|
+
# steep:ignore:start
|
17
|
+
|
16
18
|
return if @hide_mini_legend
|
17
19
|
|
18
20
|
@legend_labels = store.data.map(&:label)
|
@@ -33,19 +35,23 @@ module Gruff::Mini::Legend
|
|
33
35
|
end
|
34
36
|
|
35
37
|
@renderer = Gruff::Renderer.new(@columns, @rows, @scale, @theme_options)
|
38
|
+
# steep:ignore:end
|
36
39
|
end
|
37
40
|
|
38
41
|
def calculate_line_height
|
39
|
-
calculate_caps_height(@legend_font) * 1.7
|
42
|
+
calculate_caps_height(@legend_font) * 1.7 # steep:ignore
|
40
43
|
end
|
41
44
|
|
42
45
|
def calculate_legend_width
|
46
|
+
# steep:ignore:start
|
43
47
|
width = @legend_labels.map { |label| calculate_width(@legend_font, label) }.max
|
44
48
|
scale(width + (40 * 1.7))
|
49
|
+
# steep:ignore:end
|
45
50
|
end
|
46
51
|
|
47
52
|
# Draw the legend beneath the existing graph.
|
48
53
|
def draw_vertical_legend
|
54
|
+
# steep:ignore:start
|
49
55
|
return if @hide_mini_legend
|
50
56
|
|
51
57
|
legend_square_width = 40.0 # small square with color of this item
|
@@ -77,10 +83,12 @@ module Gruff::Mini::Legend
|
|
77
83
|
|
78
84
|
current_y_offset += calculate_line_height
|
79
85
|
end
|
86
|
+
# steep:ignore:end
|
80
87
|
end
|
81
88
|
|
82
89
|
# Shorten long labels so they will fit on the canvas.
|
83
90
|
def truncate_legend_label(label, x_offset)
|
91
|
+
# steep:ignore:start
|
84
92
|
truncated_label = label.to_s
|
85
93
|
|
86
94
|
font = @legend_font.dup
|
@@ -90,6 +98,7 @@ module Gruff::Mini::Legend
|
|
90
98
|
truncated_label = truncated_label[0..truncated_label.length - 2]
|
91
99
|
end
|
92
100
|
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
101
|
+
# steep:ignore:end
|
93
102
|
end
|
94
103
|
|
95
104
|
def scale(value)
|
data/lib/gruff/mini/pie.rb
CHANGED
@@ -28,12 +28,12 @@ private
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def setup_data
|
31
|
-
expand_canvas_for_vertical_legend
|
31
|
+
expand_canvas_for_vertical_legend # steep:ignore
|
32
32
|
super
|
33
33
|
end
|
34
34
|
|
35
35
|
def draw_graph
|
36
36
|
super
|
37
|
-
draw_vertical_legend
|
37
|
+
draw_vertical_legend # steep:ignore
|
38
38
|
end
|
39
39
|
end
|
data/lib/gruff/mini/side_bar.rb
CHANGED
@@ -35,12 +35,12 @@ private
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def setup_data
|
38
|
-
expand_canvas_for_vertical_legend
|
38
|
+
expand_canvas_for_vertical_legend # steep:ignore
|
39
39
|
super
|
40
40
|
end
|
41
41
|
|
42
42
|
def draw_graph
|
43
43
|
super
|
44
|
-
draw_vertical_legend
|
44
|
+
draw_vertical_legend # steep:ignore
|
45
45
|
end
|
46
46
|
end
|
data/lib/gruff/net.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
# See also the Spider graph.
|
4
6
|
#
|
5
7
|
# Here's how to make a Gruff::Net.
|
@@ -24,11 +26,11 @@
|
|
24
26
|
#
|
25
27
|
class Gruff::Net < Gruff::Base
|
26
28
|
# Hide parts of the graph to fit more data points, or for a different appearance.
|
27
|
-
attr_writer :hide_dots
|
29
|
+
attr_writer :hide_dots #: bool
|
28
30
|
|
29
31
|
# Dimensions of lines and dots; calculated based on dataset size if left unspecified.
|
30
|
-
attr_writer :line_width
|
31
|
-
attr_writer :dot_radius
|
32
|
+
attr_writer :line_width #: Float | Integer
|
33
|
+
attr_writer :dot_radius #: Float | Integer
|
32
34
|
|
33
35
|
private
|
34
36
|
|
@@ -63,10 +65,8 @@ private
|
|
63
65
|
poly_points = []
|
64
66
|
|
65
67
|
data_row.points.each_with_index do |data_point, index|
|
66
|
-
next if data_point.nil?
|
67
|
-
|
68
68
|
rad_pos = index * Math::PI * 2 / column_count
|
69
|
-
point_distance = data_point * @radius
|
69
|
+
point_distance = data_point.to_f * @radius
|
70
70
|
start_x = @center_x + (Math.sin(rad_pos) * point_distance)
|
71
71
|
start_y = @center_y - (Math.cos(rad_pos) * point_distance)
|
72
72
|
if poly_points.empty?
|
@@ -77,7 +77,7 @@ private
|
|
77
77
|
next_index = index + 1 < data_row.points.length ? index + 1 : 0
|
78
78
|
|
79
79
|
next_rad_pos = next_index * Math::PI * 2 / column_count
|
80
|
-
next_point_distance = data_row.points[next_index] * @radius
|
80
|
+
next_point_distance = data_row.points[next_index].to_f * @radius
|
81
81
|
end_x = @center_x + (Math.sin(next_rad_pos) * next_point_distance)
|
82
82
|
end_y = @center_y - (Math.cos(next_rad_pos) * next_point_distance)
|
83
83
|
poly_points << end_x
|
@@ -109,6 +109,11 @@ private
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
+
# @rbs center_x: Float | Integer
|
113
|
+
# @rbs center_y: Float | Integer
|
114
|
+
# @rbs angle: Float | Integer
|
115
|
+
# @rbs radius: Float
|
116
|
+
# @rbs amount: String | Integer
|
112
117
|
def draw_label(center_x, center_y, angle, radius, amount)
|
113
118
|
x_offset = center_x # + 15 # The label points need to be tweaked slightly
|
114
119
|
y_offset = center_y # + 0 # This one doesn't though
|
data/lib/gruff/patch/rmagick.rb
CHANGED
@@ -10,10 +10,12 @@ module Magick
|
|
10
10
|
scaled_width = [(width * scale), 1].max
|
11
11
|
scaled_height = [(height * scale), 1].max
|
12
12
|
|
13
|
+
# steep:ignore:start
|
13
14
|
annotate(img,
|
14
15
|
scaled_width, scaled_height,
|
15
16
|
x * scale, y * scale,
|
16
17
|
text.gsub('%', '%%'))
|
18
|
+
# steep:ignore:end
|
17
19
|
end
|
18
20
|
|
19
21
|
if defined? JRUBY_VERSION
|
data/lib/gruff/patch/string.rb
CHANGED
@@ -8,7 +8,7 @@ module String::GruffCommify
|
|
8
8
|
refine String do
|
9
9
|
# Taken from http://codesnippets.joyent.com/posts/show/330
|
10
10
|
def commify(delimiter = THOUSAND_SEPARATOR)
|
11
|
-
gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
|
11
|
+
gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}") # steep:ignore
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
data/lib/gruff/pie.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
#
|
4
6
|
# Here's how to make a Gruff::Pie.
|
5
7
|
#
|
@@ -16,25 +18,25 @@ class Gruff::Pie < Gruff::Base
|
|
16
18
|
|
17
19
|
# Can be used to make the pie start cutting slices at the top (-90.0)
|
18
20
|
# or at another angle. Default is +-90.0+, which starts at 3 o'clock.
|
19
|
-
attr_writer :start_degree
|
21
|
+
attr_writer :start_degree #: Float | Integer
|
20
22
|
|
21
23
|
# Set the number output format lambda.
|
22
|
-
attr_writer :label_formatting
|
24
|
+
attr_writer :label_formatting #: Proc
|
23
25
|
|
24
26
|
# Do not show labels for slices that are less than this percent. Use 0 to always show all labels.
|
25
27
|
# Defaults to +0+.
|
26
|
-
attr_writer :hide_labels_less_than
|
28
|
+
attr_writer :hide_labels_less_than #: Float | Integer
|
27
29
|
|
28
30
|
# Affect the distance between the percentages and the pie chart.
|
29
31
|
# Defaults to +0.1+.
|
30
|
-
attr_writer :text_offset_percentage
|
32
|
+
attr_writer :text_offset_percentage #: Float | Integer
|
31
33
|
|
32
34
|
## Use values instead of percentages.
|
33
|
-
attr_writer :show_values_as_labels
|
35
|
+
attr_writer :show_values_as_labels #: bool
|
34
36
|
|
35
37
|
# Set to +true+ if you want the data sets sorted with largest avg values drawn
|
36
38
|
# first. Default is +true+.
|
37
|
-
attr_writer :sort
|
39
|
+
attr_writer :sort #: bool
|
38
40
|
|
39
41
|
# Can be used to make the pie start cutting slices at the top (-90.0)
|
40
42
|
# or at another angle. Default is +-90.0+, which starts at 3 o'clock.
|
@@ -90,53 +92,64 @@ private
|
|
90
92
|
|
91
93
|
# General Helper Methods
|
92
94
|
|
95
|
+
# @rbs degree: Float | Integer
|
93
96
|
def update_chart_degrees_with(degrees)
|
94
97
|
@chart_degrees = chart_degrees + degrees
|
95
98
|
end
|
96
99
|
|
97
100
|
# Spatial Value-Related Methods
|
98
101
|
|
102
|
+
# @rbs return: Float | Integer
|
99
103
|
def chart_degrees
|
100
104
|
@chart_degrees ||= @start_degree
|
101
105
|
end
|
102
106
|
|
103
|
-
attr_reader :graph_height
|
104
|
-
attr_reader :graph_width
|
107
|
+
attr_reader :graph_height #: Float | Integer
|
108
|
+
attr_reader :graph_width #: Float | Integer
|
105
109
|
|
110
|
+
# @rbs return: Float | Integer
|
106
111
|
def half_width
|
107
112
|
graph_width / 2.0
|
108
113
|
end
|
109
114
|
|
115
|
+
# @rbs return: Float | Integer
|
110
116
|
def half_height
|
111
117
|
graph_height / 2.0
|
112
118
|
end
|
113
119
|
|
120
|
+
# @rbs return: Float | Integer
|
114
121
|
def radius
|
115
122
|
@radius ||= ([graph_width, graph_height].min / 2.0) * 0.8
|
116
123
|
end
|
117
124
|
|
125
|
+
# @rbs return: Float | Integer
|
118
126
|
def center_x
|
119
127
|
@center_x ||= @graph_left + half_width
|
120
128
|
end
|
121
129
|
|
130
|
+
# @rbs return: Float | Integer
|
122
131
|
def center_y
|
123
132
|
@center_y ||= @graph_top + half_height - 10
|
124
133
|
end
|
125
134
|
|
135
|
+
# @rbs return: Float | Integer
|
126
136
|
def distance_from_center
|
127
137
|
20.0
|
128
138
|
end
|
129
139
|
|
140
|
+
# @rbs return: Float | Integer | BigDecimal
|
130
141
|
def radius_offset
|
131
142
|
radius + (radius * @text_offset_percentage) + distance_from_center
|
132
143
|
end
|
133
144
|
|
145
|
+
# @rbs return: Float | Integer
|
134
146
|
def ellipse_factor
|
135
147
|
radius_offset * @text_offset_percentage
|
136
148
|
end
|
137
149
|
|
138
150
|
# Label-Related Methods
|
139
151
|
|
152
|
+
# @rbs slice: Gruff::Pie::PieSlice
|
140
153
|
def process_label_for(slice)
|
141
154
|
if slice.percentage >= @hide_labels_less_than
|
142
155
|
x, y = label_coordinates_for slice
|
@@ -145,16 +158,22 @@ private
|
|
145
158
|
end
|
146
159
|
end
|
147
160
|
|
161
|
+
# @rbs slice: Gruff::Pie::PieSlice
|
162
|
+
# @rbs return: [Float | Integer, Float | Integer]
|
148
163
|
def label_coordinates_for(slice)
|
149
164
|
angle = chart_degrees + (slice.degrees / 2.0)
|
150
165
|
|
151
166
|
[x_label_coordinate(angle), y_label_coordinate(angle)]
|
152
167
|
end
|
153
168
|
|
169
|
+
# @rbs angle: Float | Integer
|
170
|
+
# @rbs return: Float
|
154
171
|
def x_label_coordinate(angle)
|
155
|
-
center_x + ((radius_offset + ellipse_factor) * Math.cos(deg2rad(angle)))
|
172
|
+
center_x + ((radius_offset + ellipse_factor) * Math.cos(deg2rad(angle))) #: Float
|
156
173
|
end
|
157
174
|
|
175
|
+
# @rbs angle: Float | Integer
|
176
|
+
# @rbs return: Float
|
158
177
|
def y_label_coordinate(angle)
|
159
178
|
center_y + (radius_offset * Math.sin(deg2rad(angle)))
|
160
179
|
end
|
@@ -162,19 +181,35 @@ private
|
|
162
181
|
# Helper Classes
|
163
182
|
#
|
164
183
|
# @private
|
165
|
-
class PieSlice
|
166
|
-
attr_accessor :
|
184
|
+
class PieSlice
|
185
|
+
attr_accessor :label #: String | Symbol
|
186
|
+
attr_accessor :value #: Float | Integer
|
187
|
+
attr_accessor :color #: String
|
188
|
+
attr_accessor :total #: Float | Integer
|
189
|
+
|
190
|
+
# @rbs label: String | Symbol
|
191
|
+
# @rbs value: nil | Float | Integer
|
192
|
+
# @rbs color: String
|
193
|
+
# @rbs return: void
|
194
|
+
def initialize(label, value, color)
|
195
|
+
@label = label
|
196
|
+
@value = value || 0.0
|
197
|
+
@color = color
|
198
|
+
end
|
167
199
|
|
200
|
+
# @rbs return: Float | Integer
|
168
201
|
def percentage
|
169
202
|
(size * 100.0).round
|
170
203
|
end
|
171
204
|
|
205
|
+
# @rbs return: Float
|
172
206
|
def degrees
|
173
207
|
size * 360.0
|
174
208
|
end
|
175
209
|
|
176
210
|
private
|
177
211
|
|
212
|
+
# @rbs return: Float | Integer
|
178
213
|
def size
|
179
214
|
value / total
|
180
215
|
end
|
@@ -1,14 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Renderer::Bezier
|
8
|
+
# @rbs renderer: Gruff::Renderer
|
9
|
+
# @rbs color: String
|
10
|
+
# @rbs width: Float | Integer
|
11
|
+
# @rbs return: void
|
6
12
|
def initialize(renderer, color:, width: 1.0)
|
7
13
|
@renderer = renderer
|
8
14
|
@color = color
|
9
15
|
@width = width
|
10
16
|
end
|
11
17
|
|
18
|
+
# @rbs points: Array[Float | Integer]
|
12
19
|
def render(points)
|
13
20
|
@renderer.draw.push
|
14
21
|
@renderer.draw.stroke_width(@width)
|
@@ -1,8 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Renderer::Circle
|
8
|
+
# @rbs renderer: Gruff::Renderer
|
9
|
+
# @rbs color: String
|
10
|
+
# @rbs width: Float | Integer
|
11
|
+
# @rbs opacity: Float | Integer
|
12
|
+
# @rbs return: void
|
6
13
|
def initialize(renderer, color:, width: 1.0, opacity: 1.0)
|
7
14
|
@renderer = renderer
|
8
15
|
@color = color
|
@@ -10,6 +17,10 @@ module Gruff
|
|
10
17
|
@opacity = opacity
|
11
18
|
end
|
12
19
|
|
20
|
+
# @rbs origin_x: Float | Integer
|
21
|
+
# @rbs origin_y: Float | Integer
|
22
|
+
# @rbs perim_x: Float | Integer
|
23
|
+
# @rbs perim_y: Float | Integer
|
13
24
|
def render(origin_x, origin_y, perim_x, perim_y)
|
14
25
|
@renderer.draw.push
|
15
26
|
@renderer.draw.stroke_width(@width)
|
@@ -1,8 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Renderer::DashLine
|
8
|
+
# @rbs renderer: Gruff::Renderer
|
9
|
+
# @rbs color: String
|
10
|
+
# @rbs width: Float | Integer
|
11
|
+
# @rbs dasharray: Array[Float | Integer]
|
12
|
+
# @rbs return: void
|
6
13
|
def initialize(renderer, color:, width:, dasharray: [10, 20])
|
7
14
|
@renderer = renderer
|
8
15
|
@color = color
|
@@ -10,6 +17,10 @@ module Gruff
|
|
10
17
|
@dasharray = dasharray
|
11
18
|
end
|
12
19
|
|
20
|
+
# @rbs start_x: Float | Integer
|
21
|
+
# @rbs start_y: Float | Integer
|
22
|
+
# @rbs end_x: Float | Integer
|
23
|
+
# @rbs end_y: Float | Integer
|
13
24
|
def render(start_x, start_y, end_x, end_y)
|
14
25
|
@renderer.draw.push
|
15
26
|
@renderer.draw.stroke_color(@color)
|
data/lib/gruff/renderer/dot.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Renderer::Dot
|
8
|
+
# @rbs renderer: Gruff::Renderer
|
9
|
+
# @rbs style: :square | :circle | :diamond | 'square' | 'circle' | 'diamond'
|
10
|
+
# @rbs color: String
|
11
|
+
# @rbs width: Float | Integer
|
12
|
+
# @rbs opacity: Float | Integer
|
13
|
+
# @rbs return: void
|
6
14
|
def initialize(renderer, style, color:, width: 1.0, opacity: 1.0)
|
7
15
|
@renderer = renderer
|
8
16
|
@style = style.to_sym
|
@@ -11,6 +19,9 @@ module Gruff
|
|
11
19
|
@opacity = opacity
|
12
20
|
end
|
13
21
|
|
22
|
+
# @rbs new_x: Float | Integer
|
23
|
+
# @rbs new_y: Float | Integer
|
24
|
+
# @rbs radius: Float | Integer
|
14
25
|
def render(new_x, new_y, radius)
|
15
26
|
@renderer.draw.push
|
16
27
|
@renderer.draw.stroke_width(@width)
|
@@ -1,14 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Renderer::Ellipse
|
8
|
+
# @rbs renderer: Gruff::Renderer
|
9
|
+
# @rbs color: String
|
10
|
+
# @rbs width: Float | Integer
|
11
|
+
# @rbs return: void
|
6
12
|
def initialize(renderer, color:, width: 1.0)
|
7
13
|
@renderer = renderer
|
8
14
|
@color = color
|
9
15
|
@width = width
|
10
16
|
end
|
11
17
|
|
18
|
+
# @rbs origin_x: Float | Integer
|
19
|
+
# @rbs origin_y: Float | Integer
|
20
|
+
# @rbs width: Float | Integer
|
21
|
+
# @rbs height: Float | Integer
|
22
|
+
# @rbs arc_start: Float | Integer
|
23
|
+
# @rbs arc_end: Float | Integer
|
12
24
|
def render(origin_x, origin_y, width, height, arc_start, arc_end)
|
13
25
|
@renderer.draw.push
|
14
26
|
@renderer.draw.stroke_width(@width)
|
data/lib/gruff/renderer/line.rb
CHANGED
@@ -1,16 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Renderer::Line
|
6
8
|
EPSILON = 0.001
|
7
9
|
|
10
|
+
# @rbs renderer: Gruff::Renderer
|
11
|
+
# @rbs color: String
|
12
|
+
# @rbs width: Float | Integer
|
13
|
+
# @rbs return: void
|
8
14
|
def initialize(renderer, color:, width: nil)
|
9
15
|
@renderer = renderer
|
10
16
|
@color = color
|
11
17
|
@width = width
|
12
18
|
end
|
13
19
|
|
20
|
+
# @rbs start_x: Float | Integer
|
21
|
+
# @rbs start_y: Float | Integer
|
22
|
+
# @rbs end_x: Float | Integer
|
23
|
+
# @rbs end_y: Float | Integer
|
14
24
|
def render(start_x, start_y, end_x, end_y)
|
15
25
|
render_line(start_x, start_y, end_x, end_y, @color)
|
16
26
|
end
|