gruff 0.15.0-java → 0.16.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.
@@ -3,17 +3,18 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::DashLine
6
- def initialize(renderer, color:, width:)
6
+ def initialize(renderer, color:, width:, dasharray: [10, 20])
7
7
  @renderer = renderer
8
8
  @color = color
9
9
  @width = width
10
+ @dasharray = dasharray
10
11
  end
11
12
 
12
13
  def render(start_x, start_y, end_x, end_y)
13
14
  @renderer.draw.push
14
15
  @renderer.draw.stroke_color(@color)
15
16
  @renderer.draw.fill_opacity(0.0)
16
- @renderer.draw.stroke_dasharray(10, 20)
17
+ @renderer.draw.stroke_dasharray(*@dasharray)
17
18
  @renderer.draw.stroke_width(@width)
18
19
  @renderer.draw.line(start_x, start_y, end_x, end_y)
19
20
  @renderer.draw.pop
@@ -3,11 +3,12 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Dot
6
- def initialize(renderer, style, color:, width: 1.0)
6
+ def initialize(renderer, style, color:, width: 1.0, opacity: 1.0)
7
7
  @renderer = renderer
8
8
  @style = style
9
9
  @color = color
10
10
  @width = width
11
+ @opacity = opacity
11
12
  end
12
13
 
13
14
  def render(new_x, new_y, circle_radius)
@@ -15,6 +16,7 @@ module Gruff
15
16
  @renderer.draw.stroke_width(@width)
16
17
  @renderer.draw.stroke(@color)
17
18
  @renderer.draw.fill(@color)
19
+ @renderer.draw.fill_opacity(@opacity)
18
20
  if @style.to_s == 'square'
19
21
  square(new_x, new_y, circle_radius)
20
22
  else
@@ -5,16 +5,14 @@ module Gruff
5
5
  class Renderer::Line
6
6
  EPSILON = 0.001
7
7
 
8
- def initialize(renderer, color:, width: nil, shadow_color: nil)
8
+ def initialize(renderer, color:, width: nil)
9
9
  @renderer = renderer
10
10
  @color = color
11
11
  @width = width
12
- @shadow_color = shadow_color
13
12
  end
14
13
 
15
14
  def render(start_x, start_y, end_x, end_y)
16
15
  render_line(start_x, start_y, end_x, end_y, @color)
17
- render_line(start_x, start_y + 1, end_x, end_y + 1, @shadow_color) if @shadow_color
18
16
  end
19
17
 
20
18
  private
@@ -3,14 +3,18 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Rectangle
6
- def initialize(renderer, color: nil)
6
+ def initialize(renderer, color: nil, width: 1.0, opacity: 1.0)
7
7
  @renderer = renderer
8
8
  @color = color
9
+ @width = width
10
+ @opacity = opacity
9
11
  end
10
12
 
11
13
  def render(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
12
14
  @renderer.draw.push
13
- @renderer.draw.stroke('transparent')
15
+ @renderer.draw.stroke_width(@width)
16
+ @renderer.draw.stroke(@color) if @width > 1.0
17
+ @renderer.draw.fill_opacity(@opacity)
14
18
  @renderer.draw.fill(@color) if @color
15
19
  @renderer.draw.rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
16
20
  @renderer.draw.pop
data/lib/gruff/scatter.rb CHANGED
@@ -115,15 +115,12 @@ private
115
115
  end
116
116
 
117
117
  def draw_graph
118
- # Check to see if more than one datapoint was given. NaN can result otherwise.
119
- @x_increment = @x_spread > 1 ? (@graph_width / (@x_spread - 1).to_f) : @graph_width
120
-
121
118
  store.norm_data.each do |data_row|
122
119
  data_row.coordinates.each do |x_value, y_value|
123
120
  next if y_value.nil? || x_value.nil?
124
121
 
125
122
  new_x = get_x_coord(x_value, @graph_width, @graph_left)
126
- new_y = @graph_top + (@graph_height - y_value * @graph_height)
123
+ new_y = @graph_top + (@graph_height - (y_value * @graph_height))
127
124
 
128
125
  # Reset each time to avoid thin-line errors
129
126
  stroke_width = @stroke_width || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4), 5.0)
@@ -134,17 +131,19 @@ private
134
131
  end
135
132
 
136
133
  def setup_data
