gruff 0.13.0 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +79 -0
- data/.rubocop.yml +29 -31
- data/CHANGELOG.md +43 -0
- data/README.md +11 -5
- data/gruff.gemspec +8 -10
- data/lib/gruff/accumulator_bar.rb +4 -2
- data/lib/gruff/area.rb +9 -12
- data/lib/gruff/bar.rb +46 -31
- data/lib/gruff/base.rb +236 -207
- data/lib/gruff/bezier.rb +6 -8
- data/lib/gruff/box_plot.rb +174 -0
- data/lib/gruff/bullet.rb +17 -16
- data/lib/gruff/candlestick.rb +112 -0
- data/lib/gruff/dot.rb +14 -14
- data/lib/gruff/font.rb +42 -0
- data/lib/gruff/helper/bar_conversion.rb +5 -5
- data/lib/gruff/helper/bar_value_label.rb +26 -20
- data/lib/gruff/helper/stacked_mixin.rb +4 -3
- data/lib/gruff/histogram.rb +9 -7
- data/lib/gruff/line.rb +96 -83
- data/lib/gruff/mini/bar.rb +9 -6
- data/lib/gruff/mini/legend.rb +16 -12
- data/lib/gruff/mini/pie.rb +9 -6
- data/lib/gruff/mini/side_bar.rb +9 -6
- data/lib/gruff/net.rb +16 -22
- data/lib/gruff/patch/rmagick.rb +0 -1
- data/lib/gruff/patch/string.rb +2 -1
- data/lib/gruff/pie.rb +42 -75
- data/lib/gruff/renderer/bezier.rb +8 -9
- data/lib/gruff/renderer/circle.rb +8 -9
- data/lib/gruff/renderer/dash_line.rb +10 -10
- data/lib/gruff/renderer/dot.rb +15 -14
- data/lib/gruff/renderer/ellipse.rb +8 -9
- data/lib/gruff/renderer/line.rb +8 -11
- data/lib/gruff/renderer/polygon.rb +9 -10
- data/lib/gruff/renderer/polyline.rb +8 -9
- data/lib/gruff/renderer/rectangle.rb +11 -8
- data/lib/gruff/renderer/renderer.rb +25 -40
- data/lib/gruff/renderer/text.rb +21 -37
- data/lib/gruff/scatter.rb +86 -85
- data/lib/gruff/side_bar.rb +50 -37
- data/lib/gruff/side_stacked_bar.rb +26 -35
- data/lib/gruff/spider.rb +52 -28
- data/lib/gruff/stacked_area.rb +20 -16
- data/lib/gruff/stacked_bar.rb +44 -22
- data/lib/gruff/store/store.rb +6 -10
- data/lib/gruff/store/xy_data.rb +2 -0
- data/lib/gruff/themes.rb +6 -6
- data/lib/gruff/version.rb +1 -1
- data/lib/gruff.rb +70 -57
- data/rails_generators/gruff/templates/controller.rb +1 -1
- metadata +25 -28
- data/.rubocop_todo.yml +0 -182
- data/.travis.yml +0 -23
- data/assets/plastik/blue.png +0 -0
- data/assets/plastik/green.png +0 -0
- data/assets/plastik/red.png +0 -0
- data/lib/gruff/photo_bar.rb +0 -93
- data/lib/gruff/scene.rb +0 -198
- data/lib/gruff/store/custom_data.rb +0 -36
data/lib/gruff/line.rb
CHANGED
@@ -37,29 +37,8 @@ class Gruff::Line < Gruff::Base
|
|
37
37
|
# accessors for support of xy data.
|
38
38
|
attr_writer :maximum_x_value
|
39
39
|
|
40
|
-
#
|
41
|
-
|
42
|
-
if @reference_lines.key?(:baseline)
|
43
|
-
@reference_lines[:baseline][:value]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Set a value for a baseline reference line..
|
48
|
-
def baseline_value=(new_value)
|
49
|
-
@reference_lines[:baseline] ||= {}
|
50
|
-
@reference_lines[:baseline][:value] = new_value
|
51
|
-
end
|
52
|
-
|
53
|
-
def baseline_color
|
54
|
-
if @reference_lines.key?(:baseline)
|
55
|
-
@reference_lines[:baseline][:color]
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def baseline_color=(new_value)
|
60
|
-
@reference_lines[:baseline] ||= {}
|
61
|
-
@reference_lines[:baseline][:color] = new_value
|
62
|
-
end
|
40
|
+
# The number of vertical lines shown.
|
41
|
+
attr_writer :marker_x_count
|
63
42
|
|
64
43
|
# Call with target pixel width of graph (+800+, +400+, +300+), and/or +false+ to omit lines (points only).
|
65
44
|
#
|
@@ -78,28 +57,29 @@ class Gruff::Line < Gruff::Base
|
|
78
57
|
end
|
79
58
|
end
|
80
59
|
|
81
|
-
|
82
|
-
|
60
|
+
# Get the value if somebody has defined it.
|
61
|
+
def baseline_value
|
62
|
+
if @reference_lines.key?(:baseline)
|
63
|
+
@reference_lines[:baseline][:value]
|
64
|
+
end
|
83
65
|
end
|
84
|
-
private :initialize_store
|
85
66
|
|
86
|
-
|
87
|
-
|
88
|
-
@reference_lines
|
89
|
-
@
|
90
|
-
|
91
|
-
|
92
|
-
@hide_dots = @hide_lines = false
|
93
|
-
@maximum_x_value = nil
|
94
|
-
@minimum_x_value = nil
|
67
|
+
# Set a value for a baseline reference line..
|
68
|
+
def baseline_value=(new_value)
|
69
|
+
@reference_lines[:baseline] ||= {}
|
70
|
+
@reference_lines[:baseline][:value] = new_value
|
71
|
+
end
|
95
72
|
|
96
|
-
|
97
|
-
@
|
98
|
-
|
73
|
+
def baseline_color
|
74
|
+
if @reference_lines.key?(:baseline)
|
75
|
+
@reference_lines[:baseline][:color]
|
76
|
+
end
|
77
|
+
end
|
99
78
|
|
100
|
-
|
79
|
+
def baseline_color=(new_value)
|
80
|
+
@reference_lines[:baseline] ||= {}
|
81
|
+
@reference_lines[:baseline][:color] = new_value
|
101
82
|
end
|
102
|
-
private :initialize_ivars
|
103
83
|
|
104
84
|
# This method allows one to plot a dataset with both X and Y data.
|
105
85
|
#
|
@@ -138,12 +118,14 @@ class Gruff::Line < Gruff::Base
|
|
138
118
|
def dataxy(name, x_data_points = [], y_data_points = [], color = nil)
|
139
119
|
# make sure it's an array
|
140
120
|
x_data_points = Array(x_data_points)
|
141
|
-
y_data_points = Array(y_data_points)
|
142
121
|
|
143
122
|
raise ArgumentError, 'x_data_points is nil!' if x_data_points.empty?
|
144
123
|
|
145
124
|
if x_data_points.all? { |p| p.is_a?(Array) && p.size == 2 }
|
125
|
+
color = y_data_points if y_data_points.is_a?(String)
|
146
126
|
x_data_points, y_data_points = x_data_points.transpose
|
127
|
+
else
|
128
|
+
y_data_points = Array(y_data_points)
|
147
129
|
end
|
148
130
|
|
149
131
|
raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length
|
@@ -152,14 +134,38 @@ class Gruff::Line < Gruff::Base
|
|
152
134
|
store.add(name, y_data_points, color, x_data_points)
|
153
135
|
end
|
154
136
|
|
137
|
+
private
|
138
|
+
|
139
|
+
def initialize_store
|
140
|
+
@store = Gruff::Store.new(Gruff::Store::XYData)
|
141
|
+
end
|
142
|
+
|
143
|
+
def initialize_attributes
|
144
|
+
super
|
145
|
+
@reference_lines = {}
|
146
|
+
@reference_line_default_color = 'red'
|
147
|
+
@reference_line_default_width = 5
|
148
|
+
|
149
|
+
@hide_dots = @hide_lines = false
|
150
|
+
@maximum_x_value = nil
|
151
|
+
@minimum_x_value = nil
|
152
|
+
@marker_x_count = nil
|
153
|
+
|
154
|
+
@line_width = nil
|
155
|
+
@dot_radius = nil
|
156
|
+
@dot_style = 'circle'
|
157
|
+
|
158
|
+
@show_vertical_markers = false
|
159
|
+
end
|
160
|
+
|
155
161
|
def draw_reference_line(reference_line, left, right, top, bottom)
|
156
162
|
color = reference_line[:color] || @reference_line_default_color
|
157
163
|
width = reference_line[:width] || @reference_line_default_width
|
158
|
-
Gruff::Renderer::DashLine.new(color: color, width: width).render(left, top, right, bottom)
|
164
|
+
Gruff::Renderer::DashLine.new(renderer, color: color, width: width).render(left, top, right, bottom)
|
159
165
|
end
|
160
166
|
|
161
167
|
def draw_horizontal_reference_line(reference_line)
|
162
|
-
level = @graph_top + (@graph_height - reference_line[:norm_value] * @graph_height)
|
168
|
+
level = @graph_top + (@graph_height - (reference_line[:norm_value] * @graph_height))
|
163
169
|
draw_reference_line(reference_line, @graph_left, @graph_left + @graph_width, level, level)
|
164
170
|
end
|
165
171
|
|
@@ -168,65 +174,49 @@ class Gruff::Line < Gruff::Base
|
|
168
174
|
draw_reference_line(reference_line, index, index, @graph_top, @graph_top + @graph_height)
|
169
175
|
end
|
170
176
|
|
171
|
-
def
|
172
|
-
super
|
173
|
-
|
174
|
-
return unless data_given?
|
175
|
-
|
177
|
+
def draw_graph
|
176
178
|
# Check to see if more than one datapoint was given. NaN can result otherwise.
|
177
|
-
@x_increment =
|
179
|
+
@x_increment = column_count > 1 ? @graph_width / (column_count - 1) : @graph_width
|
178
180
|
|
179
181
|
@reference_lines.each_value do |curr_reference_line|
|
180
182
|
draw_horizontal_reference_line(curr_reference_line) if curr_reference_line.key?(:norm_value)
|
181
183
|
draw_vertical_reference_line(curr_reference_line) if curr_reference_line.key?(:index)
|
182
184
|
end
|
183
185
|
|
184
|
-
if @show_vertical_markers
|
185
|
-
(0..column_count).each do |column|
|
186
|
-
x = @graph_left + @graph_width - column.to_f * @x_increment
|
187
|
-
|
188
|
-
Gruff::Renderer::Line.new(color: @marker_color).render(x, @graph_bottom, x, @graph_top)
|
189
|
-
#If the user specified a marker shadow color, draw a shadow just below it
|
190
|
-
if @marker_shadow_color
|
191
|
-
Gruff::Renderer::Line.new(color: @marker_shadow_color).render(x + 1, @graph_bottom, x + 1, @graph_top)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
186
|
store.norm_data.each do |data_row|
|
197
187
|
prev_x = prev_y = nil
|
198
188
|
|
199
189
|
one_point = contains_one_point_only?(data_row)
|
200
190
|
|
201
191
|
data_row.coordinates.each_with_index do |(x_data, y_data), index|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
@labels.each do |label_pos, _|
|
209
|
-
draw_label(@graph_left + ((label_pos - @minimum_x_value) * @graph_width) / (@maximum_x_value - @minimum_x_value), label_pos)
|
192
|
+
new_x = begin
|
193
|
+
if x_data.nil?
|
194
|
+
# use the old method: equally spaced points along the x-axis
|
195
|
+
@graph_left + (@x_increment * index)
|
196
|
+
else
|
197
|
+
get_x_coord(x_data, @graph_width, @graph_left)
|
210
198
|
end
|
211
199
|
end
|
200
|
+
draw_label_for_x_data(x_data, new_x, index)
|
201
|
+
|
212
202
|
unless y_data # we can't draw a line for a null data point, we can still label the axis though
|
213
203
|
prev_x = prev_y = nil
|
214
204
|
next
|
215
205
|
end
|
216
206
|
|
217
|
-
new_y = @graph_top + (@graph_height - y_data * @graph_height)
|
207
|
+
new_y = @graph_top + (@graph_height - (y_data * @graph_height))
|
218
208
|
|
219
209
|
# Reset each time to avoid thin-line errors
|
220
210
|
stroke_width = @line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 4), 5.0)
|
221
211
|
circle_radius = @dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0)
|
222
212
|
|
223
213
|
if !@hide_lines && prev_x && prev_y
|
224
|
-
Gruff::Renderer::Line.new(color: data_row.color, width: stroke_width)
|
214
|
+
Gruff::Renderer::Line.new(renderer, color: data_row.color, width: stroke_width)
|
225
215
|
.render(prev_x, prev_y, new_x, new_y)
|
226
216
|
end
|
227
217
|
|
228
218
|
if one_point || !@hide_dots
|
229
|
-
Gruff::Renderer::Dot.new(@dot_style, color: data_row.color, width: stroke_width).render(new_x, new_y, circle_radius)
|
219
|
+
Gruff::Renderer::Dot.new(renderer, @dot_style, color: data_row.color, width: stroke_width).render(new_x, new_y, circle_radius)
|
230
220
|
end
|
231
221
|
|
232
222
|
prev_x = new_x
|
@@ -235,16 +225,14 @@ class Gruff::Line < Gruff::Base
|
|
235
225
|
end
|
236
226
|
end
|
237
227
|
|
238
|
-
private
|
239
|
-
|
240
228
|
def setup_data
|
241
229
|
# Update the global min/max values for the x data
|
242
|
-
@maximum_x_value
|
243
|
-
@minimum_x_value
|
230
|
+
@maximum_x_value = (@maximum_x_value || store.max_x).to_f
|
231
|
+
@minimum_x_value = (@minimum_x_value || store.min_x).to_f
|
244
232
|
|
245
233
|
# Deal with horizontal reference line values that exceed the existing minimum & maximum values.
|
246
|
-
possible_maximums = [maximum_value
|
247
|
-
possible_minimums = [minimum_value
|
234
|
+
possible_maximums = [maximum_value]
|
235
|
+
possible_minimums = [minimum_value]
|
248
236
|
|
249
237
|
@reference_lines.each_value do |curr_reference_line|
|
250
238
|
if curr_reference_line.key?(:value)
|
@@ -259,26 +247,51 @@ private
|
|
259
247
|
super
|
260
248
|
end
|
261
249
|
|
250
|
+
def setup_drawing
|
251
|
+
@marker_x_count ||= column_count - 1
|
252
|
+
super
|
253
|
+
end
|
254
|
+
|
262
255
|
def normalize
|
263
256
|
return unless data_given?
|
264
257
|
|
265
|
-
spread_x = @maximum_x_value
|
258
|
+
spread_x = @maximum_x_value - @minimum_x_value
|
266
259
|
store.normalize(minimum_x: @minimum_x_value, spread_x: spread_x, minimum_y: minimum_value, spread_y: @spread)
|
267
260
|
|
268
261
|
@reference_lines.each_value do |curr_reference_line|
|
269
262
|
# We only care about horizontal markers ... for normalization.
|
270
263
|
# Vertical markers won't have a :value, they will have an :index
|
271
264
|
|
272
|
-
curr_reference_line[:norm_value] = ((curr_reference_line[:value].to_f - minimum_value) / @spread
|
265
|
+
curr_reference_line[:norm_value] = ((curr_reference_line[:value].to_f - minimum_value) / @spread) if curr_reference_line.key?(:value)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def draw_line_markers
|
270
|
+
# do all of the stuff for the horizontal lines on the y-axis
|
271
|
+
super
|
272
|
+
return if @hide_line_markers
|
273
|
+
return unless @show_vertical_markers
|
274
|
+
|
275
|
+
(0..@marker_x_count).each do |index|
|
276
|
+
x = @graph_left + @graph_width - (index * @graph_width / @marker_x_count)
|
277
|
+
|
278
|
+
Gruff::Renderer::Line.new(renderer, color: @marker_color).render(x, @graph_bottom, x, @graph_top)
|
279
|
+
Gruff::Renderer::Line.new(renderer, color: @marker_shadow_color).render(x + 1, @graph_bottom, x + 1, @graph_top) if @marker_shadow_color
|
273
280
|
end
|
274
281
|
end
|
275
282
|
|
276
|
-
def
|
277
|
-
|
283
|
+
def draw_label_for_x_data(x_data, new_x, index)
|
284
|
+
if x_data.nil?
|
285
|
+
draw_label(new_x, index)
|
286
|
+
else
|
287
|
+
@labels.each do |label_pos, _|
|
288
|
+
draw_label(@graph_left + (((label_pos - @minimum_x_value) * @graph_width) / (@maximum_x_value - @minimum_x_value)), label_pos)
|
289
|
+
end
|
290
|
+
end
|
278
291
|
end
|
279
292
|
|
280
293
|
def get_x_coord(x_data_point, width, offset)
|
281
|
-
x_data_point * width + offset
|
294
|
+
(x_data_point * width) + offset
|
282
295
|
end
|
283
296
|
|
284
297
|
def contains_one_point_only?(data_row)
|
data/lib/gruff/mini/bar.rb
CHANGED
@@ -16,27 +16,30 @@ module Gruff
|
|
16
16
|
module Mini
|
17
17
|
# A class for drawing a small bar graph.
|
18
18
|
class Bar < Gruff::Bar
|
19
|
+
private
|
20
|
+
|
19
21
|
include Gruff::Mini::Legend
|
20
22
|
|
21
|
-
def
|
23
|
+
def initialize_attributes
|
22
24
|
super
|
23
25
|
|
24
26
|
@hide_legend = true
|
25
27
|
@hide_title = true
|
26
28
|
@hide_line_numbers = true
|
27
29
|
|
28
|
-
@
|
29
|
-
@
|
30
|
+
@marker_font.size = 50.0
|
31
|
+
@legend_font.size = 60.0
|
30
32
|
|
31
33
|
@minimum_value = 0.0
|
32
34
|
end
|
33
|
-
private :initialize_ivars
|
34
35
|
|
35
|
-
def
|
36
|
+
def setup_data
|
36
37
|
expand_canvas_for_vertical_legend
|
37
|
-
|
38
38
|
super
|
39
|
+
end
|
39
40
|
|
41
|
+
def draw_graph
|
42
|
+
super
|
40
43
|
draw_vertical_legend
|
41
44
|
end
|
42
45
|
end
|
data/lib/gruff/mini/legend.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
module Gruff
|
4
4
|
module Mini
|
5
5
|
# A module to handle the small legend.
|
6
|
+
# @private
|
6
7
|
module Legend
|
7
8
|
attr_accessor :hide_mini_legend, :legend_position
|
8
9
|
|
@@ -20,7 +21,7 @@ module Gruff
|
|
20
21
|
|
21
22
|
@legend_labels = store.data.map(&:label)
|
22
23
|
|
23
|
-
legend_height = scale_fontsize(store.length * calculate_line_height + @top_margin + @bottom_margin)
|
24
|
+
legend_height = scale_fontsize((store.length * calculate_line_height) + @top_margin + @bottom_margin)
|
24
25
|
|
25
26
|
@original_rows = @raw_rows
|
26
27
|
@original_columns = @raw_columns
|
@@ -30,19 +31,21 @@ module Gruff
|
|
30
31
|
@rows = [@rows, legend_height].max
|
31
32
|
@columns += calculate_legend_width + @left_margin
|
32
33
|
else
|
33
|
-
|
34
|
+
font = @legend_font.dup
|
35
|
+
font.size = scale_fontsize(font.size)
|
36
|
+
@rows += store.length * calculate_caps_height(font) * 1.7
|
34
37
|
end
|
35
38
|
|
36
|
-
Gruff::Renderer.
|
39
|
+
@renderer = Gruff::Renderer.new(@columns, @rows, @scale, @theme_options)
|
37
40
|
end
|
38
41
|
|
39
42
|
def calculate_line_height
|
40
|
-
calculate_caps_height(@
|
43
|
+
calculate_caps_height(@legend_font) * 1.7
|
41
44
|
end
|
42
45
|
|
43
46
|
def calculate_legend_width
|
44
|
-
width = @legend_labels.map { |label| calculate_width(@
|
45
|
-
scale_fontsize(width + 40 * 1.7)
|
47
|
+
width = @legend_labels.map { |label| calculate_width(@legend_font, label) }.max
|
48
|
+
scale_fontsize(width + (40 * 1.7))
|
46
49
|
end
|
47
50
|
|
48
51
|
##
|
@@ -67,16 +70,16 @@ module Gruff
|
|
67
70
|
@legend_labels.each_with_index do |legend_label, index|
|
68
71
|
# Draw label
|
69
72
|
label = truncate_legend_label(legend_label)
|
70
|
-
text_renderer = Gruff::Renderer::Text.new(label, font: @
|
73
|
+
text_renderer = Gruff::Renderer::Text.new(renderer, label, font: @legend_font)
|
71
74
|
x_offset = current_x_offset + (legend_square_width * 1.7)
|
72
75
|
text_renderer.add_to_render_queue(@raw_columns, 1.0, x_offset, current_y_offset, Magick::WestGravity)
|
73
76
|
|
74
77
|
# Now draw box with color of this dataset
|
75
|
-
rect_renderer = Gruff::Renderer::Rectangle.new(color: store.data[index].color)
|
78
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: store.data[index].color)
|
76
79
|
rect_renderer.render(current_x_offset,
|
77
|
-
current_y_offset - legend_square_width / 2.0,
|
80
|
+
current_y_offset - (legend_square_width / 2.0),
|
78
81
|
current_x_offset + legend_square_width,
|
79
|
-
current_y_offset + legend_square_width / 2.0)
|
82
|
+
current_y_offset + (legend_square_width / 2.0))
|
80
83
|
|
81
84
|
current_y_offset += calculate_line_height
|
82
85
|
end
|
@@ -90,9 +93,10 @@ module Gruff
|
|
90
93
|
def truncate_legend_label(label)
|
91
94
|
truncated_label = label.to_s
|
92
95
|
|
93
|
-
|
96
|
+
font = @legend_font.dup
|
97
|
+
font.size = scale_fontsize(font.size)
|
94
98
|
max_width = @columns - @legend_left_margin - @right_margin
|
95
|
-
while calculate_width(
|
99
|
+
while calculate_width(font, truncated_label) > max_width && truncated_label.length > 1
|
96
100
|
truncated_label = truncated_label[0..truncated_label.length - 2]
|
97
101
|
end
|
98
102
|
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
data/lib/gruff/mini/pie.rb
CHANGED
@@ -15,25 +15,28 @@ module Gruff
|
|
15
15
|
module Mini
|
16
16
|
# A class for drawing a small pie graph.
|
17
17
|
class Pie < Gruff::Pie
|
18
|
+
private
|
19
|
+
|
18
20
|
include Gruff::Mini::Legend
|
19
21
|
|
20
|
-
def
|
22
|
+
def initialize_attributes
|
21
23
|
super
|
22
24
|
|
23
25
|
@hide_legend = true
|
24
26
|
@hide_title = true
|
25
27
|
@hide_line_numbers = true
|
26
28
|
|
27
|
-
@
|
28
|
-
@
|
29
|
+
@marker_font.size = 60.0
|
30
|
+
@legend_font.size = 60.0
|
29
31
|
end
|
30
|
-
private :initialize_ivars
|
31
32
|
|
32
|
-
def
|
33
|
+
def setup_data
|
33
34
|
expand_canvas_for_vertical_legend
|
34
|
-
|
35
35
|
super
|
36
|
+
end
|
36
37
|
|
38
|
+
def draw_graph
|
39
|
+
super
|
37
40
|
draw_vertical_legend
|
38
41
|
end
|
39
42
|
end
|
data/lib/gruff/mini/side_bar.rb
CHANGED
@@ -23,24 +23,27 @@ module Gruff
|
|
23
23
|
module Mini
|
24
24
|
# A class for drawing a small side bar graph.
|
25
25
|
class SideBar < Gruff::SideBar
|
26
|
+
private
|
27
|
+
|
26
28
|
include Gruff::Mini::Legend
|
27
29
|
|
28
|
-
def
|
30
|
+
def initialize_attributes
|
29
31
|
super
|
30
32
|
@hide_legend = true
|
31
33
|
@hide_title = true
|
32
34
|
@hide_line_numbers = true
|
33
35
|
|
34
|
-
@
|
35
|
-
@
|
36
|
+
@marker_font.size = 50.0
|
37
|
+
@legend_font.size = 50.0
|
36
38
|
end
|
37
|
-
private :initialize_ivars
|
38
39
|
|
39
|
-
def
|
40
|
+
def setup_data
|
40
41
|
expand_canvas_for_vertical_legend
|
41
|
-
|
42
42
|
super
|
43
|
+
end
|
43
44
|
|
45
|
+
def draw_graph
|
46
|
+
super
|
44
47
|
draw_vertical_legend
|
45
48
|
end
|
46
49
|
end
|
data/lib/gruff/net.rb
CHANGED
@@ -30,7 +30,9 @@ class Gruff::Net < Gruff::Base
|
|
30
30
|
attr_writer :line_width
|
31
31
|
attr_writer :dot_radius
|
32
32
|
|
33
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def initialize_attributes
|
34
36
|
super
|
35
37
|
|
36
38
|
@hide_dots = false
|
@@ -38,42 +40,36 @@ class Gruff::Net < Gruff::Base
|
|
38
40
|
@dot_radius = nil
|
39
41
|
@hide_line_numbers = true
|
40
42
|
@sorted_drawing = true
|
43
|
+
@marker_font.bold = true
|
41
44
|
end
|
42
|
-
private :initialize_ivars
|
43
|
-
|
44
|
-
def draw
|
45
|
-
super
|
46
|
-
|
47
|
-
return unless data_given?
|
48
45
|
|
46
|
+
def draw_graph
|
49
47
|
store.norm_data.each do |data_row|
|
50
48
|
data_row.points.each_with_index do |data_point, index|
|
51
49
|
next if data_point.nil?
|
52
50
|
|
53
51
|
rad_pos = index * Math::PI * 2 / column_count
|
54
52
|
point_distance = data_point * @radius
|
55
|
-
start_x = @center_x + Math.sin(rad_pos) * point_distance
|
56
|
-
start_y = @center_y - Math.cos(rad_pos) * point_distance
|
53
|
+
start_x = @center_x + (Math.sin(rad_pos) * point_distance)
|
54
|
+
start_y = @center_y - (Math.cos(rad_pos) * point_distance)
|
57
55
|
|
58
56
|
next_index = index + 1 < data_row.points.length ? index + 1 : 0
|
59
57
|
|
60
58
|
next_rad_pos = next_index * Math::PI * 2 / column_count
|
61
59
|
next_point_distance = data_row.points[next_index] * @radius
|
62
|
-
end_x = @center_x + Math.sin(next_rad_pos) * next_point_distance
|
63
|
-
end_y = @center_y - Math.cos(next_rad_pos) * next_point_distance
|
60
|
+
end_x = @center_x + (Math.sin(next_rad_pos) * next_point_distance)
|
61
|
+
end_y = @center_y - (Math.cos(next_rad_pos) * next_point_distance)
|
64
62
|
|
65
|
-
Gruff::Renderer::Line.new(color: data_row.color, width: @stroke_width).render(start_x, start_y, end_x, end_y)
|
63
|
+
Gruff::Renderer::Line.new(renderer, color: data_row.color, width: @stroke_width).render(start_x, start_y, end_x, end_y)
|
66
64
|
|
67
65
|
unless @hide_dots
|
68
|
-
circle_renderer = Gruff::Renderer::Circle.new(color: data_row.color, width: @stroke_width)
|
66
|
+
circle_renderer = Gruff::Renderer::Circle.new(renderer, color: data_row.color, width: @stroke_width)
|
69
67
|
circle_renderer.render(start_x, start_y, start_x - @circle_radius, start_y)
|
70
68
|
end
|
71
69
|
end
|
72
70
|
end
|
73
71
|
end
|
74
72
|
|
75
|
-
private
|
76
|
-
|
77
73
|
def setup_drawing
|
78
74
|
super
|
79
75
|
|
@@ -92,8 +88,8 @@ private
|
|
92
88
|
(0..column_count - 1).each do |index|
|
93
89
|
rad_pos = index * Math::PI * 2 / column_count
|
94
90
|
|
95
|
-
Gruff::Renderer::Line.new(color: @marker_color)
|
96
|
-
.render(@center_x, @center_y, @center_x + Math.sin(rad_pos) * @radius, @center_y - Math.cos(rad_pos) * @radius)
|
91
|
+
Gruff::Renderer::Line.new(renderer, color: @marker_color)
|
92
|
+
.render(@center_x, @center_y, @center_x + (Math.sin(rad_pos) * @radius), @center_y - (Math.cos(rad_pos) * @radius))
|
97
93
|
|
98
94
|
marker_label = @labels[index] ? @labels[index].to_s : '000'
|
99
95
|
draw_label(@center_x, @center_y, rad_pos * 360 / (2 * Math::PI), @radius + @circle_radius, marker_label)
|
@@ -103,11 +99,9 @@ private
|
|
103
99
|
def draw_label(center_x, center_y, angle, radius, amount)
|
104
100
|
x_offset = center_x # + 15 # The label points need to be tweaked slightly
|
105
101
|
y_offset = center_y # + 0 # This one doesn't though
|
106
|
-
x = x_offset + (radius + LABEL_MARGIN) * Math.sin(deg2rad(angle))
|
107
|
-
y = y_offset - (radius + LABEL_MARGIN) * Math.cos(deg2rad(angle))
|
102
|
+
x = x_offset + ((radius + LABEL_MARGIN) * Math.sin(deg2rad(angle)))
|
103
|
+
y = y_offset - ((radius + LABEL_MARGIN) * Math.cos(deg2rad(angle)))
|
108
104
|
|
109
|
-
|
110
|
-
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: 20, color: @marker_color, weight: Magick::BoldWeight)
|
111
|
-
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
105
|
+
draw_label_at(1.0, 1.0, x, y, amount, Magick::CenterGravity)
|
112
106
|
end
|
113
107
|
end
|
data/lib/gruff/patch/rmagick.rb
CHANGED
data/lib/gruff/patch/string.rb
CHANGED
@@ -3,9 +3,10 @@
|
|
3
3
|
# @private
|
4
4
|
module String::GruffCommify
|
5
5
|
THOUSAND_SEPARATOR = ','
|
6
|
+
private_constant :THOUSAND_SEPARATOR
|
6
7
|
|
7
8
|
refine String do
|
8
|
-
#Taken from http://codesnippets.joyent.com/posts/show/330
|
9
|
+
# Taken from http://codesnippets.joyent.com/posts/show/330
|
9
10
|
def commify(delimiter = THOUSAND_SEPARATOR)
|
10
11
|
gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
|
11
12
|
end
|