gruff 0.26.0-java → 0.27.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/.github/ISSUE_TEMPLATE/report.yml +1 -1
- data/.github/workflows/ci.yml +37 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +18 -1
- data/Gemfile +5 -0
- data/README.md +7 -1
- 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 +193 -68
- 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 +51 -6
data/lib/gruff/store/store.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
# @private
|
5
7
|
class Store
|
6
|
-
attr_reader :data
|
8
|
+
attr_reader :data #: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
|
7
9
|
|
10
|
+
# @rbs return: void
|
8
11
|
def initialize(data_class)
|
9
12
|
@data_class = data_class
|
10
13
|
@data = []
|
@@ -14,40 +17,48 @@ module Gruff
|
|
14
17
|
@data << @data_class.new(*args)
|
15
18
|
end
|
16
19
|
|
20
|
+
# @rbs return: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
|
17
21
|
def norm_data
|
18
22
|
@norm_data || []
|
19
23
|
end
|
20
24
|
|
21
25
|
def normalize(**keywords)
|
22
|
-
@norm_data = @data.map { |data_row| data_row.normalize(**keywords) }
|
26
|
+
@norm_data = @data.map { |data_row| data_row.normalize(**keywords) } # steep:ignore
|
23
27
|
end
|
24
28
|
|
29
|
+
# @rbs return: bool
|
25
30
|
def empty?
|
26
31
|
@data.all?(&:empty?)
|
27
32
|
end
|
28
33
|
|
34
|
+
# @rbs return: Integer
|
29
35
|
def length
|
30
36
|
@data.length
|
31
37
|
end
|
32
38
|
|
39
|
+
# @rbs return: Integer
|
33
40
|
def columns
|
34
41
|
@columns ||= @data.empty? ? 0 : @data.map(&:columns).max
|
35
42
|
end
|
36
43
|
|
44
|
+
# @rbs return: Float | Integer
|
37
45
|
def min
|
38
46
|
@min ||= @data.filter_map(&:min).min
|
39
47
|
end
|
40
48
|
alias min_y min
|
41
49
|
|
50
|
+
# @rbs return: Float | Integer
|
42
51
|
def max
|
43
52
|
@max ||= @data.filter_map(&:max).max
|
44
53
|
end
|
45
54
|
alias max_y max
|
46
55
|
|
56
|
+
# @rbs return: Float | Integer
|
47
57
|
def min_x
|
48
58
|
@min_x ||= @data.filter_map(&:min_x).min
|
49
59
|
end
|
50
60
|
|
61
|
+
# @rbs return: Float | Integer
|
51
62
|
def max_x
|
52
63
|
@max_x ||= @data.filter_map(&:max_x).max
|
53
64
|
end
|
@@ -60,14 +71,16 @@ module Gruff
|
|
60
71
|
@norm_data = @norm_data.sort_by { |a| -a.points.sum(&:to_f) }
|
61
72
|
end
|
62
73
|
|
74
|
+
# @rbs return: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
|
63
75
|
def reverse!
|
64
76
|
@data.reverse!
|
65
77
|
end
|
66
78
|
|
79
|
+
# @rbs colors: Array[String]
|
67
80
|
def change_colors(colors)
|
68
81
|
index = 0
|
69
82
|
@data.each do |data_row|
|
70
|
-
data_row.color ||= begin
|
83
|
+
data_row.color ||= begin # steep:ignore
|
71
84
|
index = (index + 1) % colors.length
|
72
85
|
colors[index - 1]
|
73
86
|
end
|
data/lib/gruff/store/xy_data.rb
CHANGED
@@ -1,49 +1,79 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
class Store
|
5
7
|
# @private
|
6
|
-
class XYData
|
8
|
+
class XYData
|
9
|
+
attr_accessor :label #: String
|
10
|
+
attr_accessor :x_points #: Array[nil | Float | Integer]
|
11
|
+
attr_accessor :y_points #: Array[nil | Float | Integer]
|
12
|
+
attr_accessor :color #: String
|
13
|
+
|
14
|
+
# @rbs label: String | Symbol
|
15
|
+
# @rbs x_points: Array[nil | Float | Integer] | nil
|
16
|
+
# @rbs y_points: Array[nil | Float | Integer] | nil
|
17
|
+
# @rbs color: String
|
7
18
|
def initialize(label, x_points, y_points, color)
|
8
19
|
y_points = Array(y_points)
|
9
20
|
x_points = x_points ? Array(x_points) : Array.new(y_points.length)
|
10
21
|
raise ArgumentError, 'x_points.length != y_points.length!' if x_points.length != y_points.length
|
11
22
|
|
12
|
-
|
23
|
+
@label = label.to_s
|
24
|
+
@x_points = x_points
|
25
|
+
@y_points = y_points
|
26
|
+
@color = color
|
13
27
|
end
|
14
28
|
|
15
29
|
alias points y_points
|
16
30
|
|
31
|
+
# @rbs return: Array[[Float | Integer | nil, Float | Integer | nil]]
|
17
32
|
def coordinates
|
18
33
|
x_points.zip(y_points)
|
19
34
|
end
|
20
35
|
|
36
|
+
def coordinate_and_pointsizes
|
37
|
+
raise NotImplementedError, 'This method is not implemented for XYData'
|
38
|
+
end
|
39
|
+
|
40
|
+
# @rbs return: bool
|
21
41
|
def empty?
|
22
42
|
y_points.empty?
|
23
43
|
end
|
24
44
|
|
45
|
+
# @rbs return: Integer
|
25
46
|
def columns
|
26
47
|
y_points.length
|
27
48
|
end
|
28
49
|
|
50
|
+
# @rbs return: Float | Integer
|
29
51
|
def min
|
30
52
|
y_points.compact.min
|
31
53
|
end
|
32
54
|
alias min_y min
|
33
55
|
|
56
|
+
# @rbs return: Float | Integer
|
34
57
|
def max
|
35
58
|
y_points.compact.max
|
36
59
|
end
|
37
60
|
alias max_y max
|
38
61
|
|
62
|
+
# @rbs return: Float | Integer
|
39
63
|
def min_x
|
40
64
|
x_points.compact.min
|
41
65
|
end
|
42
66
|
|
67
|
+
# @rbs return: Float | Integer
|
43
68
|
def max_x
|
44
69
|
x_points.compact.max
|
45
70
|
end
|
46
71
|
|
72
|
+
# @rbs minimum_x: Float | Integer
|
73
|
+
# @rbs minimum_y: Float | Integer
|
74
|
+
# @rbs spread_x: Float | Integer
|
75
|
+
# @rbs spread_y: Float | Integer
|
76
|
+
# @rbs return: Gruff::Store::XYData
|
47
77
|
def normalize(minimum_x:, minimum_y:, spread_x:, spread_y:)
|
48
78
|
norm_x_points = x_points.map do |x|
|
49
79
|
x.nil? ? nil : (x.to_f - minimum_x.to_f) / spread_x
|
@@ -1,50 +1,83 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Gruff
|
4
6
|
class Store
|
5
7
|
# @private
|
6
|
-
class XYPointsizeData
|
8
|
+
class XYPointsizeData
|
9
|
+
attr_accessor :label #: String
|
10
|
+
attr_accessor :x_points #: Array[nil | Float | Integer]
|
11
|
+
attr_accessor :y_points #: Array[nil | Float | Integer]
|
12
|
+
attr_accessor :point_sizes #: Array[nil | Float | Integer]
|
13
|
+
attr_accessor :color #: String
|
14
|
+
|
15
|
+
# @rbs label: String | Symbol
|
16
|
+
# @rbs x_points: Array[nil | Float | Integer] | nil
|
17
|
+
# @rbs y_points: Array[nil | Float | Integer] | nil
|
18
|
+
# @rbs point_sizes: Array[nil | Float | Integer]
|
19
|
+
# @rbs color: String
|
7
20
|
def initialize(label, x_points, y_points, point_sizes, color)
|
8
21
|
y_points = Array(y_points)
|
9
22
|
x_points = x_points ? Array(x_points) : Array.new(y_points.length)
|
10
23
|
raise ArgumentError, 'x_points.length != y_points.length!' if x_points.length != y_points.length
|
11
24
|
raise ArgumentError, 'x_points.length != point_sizes.length!' if x_points.length != point_sizes.length
|
12
25
|
|
13
|
-
|
26
|
+
@label = label.to_s
|
27
|
+
@x_points = x_points
|
28
|
+
@y_points = y_points
|
29
|
+
@point_sizes = point_sizes
|
30
|
+
@color = color
|
14
31
|
end
|
15
32
|
|
16
33
|
alias points y_points
|
17
34
|
|
35
|
+
def coordinates
|
36
|
+
raise NotImplementedError, 'This method is not implemented for XYPointsizeData'
|
37
|
+
end
|
38
|
+
|
39
|
+
# @rbs return: Array[[Float | Integer | nil, Float | Integer | nil, Float | Integer]]
|
18
40
|
def coordinate_and_pointsizes
|
19
|
-
x_points.zip(y_points, point_sizes)
|
41
|
+
x_points.zip(y_points, point_sizes) #: Array[[Float | Integer | nil, Float | Integer | nil, Float | Integer]]
|
20
42
|
end
|
21
43
|
|
44
|
+
# @rbs return: bool
|
22
45
|
def empty?
|
23
46
|
y_points.empty?
|
24
47
|
end
|
25
48
|
|
49
|
+
# @rbs return: Integer
|
26
50
|
def columns
|
27
51
|
y_points.length
|
28
52
|
end
|
29
53
|
|
54
|
+
# @rbs return: Float | Integer
|
30
55
|
def min
|
31
56
|
y_points.compact.min
|
32
57
|
end
|
33
58
|
alias min_y min
|
34
59
|
|
60
|
+
# @rbs return: Float | Integer
|
35
61
|
def max
|
36
62
|
y_points.compact.max
|
37
63
|
end
|
38
64
|
alias max_y max
|
39
65
|
|
66
|
+
# @rbs return: Float | Integer
|
40
67
|
def min_x
|
41
68
|
x_points.compact.min
|
42
69
|
end
|
43
70
|
|
71
|
+
# @rbs return: Float | Integer
|
44
72
|
def max_x
|
45
73
|
x_points.compact.max
|
46
74
|
end
|
47
75
|
|
76
|
+
# @rbs minimum_x: Float | Integer
|
77
|
+
# @rbs minimum_y: Float | Integer
|
78
|
+
# @rbs spread_x: Float | Integer
|
79
|
+
# @rbs spread_y: Float | Integer
|
80
|
+
# @rbs return: Gruff::Store::XYPointsizeData
|
48
81
|
def normalize(minimum_x:, minimum_y:, spread_x:, spread_y:)
|
49
82
|
norm_x_points = x_points.map do |x|
|
50
83
|
x.nil? ? nil : (x.to_f - minimum_x.to_f) / spread_x
|
data/lib/gruff/themes.rb
CHANGED
data/lib/gruff/version.rb
CHANGED
data/lib/gruff.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
require 'rmagick'
|
4
6
|
|
5
7
|
require_relative 'gruff/patch/rmagick'
|
@@ -16,7 +18,7 @@ require_relative 'gruff/version'
|
|
16
18
|
module Gruff
|
17
19
|
# @private
|
18
20
|
def self.libpath(path)
|
19
|
-
File.join(__dir__, 'gruff', path)
|
21
|
+
File.join(__dir__, 'gruff', path) # steep:ignore
|
20
22
|
end
|
21
23
|
|
22
24
|
autoload :BarConversion, Gruff.libpath('helper/bar_conversion')
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Generated from lib/gruff/accumulator_bar.rb with RBS::Inline
|
2
|
+
|
3
|
+
#
|
4
|
+
# Gruff::AccumulatorBar is a special bar graph that shows a
|
5
|
+
# single dataset as a set of stacked bars.
|
6
|
+
# The bottom bar shows the running total and the top bar shows
|
7
|
+
# the new value being added to the array.
|
8
|
+
#
|
9
|
+
# Here's how to set up a Gruff::AccumulatorBar.
|
10
|
+
#
|
11
|
+
# g = Gruff::AccumulatorBar.new
|
12
|
+
# g.title = 'Your Savings'
|
13
|
+
# g.data 'First', [1, 1, 1]
|
14
|
+
# g.write('accumulator_bar.png')
|
15
|
+
class Gruff::AccumulatorBar < Gruff::StackedBar
|
16
|
+
private
|
17
|
+
|
18
|
+
def setup_data: () -> untyped
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Generated from lib/gruff/area.rb with RBS::Inline
|
2
|
+
|
3
|
+
#
|
4
|
+
# Gruff::Area provides an area graph which displays graphically
|
5
|
+
# quantitative data.
|
6
|
+
#
|
7
|
+
# Here's how to set up a Gruff::Area.
|
8
|
+
#
|
9
|
+
# g = Gruff::Area.new
|
10
|
+
# g.title = 'Area Graph'
|
11
|
+
# g.data :Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]
|
12
|
+
# g.data :Charles, [80, 54, 67, 54, 68, 70, 90, 95]
|
13
|
+
# g.data :Julie, [22, 29, 35, 38, 36, 40, 46, 57]
|
14
|
+
# g.write('area.png')
|
15
|
+
class Gruff::Area < Gruff::Base
|
16
|
+
# Specifies the filling opacity in area graph. Default is +0.85+.
|
17
|
+
attr_writer fill_opacity: Float | Integer
|
18
|
+
|
19
|
+
# Specifies the stroke width in line around area graph. Default is +2.0+.
|
20
|
+
attr_writer stroke_width: Float | Integer
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def initialize_attributes: () -> untyped
|
25
|
+
|
26
|
+
def draw_graph: () -> untyped
|
27
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Generated from lib/gruff/bar.rb with RBS::Inline
|
2
|
+
|
3
|
+
#
|
4
|
+
# Gruff::Bar provide a bar graph that presents categorical data
|
5
|
+
# with rectangular bars.
|
6
|
+
#
|
7
|
+
# Here's how to set up a Gruff::Bar.
|
8
|
+
#
|
9
|
+
# g = Gruff::Bar.new
|
10
|
+
# g.title = 'Bar Graph With Manual Colors'
|
11
|
+
# g.spacing_factor = 0.1
|
12
|
+
# g.group_spacing = 20
|
13
|
+
# g.data :Art, [0, 5, 8, 15], '#990000'
|
14
|
+
# g.data :Philosophy, [10, 3, 2, 8], '#009900'
|
15
|
+
# g.data :Science, [2, 15, 8, 11], '#990099'
|
16
|
+
# g.write('bar.png')
|
17
|
+
class Gruff::Bar < Gruff::Base
|
18
|
+
include Gruff::Base::BarMixin
|
19
|
+
|
20
|
+
# Spacing factor applied between bars.
|
21
|
+
attr_writer bar_spacing: Float | Integer
|
22
|
+
|
23
|
+
# Spacing factor applied between a group of bars belonging to the same label.
|
24
|
+
attr_writer group_spacing: Float | Integer
|
25
|
+
|
26
|
+
# Set the number output format string or lambda.
|
27
|
+
# Default is +"%.2f"+.
|
28
|
+
attr_writer label_formatting: nil | String | Proc
|
29
|
+
|
30
|
+
# Output the values for the bars on a bar graph.
|
31
|
+
# Default is +false+.
|
32
|
+
attr_writer show_labels_for_bar_values: bool
|
33
|
+
|
34
|
+
# Prevent drawing of column labels below a bar graph. Default is +false+.
|
35
|
+
attr_writer hide_labels: bool
|
36
|
+
|
37
|
+
# Value to avoid completely overwriting the coordinate axis
|
38
|
+
AXIS_MARGIN: ::Float
|
39
|
+
|
40
|
+
# Can be used to adjust the spaces between the bars.
|
41
|
+
# Accepts values between 0.00 and 1.00 where 0.00 means no spacing at all
|
42
|
+
# and 1 means that each bars' width is nearly 0 (so each bar is a simple
|
43
|
+
# line with no x dimension).
|
44
|
+
#
|
45
|
+
# Default value is +0.9+.
|
46
|
+
#
|
47
|
+
# @rbs space_percent: Float | Integer
|
48
|
+
def spacing_factor=: (Float | Integer space_percent) -> untyped
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def initialize_attributes: () -> untyped
|
53
|
+
|
54
|
+
def setup_drawing: () -> untyped
|
55
|
+
|
56
|
+
# @rbs return: bool
|
57
|
+
def hide_labels?: () -> bool
|
58
|
+
|
59
|
+
# @rbs return: bool
|
60
|
+
def hide_left_label_area?: () -> bool
|
61
|
+
|
62
|
+
# @rbs return: bool
|
63
|
+
def hide_bottom_label_area?: () -> bool
|
64
|
+
|
65
|
+
def setup_graph_measurements: () -> untyped
|
66
|
+
|
67
|
+
def draw_graph: () -> untyped
|
68
|
+
|
69
|
+
# @rbs return: Float | Integer
|
70
|
+
def calculate_spacing: () -> (Float | Integer)
|
71
|
+
|
72
|
+
# @rbs return: Proc
|
73
|
+
def proc_text_metrics: () -> Proc
|
74
|
+
end
|