137
- # Update the global min/max values for the x data
138
- @maximum_x_value ||= store.max_x
139
- @minimum_x_value ||= store.min_x
140
-
141
- super
142
- end
143
-
144
- def setup_drawing
145
134
  # TODO: Need to get x-axis labels working. Current behavior will be to not allow.
146
135
  @labels = {}
147
136
 
137
+ # Update the global min/max values for the x data
138
+ @maximum_x_value = (@maximum_x_value || store.max_x).to_f
139
+ @minimum_x_value = (@minimum_x_value || store.min_x).to_f
140
+
141
+ if @x_axis_increment
142
+ # TODO: Make this work for negative values
143
+ @maximum_x_value = [@maximum_x_value.ceil, @x_axis_increment.to_f].max
144
+ @minimum_x_value = @minimum_x_value.floor
145
+ end
146
+
148
147
  super
149
148
  end
150
149
 
@@ -165,49 +164,24 @@ private
165
164
  super
166
165
  return if @hide_line_markers
167
166
 
168
- if @x_axis_increment.nil?
169
- # TODO: Do the same for larger numbers...100, 75, 50, 25
170
- if @marker_x_count.nil?
171
- (3..7).each do |lines|
172
- if @x_spread % lines == 0.0
173
- @marker_x_count = lines
174
- break
175
- end
176
- end
177
- @marker_x_count ||= 4
178
- end
179
- @x_increment = @x_spread > 0 ? (@x_spread / @marker_x_count) : 1
180
- unless @disable_significant_rounding_x_axis
181
- @x_increment = significant(@x_increment)
182
- end
183
- else
184
- # TODO: Make this work for negative values
185
- @maximum_x_value = [@maximum_x_value.ceil, @x_axis_increment].max
186
- @minimum_x_value = @minimum_x_value.floor
187
- calculate_spread
188
- normalize
189
-
190
- @marker_x_count = (@x_spread / @x_axis_increment).to_i
191
- @x_increment = @x_axis_increment
192
- end
193
- increment_x_scaled = @graph_width.to_f / (@x_spread / @x_increment)
167
+ increment_x_scaled = @graph_width / (@x_spread / x_increment)
194
168
 
195
169
  # Draw vertical line markers and annotate with numbers
196
- (0..@marker_x_count).each do |index|
170
+ (0..marker_x_count).each do |index|
197
171
  # TODO: Fix the vertical lines, and enable them by default. Not pretty when they don't match up with top y-axis line
198
172
  if @show_vertical_markers
199
- x = @graph_left + @graph_width - index.to_f * increment_x_scaled
173
+ x = @graph_left + @graph_width - (index * increment_x_scaled)
200
174
 
201
- line_renderer = Gruff::Renderer::Line.new(renderer, color: @marker_color, shadow_color: @marker_shadow_color)
202
- line_renderer.render(x, @graph_top, x, @graph_bottom)
175
+ Gruff::Renderer::Line.new(renderer, color: @marker_color).render(x, @graph_top, x, @graph_bottom)
176
+ Gruff::Renderer::Line.new(renderer, color: @marker_shadow_color).render(x, @graph_top + 1, x, @graph_bottom + 1) if @marker_shadow_color
203
177
  end
204
178
 
205
179
  unless @hide_line_numbers
206
- marker_label = BigDecimal(index.to_s) * BigDecimal(@x_increment.to_s) + BigDecimal(@minimum_x_value.to_s)
180
+ marker_label = (BigDecimal(index.to_s) * BigDecimal(x_increment.to_s)) + BigDecimal(@minimum_x_value.to_s)
207
181
  y_offset = @graph_bottom + (@x_label_margin || LABEL_MARGIN)
208
- x_offset = get_x_coord(index.to_f, increment_x_scaled, @graph_left)
182
+ x_offset = get_x_coord(index, increment_x_scaled, @graph_left)
209
183
 
210
- label = x_axis_label(marker_label, @x_increment)
184
+ label = x_axis_label(marker_label, x_increment)
211
185
  rotation = -90.0 if @use_vertical_x_labels
212
186
  text_renderer = Gruff::Renderer::Text.new(renderer, label, font: @marker_font, rotation: rotation)
213
187
  text_renderer.add_to_render_queue(1.0, 1.0, x_offset, y_offset)
@@ -216,6 +190,38 @@ private
216
190
  end
217
191
 
218
192
  def get_x_coord(x_data_point, width, offset)
