gruff 0.6.0-java → 0.11.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 +5 -5
- data/.editorconfig +14 -0
- data/.github/ISSUE_TEMPLATE.md +18 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +109 -0
- data/.rubocop_todo.yml +112 -0
- data/.travis.yml +24 -15
- data/.yardopts +1 -0
- data/{History.txt → CHANGELOG.md} +72 -25
- data/Gemfile +3 -7
- data/README.md +57 -25
- data/Rakefile +21 -192
- data/assets/plastik/blue.png +0 -0
- data/assets/plastik/green.png +0 -0
- data/assets/plastik/red.png +0 -0
- data/docker/Dockerfile +14 -0
- data/docker/build.sh +4 -0
- data/docker/launch.sh +4 -0
- data/gruff.gemspec +21 -13
- data/init.rb +2 -0
- data/lib/gruff.rb +26 -2
- data/lib/gruff/accumulator_bar.rb +18 -8
- data/lib/gruff/area.rb +33 -19
- data/lib/gruff/bar.rb +76 -45
- data/lib/gruff/base.rb +435 -704
- data/lib/gruff/bezier.rb +32 -17
- data/lib/gruff/bullet.rb +62 -68
- data/lib/gruff/dot.rb +38 -82
- data/lib/gruff/helper/bar_conversion.rb +47 -0
- data/lib/gruff/helper/bar_value_label_mixin.rb +30 -0
- data/lib/gruff/helper/stacked_mixin.rb +23 -0
- data/lib/gruff/histogram.rb +60 -0
- data/lib/gruff/line.rb +134 -170
- data/lib/gruff/mini/bar.rb +17 -10
- data/lib/gruff/mini/legend.rb +24 -36
- data/lib/gruff/mini/pie.rb +18 -12
- data/lib/gruff/mini/side_bar.rb +26 -12
- data/lib/gruff/net.rb +68 -81
- data/lib/gruff/patch/rmagick.rb +33 -0
- data/lib/gruff/patch/string.rb +10 -0
- data/lib/gruff/photo_bar.rb +39 -42
- data/lib/gruff/pie.rb +180 -89
- data/lib/gruff/renderer/bezier.rb +21 -0
- data/lib/gruff/renderer/circle.rb +21 -0
- data/lib/gruff/renderer/dash_line.rb +22 -0
- data/lib/gruff/renderer/dot.rb +39 -0
- data/lib/gruff/renderer/ellipse.rb +21 -0
- data/lib/gruff/renderer/line.rb +42 -0
- data/lib/gruff/renderer/polygon.rb +23 -0
- data/lib/gruff/renderer/polyline.rb +21 -0
- data/lib/gruff/renderer/rectangle.rb +19 -0
- data/lib/gruff/renderer/renderer.rb +132 -0
- data/lib/gruff/renderer/text.rb +53 -0
- data/lib/gruff/scatter.rb +163 -182
- data/lib/gruff/scene.rb +31 -41
- data/lib/gruff/side_bar.rb +81 -65
- data/lib/gruff/side_stacked_bar.rb +78 -62
- data/lib/gruff/spider.rb +49 -57
- data/lib/gruff/stacked_area.rb +40 -32
- data/lib/gruff/stacked_bar.rb +86 -53
- data/lib/gruff/store/base_data.rb +38 -0
- data/lib/gruff/store/custom_data.rb +38 -0
- data/lib/gruff/store/store.rb +80 -0
- data/lib/gruff/store/xy_data.rb +59 -0
- data/lib/gruff/themes.rb +32 -33
- data/lib/gruff/version.rb +3 -1
- metadata +80 -102
- data/Manifest.txt +0 -81
- data/RELEASE.md +0 -30
- data/assets/bubble.png +0 -0
- data/assets/city_scene/background/0000.png +0 -0
- data/assets/city_scene/background/0600.png +0 -0
- data/assets/city_scene/background/2000.png +0 -0
- data/assets/city_scene/clouds/cloudy.png +0 -0
- data/assets/city_scene/clouds/partly_cloudy.png +0 -0
- data/assets/city_scene/clouds/stormy.png +0 -0
- data/assets/city_scene/grass/default.png +0 -0
- data/assets/city_scene/haze/true.png +0 -0
- data/assets/city_scene/number_sample/1.png +0 -0
- data/assets/city_scene/number_sample/2.png +0 -0
- data/assets/city_scene/number_sample/default.png +0 -0
- data/assets/city_scene/sky/0000.png +0 -0
- data/assets/city_scene/sky/0200.png +0 -0
- data/assets/city_scene/sky/0400.png +0 -0
- data/assets/city_scene/sky/0600.png +0 -0
- data/assets/city_scene/sky/0800.png +0 -0
- data/assets/city_scene/sky/1000.png +0 -0
- data/assets/city_scene/sky/1200.png +0 -0
- data/assets/city_scene/sky/1400.png +0 -0
- data/assets/city_scene/sky/1500.png +0 -0
- data/assets/city_scene/sky/1700.png +0 -0
- data/assets/city_scene/sky/2000.png +0 -0
- data/assets/pc306715.jpg +0 -0
- data/lib/gruff/bar_conversion.rb +0 -46
- data/lib/gruff/deprecated.rb +0 -39
- data/lib/gruff/stacked_mixin.rb +0 -23
- data/test/gruff_test_case.rb +0 -154
- data/test/image_compare.rb +0 -58
- data/test/test_accumulator_bar.rb +0 -51
- data/test/test_area.rb +0 -134
- data/test/test_bar.rb +0 -505
- data/test/test_base.rb +0 -8
- data/test/test_bezier.rb +0 -33
- data/test/test_bullet.rb +0 -26
- data/test/test_dot.rb +0 -263
- data/test/test_labels_for_null_data.rb +0 -27
- data/test/test_legend.rb +0 -68
- data/test/test_line.rb +0 -657
- data/test/test_mini_bar.rb +0 -33
- data/test/test_mini_pie.rb +0 -25
- data/test/test_mini_side_bar.rb +0 -36
- data/test/test_net.rb +0 -231
- data/test/test_photo.rb +0 -41
- data/test/test_pie.rb +0 -161
- data/test/test_scatter.rb +0 -233
- data/test/test_scene.rb +0 -100
- data/test/test_side_bar.rb +0 -56
- data/test/test_sidestacked_bar.rb +0 -105
- data/test/test_spider.rb +0 -226
- data/test/test_stacked_area.rb +0 -52
- data/test/test_stacked_bar.rb +0 -68
data/lib/gruff/mini/bar.rb
CHANGED
@@ -1,26 +1,35 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
#
|
3
4
|
# Makes a small bar graph suitable for display at 200px or even smaller.
|
4
5
|
#
|
6
|
+
# Here's how to set up a Gruff::Mini::Bar.
|
7
|
+
#
|
8
|
+
# g = Gruff::Mini::Bar.new
|
9
|
+
# g.title = 'Mini Bar Graph'
|
10
|
+
# g.data :Art, [0, 5, 8, 15]
|
11
|
+
# g.data :Philosophy, [10, 3, 2, 8]
|
12
|
+
# g.data :Science, [2, 15, 8, 11]
|
13
|
+
# g.write('mini_bar.png')
|
14
|
+
#
|
5
15
|
module Gruff
|
6
16
|
module Mini
|
7
|
-
|
8
17
|
class Bar < Gruff::Bar
|
9
|
-
|
10
18
|
include Gruff::Mini::Legend
|
11
|
-
|
19
|
+
|
12
20
|
def initialize_ivars
|
13
21
|
super
|
14
|
-
|
22
|
+
|
15
23
|
@hide_legend = true
|
16
24
|
@hide_title = true
|
17
25
|
@hide_line_numbers = true
|
18
26
|
|
19
27
|
@marker_font_size = 50.0
|
20
|
-
@minimum_value = 0.0
|
21
|
-
@maximum_value = 0.0
|
22
28
|
@legend_font_size = 60.0
|
29
|
+
|
30
|
+
@minimum_value = 0.0
|
23
31
|
end
|
32
|
+
private :initialize_ivars
|
24
33
|
|
25
34
|
def draw
|
26
35
|
expand_canvas_for_vertical_legend
|
@@ -28,10 +37,8 @@ module Gruff
|
|
28
37
|
super
|
29
38
|
|
30
39
|
draw_vertical_legend
|
31
|
-
|
40
|
+
Gruff::Renderer.finish
|
32
41
|
end
|
33
|
-
|
34
42
|
end
|
35
|
-
|
36
43
|
end
|
37
44
|
end
|
data/lib/gruff/mini/legend.rb
CHANGED
@@ -1,20 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gruff
|
2
4
|
module Mini
|
3
5
|
module Legend
|
4
|
-
|
5
6
|
attr_accessor :hide_mini_legend, :legend_position
|
6
7
|
|
8
|
+
def initialize(*)
|
9
|
+
@hide_mini_legend = false
|
10
|
+
@legend_position = nil
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
7
14
|
##
|
8
15
|
# The canvas needs to be bigger so we can put the legend beneath it.
|
9
16
|
|
10
17
|
def expand_canvas_for_vertical_legend
|
11
18
|
return if @hide_mini_legend
|
12
19
|
|
13
|
-
@legend_labels =
|
20
|
+
@legend_labels = store.data.map(&:label)
|
14
21
|
|
15
|
-
legend_height = scale_fontsize(
|
16
|
-
@data.length * calculate_line_height +
|
17
|
-
@top_margin + @bottom_margin)
|
22
|
+
legend_height = scale_fontsize(store.length * calculate_line_height + @top_margin + @bottom_margin)
|
18
23
|
|
19
24
|
@original_rows = @raw_rows
|
20
25
|
@original_columns = @raw_columns
|
@@ -24,9 +29,10 @@ module Gruff
|
|
24
29
|
@rows = [@rows, legend_height].max
|
25
30
|
@columns += calculate_legend_width + @left_margin
|
26
31
|
else
|
27
|
-
@rows +=
|
32
|
+
@rows += store.length * calculate_caps_height(scale_fontsize(@legend_font_size)) * 1.7
|
28
33
|
end
|
29
|
-
|
34
|
+
|
35
|
+
Gruff::Renderer.setup(@columns, @rows, @font, @scale, @theme_options)
|
30
36
|
end
|
31
37
|
|
32
38
|
def calculate_line_height
|
@@ -35,7 +41,7 @@ module Gruff
|
|
35
41
|
|
36
42
|
def calculate_legend_width
|
37
43
|
width = @legend_labels.map { |label| calculate_width(@legend_font_size, label) }.max
|
38
|
-
scale_fontsize(width + 40*1.7)
|
44
|
+
scale_fontsize(width + 40 * 1.7)
|
39
45
|
end
|
40
46
|
|
41
47
|
##
|
@@ -45,14 +51,9 @@ module Gruff
|
|
45
51
|
return if @hide_mini_legend
|
46
52
|
|
47
53
|
legend_square_width = 40.0 # small square with color of this item
|
48
|
-
legend_square_margin = 10.0
|
49
54
|
@legend_left_margin = 100.0
|
50
55
|
legend_top_margin = 40.0
|
51
56
|
|
52
|
-
# May fix legend drawing problem at small sizes
|
53
|
-
@d.font = @font if @font
|
54
|
-
@d.pointsize = @legend_font_size
|
55
|
-
|
56
57
|
case @legend_position
|
57
58
|
when :right then
|
58
59
|
current_x_offset = @original_columns + @left_margin
|
@@ -62,33 +63,21 @@ module Gruff
|
|
62
63
|
current_y_offset = @original_rows + legend_top_margin
|
63
64
|
end
|
64
65
|
|
65
|
-
debug { @d.line 0.0, current_y_offset, @raw_columns, current_y_offset }
|
66
|
-
|
67
66
|
@legend_labels.each_with_index do |legend_label, index|
|
68
|
-
|
69
67
|
# Draw label
|
70
|
-
|
71
|
-
|
72
|
-
@
|
73
|
-
@d.stroke = 'transparent'
|
74
|
-
@d.font_weight = Magick::NormalWeight
|
75
|
-
@d.gravity = Magick::WestGravity
|
76
|
-
@d = @d.annotate_scaled( @base_image,
|
77
|
-
@raw_columns, 1.0,
|
78
|
-
current_x_offset + (legend_square_width * 1.7), current_y_offset,
|
79
|
-
truncate_legend_label(legend_label), @scale)
|
68
|
+
label = truncate_legend_label(legend_label)
|
69
|
+
text_renderer = Gruff::Renderer::Text.new(label, font: @font, size: @legend_font_size, color: @font_color)
|
70
|
+
text_renderer.add_to_render_queue(@raw_columns, 1.0, current_x_offset + (legend_square_width * 1.7), current_y_offset, Magick::WestGravity)
|
80
71
|
|
81
72
|
# Now draw box with color of this dataset
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
current_y_offset + legend_square_width / 2.0)
|
73
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(color: store.data[index].color)
|
74
|
+
rect_renderer.render(current_x_offset,
|
75
|
+
current_y_offset - legend_square_width / 2.0,
|
76
|
+
current_x_offset + legend_square_width,
|
77
|
+
current_y_offset + legend_square_width / 2.0)
|
88
78
|
|
89
79
|
current_y_offset += calculate_line_height
|
90
80
|
end
|
91
|
-
@color_index = 0
|
92
81
|
end
|
93
82
|
|
94
83
|
##
|
@@ -99,11 +88,10 @@ module Gruff
|
|
99
88
|
def truncate_legend_label(label)
|
100
89
|
truncated_label = label.to_s
|
101
90
|
while calculate_width(scale_fontsize(@legend_font_size), truncated_label) > (@columns - @legend_left_margin - @right_margin) && (truncated_label.length > 1)
|
102
|
-
truncated_label = truncated_label[0..truncated_label.length-2]
|
91
|
+
truncated_label = truncated_label[0..truncated_label.length - 2]
|
103
92
|
end
|
104
|
-
truncated_label + (truncated_label.length < label.to_s.length ?
|
93
|
+
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
105
94
|
end
|
106
|
-
|
107
95
|
end
|
108
96
|
end
|
109
97
|
end
|
data/lib/gruff/mini/pie.rb
CHANGED
@@ -1,36 +1,42 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
#
|
3
4
|
# Makes a small pie graph suitable for display at 200px or even smaller.
|
4
5
|
#
|
6
|
+
# Here's how to set up a Gruff::Mini::Pie.
|
7
|
+
#
|
8
|
+
# g = Gruff::Mini::Pie.new
|
9
|
+
# g.title = "Visual Pie Graph Test"
|
10
|
+
# g.data 'Fries', 20
|
11
|
+
# g.data 'Hamburgers', 50
|
12
|
+
# g.write("mini_pie_keynote.png")
|
13
|
+
#
|
5
14
|
module Gruff
|
6
15
|
module Mini
|
7
|
-
|
8
16
|
class Pie < Gruff::Pie
|
9
|
-
|
10
17
|
include Gruff::Mini::Legend
|
11
18
|
|
12
19
|
def initialize_ivars
|
13
20
|
super
|
14
|
-
|
21
|
+
|
15
22
|
@hide_legend = true
|
16
23
|
@hide_title = true
|
17
24
|
@hide_line_numbers = true
|
18
|
-
|
25
|
+
|
19
26
|
@marker_font_size = 60.0
|
20
27
|
@legend_font_size = 60.0
|
21
28
|
end
|
29
|
+
private :initialize_ivars
|
22
30
|
|
23
31
|
def draw
|
24
32
|
expand_canvas_for_vertical_legend
|
25
|
-
|
33
|
+
|
26
34
|
super
|
27
|
-
|
35
|
+
|
28
36
|
draw_vertical_legend
|
29
|
-
|
30
|
-
@d.draw(@base_image)
|
31
|
-
end # def draw
|
32
37
|
|
33
|
-
|
34
|
-
|
38
|
+
Gruff::Renderer.finish
|
39
|
+
end
|
40
|
+
end
|
35
41
|
end
|
36
42
|
end
|
data/lib/gruff/mini/side_bar.rb
CHANGED
@@ -1,14 +1,29 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Makes a small side bar graph suitable for display at 200px or even smaller.
|
5
|
+
#
|
6
|
+
# Here's how to set up a Gruff::Mini::SideBar.
|
2
7
|
#
|
3
|
-
#
|
8
|
+
# g = Gruff::Mini::SideBar.new
|
9
|
+
# g.title = 'SideBar Graph'
|
10
|
+
# g.labels = {
|
11
|
+
# 0 => '5/6',
|
12
|
+
# 1 => '5/15',
|
13
|
+
# 2 => '5/24',
|
14
|
+
# 3 => '5/30',
|
15
|
+
# }
|
16
|
+
# g.group_spacing = 20
|
17
|
+
# g.data :Art, [0, 5, 8, 15]
|
18
|
+
# g.data :Philosophy, [10, 3, 2, 8]
|
19
|
+
# g.data :Science, [2, 15, 8, 11]
|
20
|
+
# g.write('mini_sidebar.png')
|
4
21
|
#
|
5
22
|
module Gruff
|
6
23
|
module Mini
|
7
|
-
|
8
24
|
class SideBar < Gruff::SideBar
|
9
|
-
|
10
25
|
include Gruff::Mini::Legend
|
11
|
-
|
26
|
+
|
12
27
|
def initialize_ivars
|
13
28
|
super
|
14
29
|
@hide_legend = true
|
@@ -18,18 +33,17 @@ module Gruff
|
|
18
33
|
@marker_font_size = 50.0
|
19
34
|
@legend_font_size = 50.0
|
20
35
|
end
|
21
|
-
|
36
|
+
private :initialize_ivars
|
37
|
+
|
22
38
|
def draw
|
23
39
|
expand_canvas_for_vertical_legend
|
24
|
-
|
40
|
+
|
25
41
|
super
|
26
|
-
|
42
|
+
|
27
43
|
draw_vertical_legend
|
28
|
-
|
29
|
-
|
44
|
+
|
45
|
+
Gruff::Renderer.finish
|
30
46
|
end
|
31
|
-
|
32
47
|
end
|
33
|
-
|
34
48
|
end
|
35
49
|
end
|
data/lib/gruff/net.rb
CHANGED
@@ -1,127 +1,114 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gruff/base'
|
4
|
+
|
5
|
+
# See also the Spider graph.
|
6
|
+
#
|
7
|
+
# Here's how to make a Gruff::Net.
|
8
|
+
#
|
9
|
+
# g = Gruff::Net.new
|
10
|
+
# g.title = "Net Graph"
|
11
|
+
# g.labels = {
|
12
|
+
# 0 => '5/6',
|
13
|
+
# 1 => '5/15',
|
14
|
+
# 2 => '5/24',
|
15
|
+
# 3 => '5/30',
|
16
|
+
# 4 => '6/4',
|
17
|
+
# 5 => '6/12',
|
18
|
+
# 6 => '6/21',
|
19
|
+
# 7 => '6/28'
|
20
|
+
# }
|
21
|
+
# g.line_width = 3
|
22
|
+
# g.dot_radius = 4
|
23
|
+
# g.data :Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]
|
24
|
+
# g.data :Julie, [22, 29, 35, 38, 36, 40, 46, 57]
|
25
|
+
# g.write("net.png")
|
26
|
+
#
|
4
27
|
class Gruff::Net < Gruff::Base
|
5
|
-
|
6
28
|
# Hide parts of the graph to fit more datapoints, or for a different appearance.
|
7
|
-
|
29
|
+
attr_writer :hide_dots
|
8
30
|
|
9
|
-
# Dimensions of lines and dots; calculated based on dataset size if left unspecified
|
10
|
-
|
11
|
-
|
31
|
+
# Dimensions of lines and dots; calculated based on dataset size if left unspecified.
|
32
|
+
attr_writer :line_width
|
33
|
+
attr_writer :dot_radius
|
12
34
|
|
13
|
-
def
|
35
|
+
def initialize_ivars
|
14
36
|
super
|
15
37
|
|
16
38
|
@hide_dots = false
|
39
|
+
@line_width = nil
|
40
|
+
@dot_radius = nil
|
17
41
|
@hide_line_numbers = true
|
18
42
|
@sorted_drawing = true
|
19
43
|
end
|
44
|
+
private :initialize_ivars
|
20
45
|
|
21
46
|
def draw
|
22
47
|
super
|
23
48
|
|
24
|
-
return unless
|
25
|
-
|
26
|
-
@radius = @graph_height / 2.0
|
27
|
-
@center_x = @graph_left + (@graph_width / 2.0)
|
28
|
-
@center_y = @graph_top + (@graph_height / 2.0) - 10 # Move graph up a bit
|
29
|
-
|
30
|
-
@x_increment = @graph_width / (@column_count - 1).to_f
|
31
|
-
circle_radius = dot_radius ||
|
32
|
-
clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 2.5), 5.0)
|
33
|
-
|
34
|
-
@d = @d.stroke_opacity 1.0
|
35
|
-
@d = @d.stroke_width line_width ||
|
36
|
-
clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 4), 5.0)
|
37
|
-
|
38
|
-
if defined?(@norm_baseline)
|
39
|
-
level = @graph_top + (@graph_height - @norm_baseline * @graph_height)
|
40
|
-
@d = @d.push
|
41
|
-
@d.stroke_color @baseline_color
|
42
|
-
@d.fill_opacity 0.0
|
43
|
-
@d.stroke_dasharray(10, 20)
|
44
|
-
@d.stroke_width 5
|
45
|
-
@d.line(@graph_left, level, @graph_left + @graph_width, level)
|
46
|
-
@d = @d.pop
|
47
|
-
end
|
48
|
-
|
49
|
-
@norm_data.each do |data_row|
|
50
|
-
@d = @d.stroke data_row[DATA_COLOR_INDEX]
|
51
|
-
@d = @d.fill data_row[DATA_COLOR_INDEX]
|
49
|
+
return unless data_given?
|
52
50
|
|
53
|
-
|
51
|
+
store.norm_data.each do |data_row|
|
52
|
+
data_row.points.each_with_index do |data_point, index|
|
54
53
|
next if data_point.nil?
|
55
54
|
|
56
|
-
rad_pos = index * Math::PI * 2 /
|
55
|
+
rad_pos = index * Math::PI * 2 / column_count
|
57
56
|
point_distance = data_point * @radius
|
58
|
-
start_x = @center_x + Math
|
59
|
-
start_y = @center_y - Math
|
57
|
+
start_x = @center_x + Math.sin(rad_pos) * point_distance
|
58
|
+
start_y = @center_y - Math.cos(rad_pos) * point_distance
|
60
59
|
|
61
|
-
next_index = index + 1 < data_row
|
60
|
+
next_index = index + 1 < data_row.points.length ? index + 1 : 0
|
62
61
|
|
63
|
-
next_rad_pos = next_index * Math::PI * 2 /
|
64
|
-
next_point_distance = data_row[
|
65
|
-
end_x = @center_x + Math
|
66
|
-
end_y = @center_y - Math
|
62
|
+
next_rad_pos = next_index * Math::PI * 2 / column_count
|
63
|
+
next_point_distance = data_row.points[next_index] * @radius
|
64
|
+
end_x = @center_x + Math.sin(next_rad_pos) * next_point_distance
|
65
|
+
end_y = @center_y - Math.cos(next_rad_pos) * next_point_distance
|
67
66
|
|
68
|
-
|
67
|
+
Gruff::Renderer::Line.new(color: data_row.color, width: @stroke_width).render(start_x, start_y, end_x, end_y)
|
69
68
|
|
70
|
-
|
69
|
+
Gruff::Renderer::Circle.new(color: data_row.color, width: @stroke_width).render(start_x, start_y, start_x - @circle_radius, start_y) unless @hide_dots
|
71
70
|
end
|
72
|
-
|
73
71
|
end
|
74
72
|
|
75
|
-
|
73
|
+
Gruff::Renderer.finish
|
76
74
|
end
|
77
75
|
|
76
|
+
private
|
78
77
|
|
79
|
-
|
80
|
-
|
81
|
-
return if @hide_line_markers
|
82
|
-
|
78
|
+
def setup_drawing
|
79
|
+
super
|
83
80
|
|
84
|
-
# have to do this here (AGAIN)... see draw() in this class
|
85
|
-
# because this funtion is called before the @radius, @center_x and @center_y are set
|
86
81
|
@radius = @graph_height / 2.0
|
82
|
+
@circle_radius = @dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.points.size * 2.5), 5.0)
|
83
|
+
@stroke_width = @line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.points.size * 4), 5.0)
|
87
84
|
@center_x = @graph_left + (@graph_width / 2.0)
|
88
|
-
@center_y = @graph_top + (@graph_height / 2.0)
|
85
|
+
@center_y = @graph_top + (@graph_height / 2.0) + 10
|
86
|
+
end
|
89
87
|
|
88
|
+
# the lines connecting in the center, with the first line vertical
|
89
|
+
def draw_line_markers
|
90
|
+
return if @hide_line_markers
|
90
91
|
|
91
92
|
# Draw horizontal line markers and annotate with numbers
|
92
|
-
|
93
|
-
|
94
|
-
|
93
|
+
(0..column_count - 1).each do |index|
|
94
|
+
rad_pos = index * Math::PI * 2 / column_count
|
95
95
|
|
96
|
-
|
97
|
-
|
96
|
+
Gruff::Renderer::Line.new(color: @marker_color)
|
97
|
+
.render(@center_x, @center_y, @center_x + Math.sin(rad_pos) * @radius, @center_y - Math.cos(rad_pos) * @radius)
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
marker_label = labels[index] ? labels[index].to_s : '000'
|
103
|
-
|
104
|
-
draw_label(@center_x, @center_y, rad_pos * 360 / (2 * Math::PI), @radius, marker_label)
|
99
|
+
marker_label = @labels[index] ? @labels[index].to_s : '000'
|
100
|
+
draw_label(@center_x, @center_y, rad_pos * 360 / (2 * Math::PI), @radius + @circle_radius, marker_label)
|
105
101
|
end
|
106
102
|
end
|
107
103
|
|
108
|
-
private
|
109
|
-
|
110
104
|
def draw_label(center_x, center_y, angle, radius, amount)
|
111
|
-
r_offset = 1.1
|
112
105
|
x_offset = center_x # + 15 # The label points need to be tweaked slightly
|
113
106
|
y_offset = center_y # + 0 # This one doesn't though
|
114
|
-
x = x_offset + (radius
|
115
|
-
y = y_offset - (radius
|
107
|
+
x = x_offset + (radius + LABEL_MARGIN) * Math.sin(deg2rad(angle))
|
108
|
+
y = y_offset - (radius + LABEL_MARGIN) * Math.cos(deg2rad(angle))
|
116
109
|
|
117
110
|
# Draw label
|
118
|
-
|
119
|
-
|
120
|
-
@d.pointsize = scale_fontsize(20)
|
121
|
-
@d.stroke = 'transparent'
|
122
|
-
@d.font_weight = BoldWeight
|
123
|
-
@d.gravity = CenterGravity
|
124
|
-
@d.annotate_scaled(@base_image, 0, 0, x, y, amount, @scale)
|
111
|
+
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: 20, color: @marker_color, weight: Magick::BoldWeight)
|
112
|
+
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
125
113
|
end
|
126
|
-
|
127
114
|
end
|