gruff 0.9.0 → 0.12.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +21 -4
- data/.rubocop_todo.yml +103 -49
- data/.travis.yml +3 -6
- data/CHANGELOG.md +30 -0
- data/README.md +4 -0
- data/gruff.gemspec +8 -3
- data/lib/gruff.rb +9 -3
- data/lib/gruff/accumulator_bar.rb +13 -5
- data/lib/gruff/area.rb +22 -5
- data/lib/gruff/bar.rb +38 -10
- data/lib/gruff/base.rb +325 -236
- data/lib/gruff/bezier.rb +18 -4
- data/lib/gruff/bullet.rb +22 -14
- data/lib/gruff/dot.rb +20 -33
- data/lib/gruff/helper/bar_conversion.rb +7 -7
- data/lib/gruff/helper/bar_value_label_mixin.rb +3 -0
- data/lib/gruff/helper/stacked_mixin.rb +1 -1
- data/lib/gruff/histogram.rb +59 -0
- data/lib/gruff/line.rb +33 -28
- data/lib/gruff/mini/bar.rb +10 -2
- data/lib/gruff/mini/legend.rb +9 -4
- data/lib/gruff/mini/pie.rb +9 -3
- data/lib/gruff/mini/side_bar.rb +18 -4
- data/lib/gruff/net.rb +41 -21
- data/lib/gruff/patch/rmagick.rb +22 -24
- data/lib/gruff/patch/string.rb +9 -4
- data/lib/gruff/photo_bar.rb +12 -16
- data/lib/gruff/pie.rb +24 -34
- 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 +29 -7
- data/lib/gruff/scatter.rb +26 -24
- data/lib/gruff/scene.rb +0 -1
- data/lib/gruff/side_bar.rb +51 -20
- data/lib/gruff/side_stacked_bar.rb +42 -15
- data/lib/gruff/spider.rb +29 -17
- data/lib/gruff/stacked_area.rb +19 -8
- data/lib/gruff/stacked_bar.rb +34 -13
- 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 +7 -6
- data/lib/gruff/store/xy_data.rb +10 -7
- data/lib/gruff/version.rb +1 -1
- metadata +50 -11
- data/Rakefile +0 -23
- data/docker/Dockerfile +0 -14
- data/docker/build.sh +0 -4
- data/docker/launch.sh +0 -4
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Bezier
|
5
|
-
def initialize(
|
6
|
-
@color =
|
7
|
-
@width =
|
6
|
+
def initialize(color:, width: 1.0)
|
7
|
+
@color = color
|
8
|
+
@width = width
|
8
9
|
end
|
9
10
|
|
10
11
|
def render(points)
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Circle
|
5
|
-
def initialize(
|
6
|
-
@color =
|
7
|
-
@width =
|
6
|
+
def initialize(color:, width: 1.0)
|
7
|
+
@color = color
|
8
|
+
@width = width
|
8
9
|
end
|
9
10
|
|
10
11
|
def render(origin_x, origin_y, perim_x, perim_y)
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::DashLine
|
5
|
-
def initialize(
|
6
|
-
@color =
|
7
|
-
@width =
|
6
|
+
def initialize(color:, width:)
|
7
|
+
@color = color
|
8
|
+
@width = width
|
8
9
|
end
|
9
10
|
|
10
11
|
def render(start_x, start_y, end_x, end_y)
|
data/lib/gruff/renderer/dot.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Dot
|
5
|
-
def initialize(style,
|
6
|
+
def initialize(style, color:, width: 1.0)
|
6
7
|
@style = style
|
7
|
-
@color =
|
8
|
-
@width =
|
8
|
+
@color = color
|
9
|
+
@width = width
|
9
10
|
end
|
10
11
|
|
11
12
|
def render(new_x, new_y, circle_radius)
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Ellipse
|
5
|
-
def initialize(
|
6
|
-
@color =
|
7
|
-
@width =
|
6
|
+
def initialize(color:, width: 1.0)
|
7
|
+
@color = color
|
8
|
+
@width = width
|
8
9
|
end
|
9
10
|
|
10
11
|
def render(origin_x, origin_y, width, height, arc_start, arc_end)
|
data/lib/gruff/renderer/line.rb
CHANGED
@@ -1,15 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Line
|
5
6
|
EPSILON = 0.001
|
6
7
|
|
7
|
-
def initialize(
|
8
|
-
@color =
|
9
|
-
@width =
|
8
|
+
def initialize(color:, width: nil, shadow_color: nil)
|
9
|
+
@color = color
|
10
|
+
@width = width
|
11
|
+
@shadow_color = shadow_color
|
10
12
|
end
|
11
13
|
|
12
14
|
def render(start_x, start_y, end_x, end_y)
|
15
|
+
render_line(start_x, start_y, end_x, end_y, @color)
|
16
|
+
render_line(start_x, start_y + 1, end_x, end_y + 1, @shadow_color) if @shadow_color
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def render_line(start_x, start_y, end_x, end_y, color)
|
13
22
|
# FIXME(uwe): Workaround for Issue #66
|
14
23
|
# https://github.com/topfunky/gruff/issues/66
|
15
24
|
# https://github.com/rmagick/rmagick/issues/82
|
@@ -24,8 +33,8 @@ module Gruff
|
|
24
33
|
draw = Renderer.instance.draw
|
25
34
|
|
26
35
|
draw.push
|
27
|
-
draw.stroke(
|
28
|
-
draw.fill(
|
36
|
+
draw.stroke(color)
|
37
|
+
draw.fill(color)
|
29
38
|
draw.stroke_width(@width) if @width
|
30
39
|
draw.line(start_x, start_y, end_x, end_y)
|
31
40
|
draw.pop
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Polygon
|
5
|
-
def initialize(
|
6
|
-
@color =
|
7
|
-
@width =
|
8
|
-
@opacity =
|
6
|
+
def initialize(color:, width: 1.0, opacity: 1.0)
|
7
|
+
@color = color
|
8
|
+
@width = width
|
9
|
+
@opacity = opacity
|
9
10
|
end
|
10
11
|
|
11
12
|
def render(points)
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Polyline
|
5
|
-
def initialize(
|
6
|
-
@color =
|
7
|
-
@width =
|
6
|
+
def initialize(color:, width:)
|
7
|
+
@color = color
|
8
|
+
@width = width
|
8
9
|
end
|
9
10
|
|
10
11
|
def render(points)
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Rectangle
|
5
|
-
def initialize(
|
6
|
-
@color =
|
6
|
+
def initialize(color: nil)
|
7
|
+
@color = color
|
7
8
|
end
|
8
9
|
|
9
10
|
def render(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
|
@@ -7,58 +7,51 @@ module Gruff
|
|
7
7
|
class Renderer
|
8
8
|
include Singleton
|
9
9
|
|
10
|
-
attr_accessor :draw, :image, :scale
|
10
|
+
attr_accessor :draw, :image, :scale, :text_renderers
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
draw.scale(scale, scale)
|
12
|
+
def self.setup(columns, rows, font, scale, theme_options)
|
13
|
+
draw = Magick::Draw.new
|
14
|
+
draw.font = font if font
|
15
|
+
# Scale down from 800x600 used to calculate drawing.
|
16
|
+
draw.scale(scale, scale)
|
18
17
|
|
19
|
-
|
18
|
+
image = Renderer.instance.background(columns, rows, scale, theme_options)
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def setup_transparent_background(columns, rows)
|
27
|
-
image = Renderer.instance.render_transparent_background(columns, rows)
|
28
|
-
Renderer.instance.image = image
|
29
|
-
end
|
20
|
+
Renderer.instance.draw = draw
|
21
|
+
Renderer.instance.scale = scale
|
22
|
+
Renderer.instance.image = image
|
23
|
+
Renderer.instance.text_renderers = []
|
24
|
+
end
|
30
25
|
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
def self.setup_transparent_background(columns, rows)
|
27
|
+
image = Renderer.instance.render_transparent_background(columns, rows)
|
28
|
+
Renderer.instance.image = image
|
29
|
+
end
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
31
|
+
def self.background_image=(image)
|
32
|
+
Renderer.instance.image = image
|
33
|
+
end
|
39
34
|
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
def self.font=(font)
|
36
|
+
draw = Renderer.instance.draw
|
37
|
+
draw.font = font if font
|
38
|
+
end
|
43
39
|
|
44
|
-
|
45
|
-
|
40
|
+
def self.finish
|
41
|
+
draw = Renderer.instance.draw
|
42
|
+
image = Renderer.instance.image
|
46
43
|
|
47
|
-
|
48
|
-
Renderer.instance.image.write(file_name)
|
49
|
-
end
|
44
|
+
draw.draw(image)
|
50
45
|
|
51
|
-
|
52
|
-
|
53
|
-
self.format = file_format
|
54
|
-
end
|
46
|
+
Renderer.instance.text_renderers.each do |renderer|
|
47
|
+
renderer.render(renderer.width, renderer.height, renderer.x, renderer.y, renderer.gravity)
|
55
48
|
end
|
56
49
|
end
|
57
50
|
|
58
51
|
def background(columns, rows, scale, theme_options)
|
59
52
|
case theme_options[:background_colors]
|
60
53
|
when Array
|
61
|
-
gradated_background(columns, rows, theme_options[:background_colors][0
|
54
|
+
gradated_background(columns, rows, *theme_options[:background_colors][0..1], theme_options[:background_direction])
|
62
55
|
when String
|
63
56
|
solid_background(columns, rows, theme_options[:background_colors])
|
64
57
|
else
|
@@ -102,7 +95,7 @@ module Gruff
|
|
102
95
|
|
103
96
|
if @gradated_background_retry_count < 3
|
104
97
|
@gradated_background_retry_count += 1
|
105
|
-
gradated_background(top_color, bottom_color, direct)
|
98
|
+
gradated_background(columns, rows, top_color, bottom_color, direct)
|
106
99
|
else
|
107
100
|
raise e
|
108
101
|
end
|
data/lib/gruff/renderer/text.rb
CHANGED
@@ -1,14 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gruff
|
4
|
+
# @private
|
4
5
|
class Renderer::Text
|
5
|
-
|
6
|
+
using Magick::GruffAnnotate
|
7
|
+
|
8
|
+
def initialize(text, font:, size:, color:, weight: Magick::NormalWeight, rotation: nil)
|
6
9
|
@text = text.to_s
|
7
|
-
@font =
|
8
|
-
@font_size =
|
9
|
-
@font_color =
|
10
|
-
@font_weight =
|
11
|
-
@rotation =
|
10
|
+
@font = font
|
11
|
+
@font_size = size
|
12
|
+
@font_color = color
|
13
|
+
@font_weight = weight
|
14
|
+
@rotation = rotation
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :width, :height, :x, :y, :gravity
|
18
|
+
|
19
|
+
def add_to_render_queue(width, height, x, y, gravity = Magick::NorthGravity)
|
20
|
+
@width = width
|
21
|
+
@height = height
|
22
|
+
@x = x
|
23
|
+
@y = y
|
24
|
+
@gravity = gravity
|
25
|
+
|
26
|
+
Renderer.instance.text_renderers << self
|
12
27
|
end
|
13
28
|
|
14
29
|
def render(width, height, x, y, gravity = Magick::NorthGravity)
|
@@ -36,7 +51,14 @@ module Gruff
|
|
36
51
|
|
37
52
|
draw.font_weight = font_weight
|
38
53
|
draw.pointsize = size
|
39
|
-
|
54
|
+
|
55
|
+
# The old ImageMagick causes SEGV with string which has '%' + alphabet (eg. '%S').
|
56
|
+
# This format is used to embed value into a string using image properties.
|
57
|
+
# However, gruff use plain image as canvas which does not have any property.
|
58
|
+
# So, in here, it just escape % in order to avoid SEGV.
|
59
|
+
text = text.to_s.gsub(/(%+)/) { ('%' * Regexp.last_match(1).size * 2).to_s }
|
60
|
+
|
61
|
+
draw.get_type_metrics(image, text)
|
40
62
|
end
|
41
63
|
end
|
42
64
|
end
|
data/lib/gruff/scatter.rb
CHANGED
@@ -1,44 +1,48 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
# Here's how to set up an XY Scatter Chart
|
3
|
+
#
|
4
|
+
# Here's how to set up a Gruff::Scatter.
|
6
5
|
#
|
7
6
|
# g = Gruff::Scatter.new(800)
|
8
|
-
# g.data
|
9
|
-
# g.data
|
10
|
-
# g.write('
|
7
|
+
# g.data :apples, [1,2,3,4], [4,3,2,1]
|
8
|
+
# g.data 'oranges', [5,7,8], [4,1,7]
|
9
|
+
# g.write('scatter.png')
|
11
10
|
#
|
12
11
|
class Gruff::Scatter < Gruff::Base
|
13
12
|
# Maximum X Value. The value will get overwritten by the max in the
|
14
13
|
# datasets.
|
15
|
-
|
14
|
+
attr_writer :maximum_x_value
|
16
15
|
|
17
16
|
# Minimum X Value. The value will get overwritten by the min in the
|
18
17
|
# datasets.
|
19
|
-
|
18
|
+
attr_writer :minimum_x_value
|
20
19
|
|
21
20
|
# The number of vertical lines shown for reference.
|
22
|
-
|
21
|
+
attr_writer :marker_x_count
|
23
22
|
|
24
23
|
# Attributes to allow customising the size of the points.
|
25
|
-
|
26
|
-
|
24
|
+
attr_writer :circle_radius
|
25
|
+
attr_writer :stroke_width
|
27
26
|
|
28
27
|
# Allow disabling the significant rounding when labeling the X axis.
|
29
28
|
# This is useful when working with a small range of high values (for example, a date range of months, while seconds as units).
|
30
|
-
|
29
|
+
attr_writer :disable_significant_rounding_x_axis
|
31
30
|
|
32
31
|
# Allow enabling vertical lines. When you have a lot of data, they can work great.
|
33
|
-
|
32
|
+
attr_writer :enable_vertical_line_markers
|
34
33
|
|
35
34
|
# Allow using vertical labels in the X axis (and setting the label margin).
|
36
|
-
|
37
|
-
|
35
|
+
attr_writer :x_label_margin
|
36
|
+
attr_writer :use_vertical_x_labels
|
38
37
|
|
39
38
|
# Allow passing lambdas to format labels.
|
40
|
-
|
41
|
-
|
39
|
+
attr_writer :y_axis_label_format
|
40
|
+
attr_writer :x_axis_label_format
|
41
|
+
|
42
|
+
def initialize_store
|
43
|
+
@store = Gruff::Store.new(Gruff::Store::XYData)
|
44
|
+
end
|
45
|
+
private :initialize_store
|
42
46
|
|
43
47
|
def initialize_ivars
|
44
48
|
super
|
@@ -55,8 +59,6 @@ class Gruff::Scatter < Gruff::Base
|
|
55
59
|
@x_axis_label_format = nil
|
56
60
|
@x_label_margin = nil
|
57
61
|
@y_axis_label_format = nil
|
58
|
-
|
59
|
-
@store = Gruff::Store.new(Gruff::Store::XYData)
|
60
62
|
end
|
61
63
|
private :initialize_ivars
|
62
64
|
|
@@ -80,8 +82,6 @@ class Gruff::Scatter < Gruff::Base
|
|
80
82
|
Gruff::Renderer::Circle.new(color: data_row.color, width: stroke_width).render(new_x, new_y, new_x - circle_radius, new_y)
|
81
83
|
end
|
82
84
|
end
|
83
|
-
|
84
|
-
Gruff::Renderer.finish
|
85
85
|
end
|
86
86
|
|
87
87
|
# The first parameter is the name of the dataset. The next two are the
|
@@ -191,7 +191,7 @@ private
|
|
191
191
|
calculate_spread
|
192
192
|
normalize
|
193
193
|
|
194
|
-
|
194
|
+
self.marker_count = (@x_spread / @x_axis_increment).to_i
|
195
195
|
@x_increment = @x_axis_increment
|
196
196
|
end
|
197
197
|
increment_x_scaled = @graph_width.to_f / (@x_spread / @x_increment)
|
@@ -201,7 +201,9 @@ private
|
|
201
201
|
# TODO: Fix the vertical lines, and enable them by default. Not pretty when they don't match up with top y-axis line
|
202
202
|
if @enable_vertical_line_markers
|
203
203
|
x = @graph_left + @graph_width - index.to_f * increment_x_scaled
|
204
|
-
|
204
|
+
|
205
|
+
line_renderer = Gruff::Renderer::Line.new(color: @marker_color, shadow_color: @marker_shadow_color)
|
206
|
+
line_renderer.render(x, @graph_top, x, @graph_bottom)
|
205
207
|
end
|
206
208
|
|
207
209
|
unless @hide_line_numbers
|
@@ -212,7 +214,7 @@ private
|
|
212
214
|
label = vertical_label(marker_label, @x_increment)
|
213
215
|
rotation = -90.0 if @use_vertical_x_labels
|
214
216
|
text_renderer = Gruff::Renderer::Text.new(label, font: @font, size: @marker_font_size, color: @font_color, rotation: rotation)
|
215
|
-
text_renderer.
|
217
|
+
text_renderer.add_to_render_queue(1.0, 1.0, x_offset, y_offset)
|
216
218
|
end
|
217
219
|
end
|
218
220
|
end
|
data/lib/gruff/scene.rb
CHANGED
data/lib/gruff/side_bar.rb
CHANGED
@@ -1,27 +1,50 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'gruff/base'
|
4
|
-
|
5
3
|
# Graph with individual horizontal bars instead of vertical bars.
|
4
|
+
#
|
5
|
+
# Here's how to set up a Gruff::SideBar.
|
6
|
+
#
|
7
|
+
# g = Gruff::SideBar.new
|
8
|
+
# g.title = 'SideBar Graph'
|
9
|
+
# g.labels = {
|
10
|
+
# 0 => '5/6',
|
11
|
+
# 1 => '5/15',
|
12
|
+
# 2 => '5/24',
|
13
|
+
# 3 => '5/30',
|
14
|
+
# }
|
15
|
+
# g.group_spacing = 20
|
16
|
+
# g.data :Art, [0, 5, 8, 15]
|
17
|
+
# g.data :Philosophy, [10, 3, 2, 8]
|
18
|
+
# g.data :Science, [2, 15, 8, 11]
|
19
|
+
# g.write('sidebar.png')
|
20
|
+
#
|
6
21
|
class Gruff::SideBar < Gruff::Base
|
22
|
+
using String::GruffCommify
|
23
|
+
|
7
24
|
# Spacing factor applied between bars.
|
8
|
-
|
25
|
+
attr_writer :bar_spacing
|
9
26
|
|
10
27
|
# Spacing factor applied between a group of bars belonging to the same label.
|
11
|
-
|
28
|
+
attr_writer :group_spacing
|
12
29
|
|
13
30
|
# Set the number output format for labels using sprintf.
|
14
31
|
# Default is +"%.2f"+.
|
15
|
-
|
32
|
+
attr_writer :label_formatting
|
16
33
|
|
17
34
|
# Output the values for the bars on a bar graph.
|
18
35
|
# Default is +false+.
|
19
|
-
|
36
|
+
attr_writer :show_labels_for_bar_values
|
37
|
+
|
38
|
+
# Prevent drawing of column labels left of a side bar graph. Default is +false+.
|
39
|
+
attr_writer :hide_labels
|
20
40
|
|
21
41
|
def initialize_ivars
|
22
42
|
super
|
43
|
+
@bar_spacing = 0.9
|
44
|
+
@group_spacing = 10
|
23
45
|
@label_formatting = nil
|
24
46
|
@show_labels_for_bar_values = false
|
47
|
+
@hide_labels = false
|
25
48
|
end
|
26
49
|
private :initialize_ivars
|
27
50
|
|
@@ -34,14 +57,25 @@ class Gruff::SideBar < Gruff::Base
|
|
34
57
|
draw_bars
|
35
58
|
end
|
36
59
|
|
60
|
+
protected
|
61
|
+
|
62
|
+
def hide_labels?
|
63
|
+
@hide_labels
|
64
|
+
end
|
65
|
+
|
66
|
+
def hide_left_label_area?
|
67
|
+
hide_labels?
|
68
|
+
end
|
69
|
+
|
70
|
+
def hide_bottom_label_area?
|
71
|
+
@hide_line_markers
|
72
|
+
end
|
73
|
+
|
37
74
|
private
|
38
75
|
|
39
76
|
def draw_bars
|
40
77
|
# Setup spacing.
|
41
78
|
#
|
42
|
-
@bar_spacing ||= 0.9
|
43
|
-
@group_spacing ||= 10
|
44
|
-
|
45
79
|
bars_width = (@graph_height - calculate_spacing) / column_count.to_f
|
46
80
|
bar_width = bars_width / store.length
|
47
81
|
height = Array.new(column_count, 0)
|
@@ -57,7 +91,7 @@ private
|
|
57
91
|
data_row.points.each_with_index do |data_point, point_index|
|
58
92
|
group_spacing = @group_spacing * @scale * point_index
|
59
93
|
|
60
|
-
# Using the original
|
94
|
+
# Using the original calculations from the stacked bar chart
|
61
95
|
# to get the difference between
|
62
96
|
# part of the bart chart we wish to stack.
|
63
97
|
temp1 = @graph_left + (@graph_width - data_point * @graph_width - height[point_index])
|
@@ -89,8 +123,6 @@ private
|
|
89
123
|
end
|
90
124
|
end
|
91
125
|
end
|
92
|
-
|
93
|
-
Gruff::Renderer.finish
|
94
126
|
end
|
95
127
|
|
96
128
|
# Instead of base class version, draws vertical background lines and label
|
@@ -98,7 +130,7 @@ private
|
|
98
130
|
return if @hide_line_markers
|
99
131
|
|
100
132
|
# Draw horizontal line markers and annotate with numbers
|
101
|
-
number_of_lines =
|
133
|
+
number_of_lines = marker_count
|
102
134
|
number_of_lines = 1 if number_of_lines == 0
|
103
135
|
|
104
136
|
# TODO: Round maximum marker value to a round number like 100, 0.1, 0.5, etc.
|
@@ -106,13 +138,16 @@ private
|
|
106
138
|
(0..number_of_lines).each do |index|
|
107
139
|
line_diff = (@graph_right - @graph_left) / number_of_lines
|
108
140
|
x = @graph_right - (line_diff * index) - 1
|
109
|
-
|
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)
|
144
|
+
|
110
145
|
diff = index - number_of_lines
|
111
146
|
marker_label = diff.abs * increment + minimum_value
|
112
147
|
|
113
148
|
unless @hide_line_numbers
|
114
149
|
text_renderer = Gruff::Renderer::Text.new(marker_label, font: @font, size: @marker_font_size, color: @font_color)
|
115
|
-
text_renderer.
|
150
|
+
text_renderer.add_to_render_queue(0, 0, x, @graph_bottom + LABEL_MARGIN, Magick::CenterGravity)
|
116
151
|
end
|
117
152
|
end
|
118
153
|
end
|
@@ -125,11 +160,7 @@ private
|
|
125
160
|
lbl = @use_data_label ? label : @labels[index]
|
126
161
|
|
127
162
|
text_renderer = Gruff::Renderer::Text.new(lbl, font: @font, size: @marker_font_size, color: @font_color)
|
128
|
-
|
129
|
-
text_renderer.render(1, 1, @graph_left - LABEL_MARGIN * 2.0, y_offset, Magick::EastGravity)
|
130
|
-
else
|
131
|
-
text_renderer.render(1, 1, -@graph_left + LABEL_MARGIN * 2.0, y_offset, Magick::EastGravity)
|
132
|
-
end
|
163
|
+
text_renderer.add_to_render_queue(@graph_left - LABEL_MARGIN, 1.0, 0.0, y_offset, Magick::EastGravity)
|
133
164
|
end
|
134
165
|
end
|
135
166
|
|