219
- x_data_point * width + offset
193
+ (x_data_point * width) + offset
194
+ end
195
+
196
+ def marker_x_count
197
+ # TODO: Do the same for larger numbers...100, 75, 50, 25
198
+ @marker_x_count ||= begin
199
+ if @x_axis_increment.nil?
200
+ count = nil
201
+ (3..7).each do |lines|
202
+ if @x_spread % lines == 0.0
203
+ count = lines and break
204
+ end
205
+ end
206
+ count || 4
207
+ else
208
+ (@x_spread / @x_axis_increment).to_i
209
+ end
210
+ end
211
+ end
212
+
213
+ def x_increment
214
+ @x_increment ||= begin
215
+ if @x_axis_increment.nil?
216
+ increment = @x_spread > 0 ? (@x_spread / marker_x_count) : 1
217
+ unless @disable_significant_rounding_x_axis
218
+ increment = significant(increment)
219
+ end
220
+ else
221
+ increment = @x_axis_increment
222
+ end
223
+
224
+ increment
225
+ end
220
226
  end
221
227
  end
@@ -36,6 +36,15 @@ class Gruff::SideBar < Gruff::Base
36
36
  # Prevent drawing of column labels left of a side bar graph. Default is +false+.
37
37
  attr_writer :hide_labels
38
38
 
39
+ # Value to avoid completely overwriting the coordinate axis
40
+ AXIS_MARGIN = 0.5
41
+ private_constant :AXIS_MARGIN
42
+
43
+ def initialize(*)
44
+ super
45
+ @has_left_labels = true
46
+ end
47
+
39
48
  # With Side Bars use the data label for the marker value to the left of the bar.
40
49
  # @deprecated
41
50
  def use_data_label=(_value)
@@ -51,7 +60,6 @@ private
51
60
  @label_formatting = nil
52
61
  @show_labels_for_bar_values = false
53
62
  @hide_labels = false
54
- @has_left_labels = true
55
63
  end
56
64
 
57
65
  def hide_labels?
@@ -59,20 +67,39 @@ private
59
67
  end
60
68
 
61
69
  def hide_left_label_area?
62
- hide_labels?
70
+ hide_labels? && @y_axis_label.nil?
63
71
  end
64
72
 
65
73
  def hide_bottom_label_area?
66
- @hide_line_markers
74
+ @hide_line_markers && @x_axis_label.nil? && @legend_at_bottom == false
67
75
  end
68
76
 
69
- # Value to avoid completely overwriting the coordinate axis
70
- AXIS_MARGIN = 0.5
77
+ def setup_graph_measurements
78
+ super
79
+ return if @hide_line_markers
80
+
81
+ if @show_labels_for_bar_values
82
+ proc_text_metrics = ->(text) { text_metrics(@marker_font, text) }
83
+
84
+ if maximum_value >= 0
85
+ _, metrics = Gruff::BarValueLabel.metrics(maximum_value, @label_formatting, proc_text_metrics)
86
+ @graph_right -= metrics.width
87
+ end
88
+
89
+ if minimum_value < 0
90
+ _, metrics = Gruff::BarValueLabel.metrics(minimum_value, @label_formatting, proc_text_metrics)
91
+ width = metrics.width + LABEL_MARGIN
92
+ @graph_left += width - @graph_left if width > @graph_left
93
+ end
94
+
95
+ @graph_width = @graph_right - @graph_left
96
+ end
97
+ end
71
98
 
72
99
  def draw_graph
73
100
  # Setup spacing.
74
101
  #
75
- bars_width = (@graph_height - calculate_spacing) / column_count.to_f
102
+ bars_width = (@graph_height - calculate_spacing) / column_count
76
103
  bar_width = bars_width / store.length
77
104
  padding = (bar_width * (1 - @bar_spacing)) / 2
78
105
 
@@ -82,12 +109,14 @@ private
82
109
  minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
83
110
  )
84
111
 
112
+ proc_text_metrics = ->(text) { text_metrics(@marker_font, text) }
113
+
85
114
  store.norm_data.each_with_index do |data_row, row_index|
86
115
  data_row.points.each_with_index do |data_point, point_index|
87
116
  group_spacing = @group_spacing * @scale * point_index
88
117
 
89
118
  left_y = @graph_top + (bars_width * point_index) + (bar_width * row_index) + padding + group_spacing
90
- right_y = left_y + bar_width * @bar_spacing
119
+ right_y = left_y + (bar_width * @bar_spacing)
91
120
 
92
121
  left_x, right_x = conversion.get_top_bottom_scaled(data_point).sort
