gruff 0.13.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.
- 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 +15 -32
- 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
|