93
122
 
@@ -95,14 +124,14 @@ private
95
124
  rect_renderer.render(left_x + AXIS_MARGIN, left_y, right_x + AXIS_MARGIN, right_y)
96
125
 
97
126
  # Calculate center based on bar_width and current row
98
- label_center = left_y + bars_width / 2
127
+ label_center = left_y + (bars_width / 2.0)
99
128
 
100
129
  # Subtract half a bar width to center left if requested
101
130
  draw_label(label_center, point_index)
102
131
  if @show_labels_for_bar_values
103
132
  bar_value_label = Gruff::BarValueLabel::SideBar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
104
- bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
105
- draw_value_label(x, y, text)
133
+ bar_value_label.prepare_rendering(@label_formatting, proc_text_metrics) do |x, y, text, text_width, _text_height|
134
+ draw_value_label(text_width, bar_width * @bar_spacing, x, y, text)
106
135
  end
107
136
  end
108
137
  end
@@ -118,17 +147,17 @@ private
118
147
  number_of_lines = 1 if number_of_lines == 0
119
148
 
120
149
  # TODO: Round maximum marker value to a round number like 100, 0.1, 0.5, etc.
121
- increment = significant(@spread.to_f / number_of_lines)
150
+ increment = significant(@spread / number_of_lines)
122
151
  (0..number_of_lines).each do |index|
123
152
  line_diff = (@graph_right - @graph_left) / number_of_lines
124
153
  x = @graph_right - (line_diff * index) - 1
125
154
 
126
- line_renderer = Gruff::Renderer::Line.new(renderer, color: @marker_color, shadow_color: @marker_shadow_color)
127
- line_renderer.render(x, @graph_bottom, x, @graph_top)
155
+ Gruff::Renderer::Line.new(renderer, color: @marker_color).render(x, @graph_bottom, x, @graph_top)
156
+ Gruff::Renderer::Line.new(renderer, color: @marker_shadow_color).render(x, @graph_bottom + 1, x, @graph_top + 1) if @marker_shadow_color
128
157
 
129
158
  unless @hide_line_numbers
130
159
  diff = index - number_of_lines
131
- marker_label = BigDecimal(diff.abs.to_s) * BigDecimal(increment.to_s) + BigDecimal(minimum_value.to_s)
160
+ marker_label = (BigDecimal(diff.abs.to_s) * BigDecimal(increment.to_s)) + BigDecimal(minimum_value.to_s)
132
161
  label = x_axis_label(marker_label, @increment)
133
162
  text_renderer = Gruff::Renderer::Text.new(renderer, label, font: @marker_font)
134
163
  text_renderer.add_to_render_queue(0, 0, x, @graph_bottom + LABEL_MARGIN, Magick::CenterGravity)
@@ -39,6 +39,11 @@ class Gruff::SideStackedBar < Gruff::SideBar
39
39
  # Prevent drawing of column labels left of a side stacked bar graph. Default is +false+.
40
40
  attr_writer :hide_labels
41
41
 
42
+ def initialize(*)
43
+ super
44
+ @has_left_labels = true
45
+ end
46
+
42
47
  private
43
48
 
44
49
  def initialize_attributes
@@ -48,7 +53,7 @@ private
48
53
  @label_formatting = nil
49
54
  @show_labels_for_bar_values = false
50
55
  @hide_labels = false
51
- @has_left_labels = true
56
+ @minimum_value = 0.0
52
57
  end
53
58
 
54
59
  def setup_data
@@ -56,48 +61,35 @@ private
56
61
  super
57
62
  end
58
63
 
59
- def hide_labels?
60
- @hide_labels
61
- end
62
-
63
- def hide_left_label_area?
64
- hide_labels?
65
- end
66
-
67
- def hide_bottom_label_area?
68
- @hide_line_markers
69
- end
70
-
71
64
  def draw_graph
72
65
  # Setup spacing.
73
66
  #
74
67
  # Columns sit stacked.
75
- bar_width = @graph_height / column_count.to_f
68
+ bar_width = @graph_height / column_count
76
69
  height = Array.new(column_count, 0)
77
70
  length = Array.new(column_count, @graph_left)
78
71
  padding = (bar_width * (1 - @bar_spacing)) / 2
79
- stack_bar_value_label = Gruff::BarValueLabel::StackedBar.new
72
+ stack_bar_value_labels = Gruff::BarValueLabel::StackedBar.new
80
73
 
81
74
  store.norm_data.each_with_index do |data_row, row_index|
82
75
  data_row.points.each_with_index do |data_point, point_index|
83
76
  ## using the original calculations from the stacked bar chart to get the difference between
84
77
  ## part of the bart chart we wish to stack.
85
- temp1 = @graph_left + (@graph_width -
86
- data_point * @graph_width -
87
- height[point_index]) + 1
88
- temp2 = @graph_left + @graph_width - height[point_index] - 1
78
+ temp1 = @graph_left + (@graph_width - (data_point * @graph_width) - height[point_index])
79
+ temp2 = @graph_left + @graph_width - height[point_index]
89
80
  difference = temp2 - temp1
90
- difference = 0 if row_index == 0 && difference < 0
81
+ difference = 0 if difference < 0
91
82
 
92
83
  left_x = length[point_index]
93
84
  left_y = @graph_top + (bar_width * point_index) + padding
94
- right_x = left_x + difference - @segment_spacing
95
- right_y = left_y + bar_width * @bar_spacing
85
+ right_x = left_x + difference
86
+ right_x -= @segment_spacing if row_index != store.columns - 1
87
+ right_y = left_y + (bar_width * @bar_spacing)
96
88
  length[point_index] += difference
97
- height[point_index] += (data_point * @graph_width - 2)
89
+ height[point_index] += (data_point * @graph_width)
98
90
 
99
91
  bar_value_label = Gruff::BarValueLabel::SideBar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
100
- stack_bar_value_label.add(bar_value_label, point_index)
92
+ stack_bar_value_labels.add(bar_value_label, point_index)
101
93
 
102
94
  # if a data point is 0 it can result in weird really thing lines
103
95
  # that shouldn't even be there being drawn on top of the existing
@@ -109,14 +101,15 @@ private
109
101
  end
110
102
  # we still need to draw the labels
111
103
  # Calculate center based on bar_width and current row
112
- label_center = left_y + bar_width / 2
104
+ label_center = left_y + (bar_width / 2.0)
113
105
  draw_label(label_center, point_index)
114
106
  end
115
107
  end
116
108
 
117
109
  if @show_labels_for_bar_values
118
- stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
119
- draw_value_label(x, y, text)
110
+ proc_text_metrics = ->(text) { text_metrics(@marker_font, text) }
111
+ stack_bar_value_labels.prepare_rendering(@label_formatting, proc_text_metrics) do |x, y, text, text_width, _text_height|
112
+ draw_value_label(text_width, bar_width * @bar_spacing, x, y, text)
120
113
  end
121
114
  end
122
115
  end
data/lib/gruff/spider.rb CHANGED
@@ -19,6 +19,11 @@ class Gruff::Spider < Gruff::Base
19
19
  attr_writer :hide_axes
20
20
  attr_writer :rotation
21
21
 
22
+ def initialize(max_value, target_width = 800)
23
+ super(target_width)
24
+ @max_value = max_value
25
+ end
26
+
22
27
  def transparent_background=(value)
23
28
  renderer.transparent_background(@columns, @rows) if value
24
29
  end
@@ -27,11 +32,6 @@ class Gruff::Spider < Gruff::Base
27
32
  @hide_title = @hide_text = value
28
33
  end
29
34
 
30
- def initialize(max_value, target_width = 800)
31
- super(target_width)
32
- @max_value = max_value
33
- end
34
-
35
35
  private
36
36
 
37
37
  def initialize_attributes
@@ -46,6 +46,24 @@ private
46
46
  @hide_line_markers.freeze
47
47
  end
48
48
 
49
+ def setup_graph_measurements
50
+ super
51
+
52
+ @graph_left += LABEL_MARGIN
53
+ @graph_top += LABEL_MARGIN
54
+ @graph_right -= LABEL_MARGIN
55
+ @graph_bottom -= LABEL_MARGIN
56
+
57
+ @graph_width = @graph_right - @graph_left
58
+ @graph_height = @graph_bottom - @graph_top
59
+ end
60
+
61
+ def setup_data
62
+ raise(Gruff::IncorrectNumberOfDatasetsException, 'Requires 3 or more data sets') if store.length < 3
63
+
64
+ super
65
+ end
66
+
49
67
  def draw_graph
50
68
  # Setup basic positioning
51
69
  radius = @graph_height / 2.0
@@ -68,19 +86,34 @@ private
68
86
  end
69
87
 
70
88
  def draw_label(center_x, center_y, angle, radius, amount)
71
- r_offset = 50 # The distance out from the center of the pie to get point
72
- x_offset = center_x # The label points need to be tweaked slightly
73
- y_offset = center_y + 0 # This one doesn't though
89
+ degree = rad2deg(angle)
90
+ metrics = text_metrics(@marker_font, amount)
91
+
92
+ r_offset = LABEL_MARGIN # The distance out from the center of the pie to get point
93
+ x_offset = center_x # The label points need to be tweaked slightly
94
+
95
+ x_offset -= begin
96
+ case degree
97
+ when 0..45, 315..360
98
+ 0
99
+ when 135..225
100
+ metrics.width
101
+ else
102
+ metrics.width / 2
103
+ end
104
+ end
105
+
106
+ y_offset = center_y - (metrics.height / 2.0) # This one doesn't though
74
107
  x = x_offset + ((radius + r_offset) * Math.cos(angle))
75
108
  y = y_offset + ((radius + r_offset) * Math.sin(angle))
76
109
 
77
- draw_label_at(1.0, 1.0, x, y, amount, Magick::CenterGravity)
110
+ draw_label_at(metrics.width, metrics.height, x, y, amount, Magick::CenterGravity)
78
111
  end
79
112
 
80
113
  def draw_axes(center_x, center_y, radius, additive_angle, line_color = nil)
81
114
  return if @hide_axes
82
115
 
83
- current_angle = @rotation * Math::PI / 180.0
116
+ current_angle = deg2rad(@rotation)
84
117
 
85
118
  store.data.each do |data_row|
86
119
  x_offset = radius * Math.cos(current_angle)
@@ -97,11 +130,11 @@ private
97
130
 
98
131
  def draw_polygon(center_x, center_y, additive_angle, color = nil)
99
132
  points = []
100
- current_angle = @rotation * Math::PI / 180.0
133
+ current_angle = deg2rad(@rotation)
101
134
 
102
135
  store.data.each do |data_row|
103
- points << center_x + normalize_points(data_row.points.first) * Math.cos(current_angle)
104
- points << center_y + normalize_points(data_row.points.first) * Math.sin(current_angle)
136
+ points << (center_x + (normalize_points(data_row.points.first) * Math.cos(current_angle)))
137
+ points << (center_y + (normalize_points(data_row.points.first) * Math.sin(current_angle)))
105
138
  current_angle += additive_angle
106
139
  end
107
140
 
@@ -20,13 +20,18 @@ class Gruff::StackedArea < Gruff::Base
20
20
 
21
21
  private
22
22
 
23
+ def initialize_attributes
24
+ super
25
+ @minimum_value = 0.0
26
+ end
27
+
23
28
  def setup_data
24
29
  calculate_maximum_by_stack
25
30
  super
26
31
  end
27
32
 
28
33
  def draw_graph
29
- x_increment = @graph_width / (column_count - 1).to_f
34
+ x_increment = @graph_width / (column_count - 1)
30
35
 
31
36
  height = Array.new(column_count, 0)
32
37
 
@@ -38,7 +43,7 @@ private
38
43
  data_row.points.each_with_index do |data_point, index|
39
44
  # Use incremented x and scaled y
40
45
  new_x = @graph_left + (x_increment * index)
41
- new_y = @graph_top + (@graph_height - data_point * @graph_height - height[index])
46
+ new_y = @graph_top + (@graph_height - (data_point * @graph_height) - height[index])
42
47
 
43
48
  height[index] += (data_point * @graph_height)
44
49
 
@@ -50,15 +55,15 @@ private
50
55
 
51
56
  poly_points = data_points.dup
52
57
  if prev_data_points
53
- (prev_data_points.length / 2 - 1).downto(0) do |i|
58
+ ((prev_data_points.length / 2) - 1).downto(0) do |i|
54
59
  poly_points << prev_data_points[2 * i]
55
- poly_points << prev_data_points[2 * i + 1]
60
+ poly_points << prev_data_points[(2 * i) + 1]
56
61
  end
57
62
  else
58
63
  poly_points << @graph_right
59
- poly_points << @graph_bottom - 1
64
+ poly_points << (@graph_bottom - 1)
60
65
  poly_points << @graph_left
61
- poly_points << @graph_bottom - 1
66
+ poly_points << (@graph_bottom - 1)
62
67
  end
63
68
  poly_points << data_points[0]
64
69
  poly_points << data_points[1]