gruff 0.29.0-java → 0.31.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/dependabot.yml +6 -0
- data/.github/workflows/ci.yml +19 -26
- data/.github/workflows/release.yml +24 -0
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +11 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +2 -0
- data/gruff.gemspec +1 -0
- data/init.rb +1 -0
- data/lib/gruff/accumulator_bar.rb +1 -0
- data/lib/gruff/area.rb +2 -0
- data/lib/gruff/bar.rb +5 -0
- data/lib/gruff/base.rb +59 -2
- data/lib/gruff/bezier.rb +1 -0
- data/lib/gruff/box.rb +8 -0
- data/lib/gruff/bubble.rb +4 -0
- data/lib/gruff/bullet.rb +4 -0
- data/lib/gruff/candlestick.rb +20 -8
- data/lib/gruff/dot.rb +4 -0
- data/lib/gruff/font.rb +2 -0
- data/lib/gruff/helper/bar_value_label.rb +2 -0
- data/lib/gruff/helper/stacked_mixin.rb +1 -0
- data/lib/gruff/histogram.rb +3 -0
- data/lib/gruff/line.rb +28 -0
- data/lib/gruff/mini/bar.rb +4 -0
- data/lib/gruff/mini/legend.rb +15 -3
- data/lib/gruff/mini/pie.rb +4 -0
- data/lib/gruff/mini/side_bar.rb +4 -0
- data/lib/gruff/net.rb +7 -1
- data/lib/gruff/patch/rmagick.rb +11 -0
- data/lib/gruff/patch/string.rb +3 -0
- data/lib/gruff/pie.rb +8 -0
- data/lib/gruff/renderer/bezier.rb +1 -0
- data/lib/gruff/renderer/circle.rb +1 -0
- data/lib/gruff/renderer/dash_line.rb +1 -0
- data/lib/gruff/renderer/dot.rb +13 -0
- data/lib/gruff/renderer/ellipse.rb +1 -0
- data/lib/gruff/renderer/line.rb +7 -0
- data/lib/gruff/renderer/polygon.rb +2 -0
- data/lib/gruff/renderer/polyline.rb +1 -0
- data/lib/gruff/renderer/rectangle.rb +1 -0
- data/lib/gruff/renderer/renderer.rb +26 -3
- data/lib/gruff/renderer/text.rb +5 -1
- data/lib/gruff/scatter.rb +17 -0
- data/lib/gruff/side_bar.rb +9 -0
- data/lib/gruff/side_stacked_bar.rb +3 -0
- data/lib/gruff/spider.rb +26 -2
- data/lib/gruff/stacked_area.rb +5 -0
- data/lib/gruff/stacked_bar.rb +5 -0
- data/lib/gruff/store/basic_data.rb +4 -0
- data/lib/gruff/store/store.rb +8 -0
- data/lib/gruff/store/xy_data.rb +2 -0
- data/lib/gruff/store/xy_pointsizes_data.rb +2 -0
- data/lib/gruff/version.rb +1 -1
- data/lib/gruff.rb +2 -0
- data/sig/generated/gruff/accumulator_bar.rbs +2 -1
- data/sig/generated/gruff/area.rbs +4 -2
- data/sig/generated/gruff/bar.rbs +10 -5
- data/sig/generated/gruff/base.rbs +113 -53
- data/sig/generated/gruff/bezier.rbs +2 -1
- data/sig/generated/gruff/box.rbs +13 -5
- data/sig/generated/gruff/bubble.rbs +8 -4
- data/sig/generated/gruff/bullet.rbs +8 -4
- data/sig/generated/gruff/candlestick.rbs +26 -14
- data/sig/generated/gruff/dot.rbs +8 -4
- data/sig/generated/gruff/font.rbs +3 -1
- data/sig/generated/gruff/helper/bar_value_label.rbs +4 -2
- data/sig/generated/gruff/helper/stacked_mixin.rbs +2 -1
- data/sig/generated/gruff/histogram.rbs +6 -3
- data/sig/generated/gruff/line.rbs +44 -16
- data/sig/generated/gruff/mini/bar.rbs +27 -0
- data/sig/generated/gruff/mini/legend.rbs +36 -0
- data/sig/generated/gruff/mini/pie.rbs +26 -0
- data/sig/generated/gruff/mini/side_bar.rbs +34 -0
- data/sig/generated/gruff/net.rbs +12 -6
- data/sig/generated/gruff/patch/rmagick.rbs +25 -0
- data/sig/generated/gruff/patch/string.rbs +11 -0
- data/sig/generated/gruff/pie.rbs +15 -7
- data/sig/generated/gruff/renderer/bezier.rbs +2 -1
- data/sig/generated/gruff/renderer/circle.rbs +2 -1
- data/sig/generated/gruff/renderer/dash_line.rbs +2 -1
- data/sig/generated/gruff/renderer/dot.rbs +17 -4
- data/sig/generated/gruff/renderer/ellipse.rbs +2 -1
- data/sig/generated/gruff/renderer/line.rbs +9 -2
- data/sig/generated/gruff/renderer/polygon.rbs +17 -0
- data/sig/generated/gruff/renderer/polyline.rbs +2 -1
- data/sig/generated/gruff/renderer/rectangle.rbs +2 -1
- data/sig/generated/gruff/renderer/renderer.rbs +31 -8
- data/sig/generated/gruff/renderer/text.rbs +7 -3
- data/sig/generated/gruff/scatter.rbs +30 -13
- data/sig/generated/gruff/side_bar.rbs +15 -6
- data/sig/generated/gruff/side_stacked_bar.rbs +6 -3
- data/sig/generated/gruff/spider.rbs +35 -11
- data/sig/generated/gruff/stacked_area.rbs +9 -4
- data/sig/generated/gruff/stacked_bar.rbs +10 -5
- data/sig/generated/gruff/store/basic_data.rbs +8 -4
- data/sig/generated/gruff/store/store.rbs +12 -4
- data/sig/generated/gruff/store/xy_data.rbs +4 -2
- data/sig/generated/gruff/store/xy_pointsizes_data.rbs +4 -2
- data/sig/generated/gruff.rbs +3 -1
- metadata +13 -3
data/lib/gruff/base.rb
CHANGED
|
@@ -154,6 +154,7 @@ module Gruff
|
|
|
154
154
|
self.theme = Themes::KEYNOTE
|
|
155
155
|
end
|
|
156
156
|
|
|
157
|
+
# @rbs return: void
|
|
157
158
|
def initialize_graph_scale
|
|
158
159
|
@raw_columns = DEFAULT_TARGET_WIDTH
|
|
159
160
|
@raw_rows = DEFAULT_TARGET_WIDTH * (@rows / @columns)
|
|
@@ -165,6 +166,7 @@ module Gruff
|
|
|
165
166
|
end
|
|
166
167
|
protected :initialize_graph_scale
|
|
167
168
|
|
|
169
|
+
# @rbs return: void
|
|
168
170
|
def initialize_store
|
|
169
171
|
@store = Gruff::Store.new(Gruff::Store::BasicData)
|
|
170
172
|
end
|
|
@@ -176,6 +178,8 @@ module Gruff
|
|
|
176
178
|
#
|
|
177
179
|
# This makes it possible to set defaults in a subclass but still allow
|
|
178
180
|
# developers to change this values in their program.
|
|
181
|
+
#
|
|
182
|
+
# @rbs return: void
|
|
179
183
|
def initialize_attributes
|
|
180
184
|
@marker_count = nil
|
|
181
185
|
@maximum_value = @minimum_value = nil
|
|
@@ -228,6 +232,7 @@ module Gruff
|
|
|
228
232
|
# g = Gruff::Bar.new
|
|
229
233
|
# g.labels = ['2005', nil, nil, '2006', nil, nil, '2007', nil, nil, '2008'] # same labels for columns
|
|
230
234
|
#
|
|
235
|
+
# @rbs return: void
|
|
231
236
|
def labels=(labels)
|
|
232
237
|
if labels.is_a?(Array)
|
|
233
238
|
labels = labels.each_with_index.with_object({}) do |(label, index), hash|
|
|
@@ -243,6 +248,7 @@ module Gruff
|
|
|
243
248
|
#
|
|
244
249
|
# @param rotation [Numeric] the rotation.
|
|
245
250
|
# @rbs rotation: Float | Integer
|
|
251
|
+
# @rbs return: void
|
|
246
252
|
def label_rotation=(rotation)
|
|
247
253
|
raise ArgumentError, 'rotation must be between 0.0 and 45.0 or between 0.0 and -45.0' if rotation > 45.0 || rotation < -45.0
|
|
248
254
|
|
|
@@ -251,6 +257,7 @@ module Gruff
|
|
|
251
257
|
|
|
252
258
|
# Height of staggering between labels.
|
|
253
259
|
# @deprecated
|
|
260
|
+
# @rbs return: void
|
|
254
261
|
def label_stagger_height=(_value)
|
|
255
262
|
warn '#label_stagger_height= is deprecated. It is no longer effective.'
|
|
256
263
|
end
|
|
@@ -269,6 +276,7 @@ module Gruff
|
|
|
269
276
|
# g = Gruff::Bar.new
|
|
270
277
|
# g.title = ['The first line of title', 'The second line of title']
|
|
271
278
|
#
|
|
279
|
+
# @rbs return: void
|
|
272
280
|
def title=(title)
|
|
273
281
|
if title.is_a?(Array)
|
|
274
282
|
title = title.join("\n")
|
|
@@ -281,6 +289,7 @@ module Gruff
|
|
|
281
289
|
#
|
|
282
290
|
# @param margin [Numeric] The margin size.
|
|
283
291
|
# @rbs margin: Float | Integer
|
|
292
|
+
# @rbs return: void
|
|
284
293
|
def margins=(margin)
|
|
285
294
|
@top_margin = @left_margin = @right_margin = @bottom_margin = margin
|
|
286
295
|
end
|
|
@@ -289,6 +298,7 @@ module Gruff
|
|
|
289
298
|
#
|
|
290
299
|
# @param font_path [String] The path to font.
|
|
291
300
|
# @rbs font_path: String
|
|
301
|
+
# @rbs return: void
|
|
292
302
|
def font=(font_path)
|
|
293
303
|
@title_font.path = font_path unless @title_font.path
|
|
294
304
|
@marker_font.path = font_path
|
|
@@ -300,6 +310,7 @@ module Gruff
|
|
|
300
310
|
#
|
|
301
311
|
# @param font_path [String] The path to font.
|
|
302
312
|
# @rbs font_path: String
|
|
313
|
+
# @rbs return: void
|
|
303
314
|
def title_font=(font_path)
|
|
304
315
|
@title_font.path = font_path
|
|
305
316
|
end
|
|
@@ -308,6 +319,7 @@ module Gruff
|
|
|
308
319
|
#
|
|
309
320
|
# @param value [Numeric] title font size
|
|
310
321
|
# @rbs value: Float | Integer
|
|
322
|
+
# @rbs return: void
|
|
311
323
|
def title_font_size=(value)
|
|
312
324
|
@title_font.size = value
|
|
313
325
|
end
|
|
@@ -316,6 +328,7 @@ module Gruff
|
|
|
316
328
|
#
|
|
317
329
|
# @param value [Numeric] marker font size
|
|
318
330
|
# @rbs value: Float | Integer
|
|
331
|
+
# @rbs return: void
|
|
319
332
|
def marker_font_size=(value)
|
|
320
333
|
@marker_font.size = value
|
|
321
334
|
end
|
|
@@ -327,6 +340,7 @@ module Gruff
|
|
|
327
340
|
#
|
|
328
341
|
# @param value [Numeric] legend font size
|
|
329
342
|
# @rbs value: Float | Integer
|
|
343
|
+
# @rbs return: void
|
|
330
344
|
def legend_font_size=(value)
|
|
331
345
|
@legend_font.size = value
|
|
332
346
|
end
|
|
@@ -335,6 +349,7 @@ module Gruff
|
|
|
335
349
|
#
|
|
336
350
|
# @param value [Numeric] no data font size
|
|
337
351
|
# @rbs value: Float | Integer
|
|
352
|
+
# @rbs return: void
|
|
338
353
|
def no_data_font_size=(value)
|
|
339
354
|
@no_data_font.size = value
|
|
340
355
|
end
|
|
@@ -343,6 +358,7 @@ module Gruff
|
|
|
343
358
|
#
|
|
344
359
|
# @param value [Boolean] specifies whether to draw the title bolded or not.
|
|
345
360
|
# @rbs value: bool
|
|
361
|
+
# @rbs return: void
|
|
346
362
|
def bold_title=(value)
|
|
347
363
|
@title_font.bold = value
|
|
348
364
|
end
|
|
@@ -351,6 +367,7 @@ module Gruff
|
|
|
351
367
|
#
|
|
352
368
|
# @param value [String] color
|
|
353
369
|
# @rbs value: String
|
|
370
|
+
# @rbs return: void
|
|
354
371
|
def font_color=(value)
|
|
355
372
|
@title_font.color = value
|
|
356
373
|
@marker_font.color = value
|
|
@@ -365,6 +382,7 @@ module Gruff
|
|
|
365
382
|
#
|
|
366
383
|
# @example
|
|
367
384
|
# add_color('#c0e9d3')
|
|
385
|
+
# @rbs return: void
|
|
368
386
|
def add_color(colorname)
|
|
369
387
|
@colors << colorname
|
|
370
388
|
end
|
|
@@ -385,6 +403,7 @@ module Gruff
|
|
|
385
403
|
#
|
|
386
404
|
# @example
|
|
387
405
|
# replace_colors ['#cc99cc', '#d9e043', '#34d8a2']
|
|
406
|
+
# @rbs return: void
|
|
388
407
|
def replace_colors(color_list = [])
|
|
389
408
|
@colors = color_list
|
|
390
409
|
end
|
|
@@ -393,6 +412,7 @@ module Gruff
|
|
|
393
412
|
#
|
|
394
413
|
# @param value [Boolean] Specify whether to make background transparent.
|
|
395
414
|
# @rbs value: bool
|
|
415
|
+
# @rbs return: void
|
|
396
416
|
def transparent_background=(value)
|
|
397
417
|
@renderer.transparent_background(@columns, @rows) if value
|
|
398
418
|
end
|
|
@@ -428,6 +448,7 @@ module Gruff
|
|
|
428
448
|
#
|
|
429
449
|
# @param options [Hash] The optional setting for theme
|
|
430
450
|
# @rbs options: Hash[Symbol, untyped]
|
|
451
|
+
# @rbs return: void
|
|
431
452
|
def theme=(options)
|
|
432
453
|
reset_themes
|
|
433
454
|
|
|
@@ -451,31 +472,37 @@ module Gruff
|
|
|
451
472
|
end
|
|
452
473
|
|
|
453
474
|
# Apply Apple's keynote theme.
|
|
475
|
+
# @rbs return: void
|
|
454
476
|
def theme_keynote
|
|
455
477
|
self.theme = Themes::KEYNOTE
|
|
456
478
|
end
|
|
457
479
|
|
|
458
480
|
# Apply 37signals theme.
|
|
481
|
+
# @rbs return: void
|
|
459
482
|
def theme_37signals
|
|
460
483
|
self.theme = Themes::THIRTYSEVEN_SIGNALS
|
|
461
484
|
end
|
|
462
485
|
|
|
463
486
|
# Apply Rails theme.
|
|
487
|
+
# @rbs return: void
|
|
464
488
|
def theme_rails_keynote
|
|
465
489
|
self.theme = Themes::RAILS_KEYNOTE
|
|
466
490
|
end
|
|
467
491
|
|
|
468
492
|
# Apply Odeo theme.
|
|
493
|
+
# @rbs return: void
|
|
469
494
|
def theme_odeo
|
|
470
495
|
self.theme = Themes::ODEO
|
|
471
496
|
end
|
|
472
497
|
|
|
473
498
|
# Apply pastel theme.
|
|
499
|
+
# @rbs return: void
|
|
474
500
|
def theme_pastel
|
|
475
501
|
self.theme = Themes::PASTEL
|
|
476
502
|
end
|
|
477
503
|
|
|
478
504
|
# Apply greyscale theme.
|
|
505
|
+
# @rbs return: void
|
|
479
506
|
def theme_greyscale
|
|
480
507
|
self.theme = Themes::GREYSCALE
|
|
481
508
|
end
|
|
@@ -503,6 +530,7 @@ module Gruff
|
|
|
503
530
|
#
|
|
504
531
|
# @example
|
|
505
532
|
# data("Bart S.", [95, 45, 78, 89, 88, 76], '#ffcc00')
|
|
533
|
+
# @rbs return: void
|
|
506
534
|
def data(name, data_points = [], color = nil)
|
|
507
535
|
store.add(name, data_points, color)
|
|
508
536
|
end
|
|
@@ -540,6 +568,7 @@ module Gruff
|
|
|
540
568
|
#
|
|
541
569
|
# @example
|
|
542
570
|
# write('graphs/my_pretty_graph.png')
|
|
571
|
+
# @rbs return: void
|
|
543
572
|
def write(file_name = 'graph.png')
|
|
544
573
|
to_image.write(file_name)
|
|
545
574
|
end
|
|
@@ -561,6 +590,7 @@ module Gruff
|
|
|
561
590
|
# image = image.resize(400, 300).quantize(128, Magick::RGBColorspace)
|
|
562
591
|
# image.write('test.png')
|
|
563
592
|
#
|
|
593
|
+
# @rbs return: untyped
|
|
564
594
|
def to_image(format = 'PNG')
|
|
565
595
|
@to_image ||= begin
|
|
566
596
|
draw
|
|
@@ -587,6 +617,7 @@ module Gruff
|
|
|
587
617
|
end
|
|
588
618
|
|
|
589
619
|
# Draw a graph.
|
|
620
|
+
# @rbs return: void
|
|
590
621
|
def draw
|
|
591
622
|
setup_data
|
|
592
623
|
|
|
@@ -610,6 +641,7 @@ module Gruff
|
|
|
610
641
|
attr_reader :renderer #: Gruff::Renderer
|
|
611
642
|
|
|
612
643
|
# Perform data manipulation before calculating chart measurements
|
|
644
|
+
# @rbs return: void
|
|
613
645
|
def setup_data
|
|
614
646
|
if @y_axis_increment && !@hide_line_markers
|
|
615
647
|
self.maximum_value = [@y_axis_increment, maximum_value, (maximum_value / @y_axis_increment).round * @y_axis_increment].max
|
|
@@ -624,6 +656,7 @@ module Gruff
|
|
|
624
656
|
# * line markers
|
|
625
657
|
# * legend
|
|
626
658
|
# * title
|
|
659
|
+
# @rbs return: void
|
|
627
660
|
def setup_drawing
|
|
628
661
|
calculate_spread
|
|
629
662
|
calculate_increment
|
|
@@ -666,10 +699,12 @@ module Gruff
|
|
|
666
699
|
|
|
667
700
|
# Make copy of data with values scaled between 0-100
|
|
668
701
|
# @rbs return: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
|
|
702
|
+
# @rbs return: void
|
|
669
703
|
def normalize
|
|
670
704
|
store.normalize(minimum: minimum_value, spread: @spread)
|
|
671
705
|
end
|
|
672
706
|
|
|
707
|
+
# @rbs return: Float
|
|
673
708
|
def calculate_spread
|
|
674
709
|
@spread = maximum_value.to_f - minimum_value.to_f
|
|
675
710
|
@spread = @spread > 0 ? @spread : 1.0
|
|
@@ -698,6 +733,7 @@ module Gruff
|
|
|
698
733
|
##
|
|
699
734
|
# Calculates size of drawable area, general font dimensions, etc.
|
|
700
735
|
|
|
736
|
+
# @rbs return: void
|
|
701
737
|
def setup_graph_measurements
|
|
702
738
|
@graph_right = setup_right_margin
|
|
703
739
|
@graph_left = setup_left_margin
|
|
@@ -709,6 +745,7 @@ module Gruff
|
|
|
709
745
|
end
|
|
710
746
|
|
|
711
747
|
# Draw the optional labels for the x axis and y axis.
|
|
748
|
+
# @rbs return: void
|
|
712
749
|
def draw_axis_labels
|
|
713
750
|
if @x_axis_label
|
|
714
751
|
# X Axis
|
|
@@ -728,6 +765,7 @@ module Gruff
|
|
|
728
765
|
end
|
|
729
766
|
|
|
730
767
|
# Draws horizontal background lines and labels
|
|
768
|
+
# @rbs return: void
|
|
731
769
|
def draw_line_markers
|
|
732
770
|
return if @hide_line_markers
|
|
733
771
|
|
|
@@ -747,11 +785,16 @@ module Gruff
|
|
|
747
785
|
end
|
|
748
786
|
end
|
|
749
787
|
|
|
788
|
+
# @rbs y: Float | Integer
|
|
789
|
+
# @rbs return: void
|
|
750
790
|
def draw_marker_horizontal_line(y)
|
|
751
791
|
Gruff::Renderer::Line.new(renderer, color: @marker_color).render(@graph_left, y, @graph_right, y)
|
|
752
792
|
Gruff::Renderer::Line.new(renderer, color: @marker_shadow_color).render(@graph_left, y + 1, @graph_right, y + 1) if @marker_shadow_color
|
|
753
793
|
end
|
|
754
794
|
|
|
795
|
+
# @rbs x: Float | Integer
|
|
796
|
+
# @rbs tick_mark_mode: bool
|
|
797
|
+
# @rbs return: void
|
|
755
798
|
def draw_marker_vertical_line(x, tick_mark_mode: false)
|
|
756
799
|
if tick_mark_mode
|
|
757
800
|
Gruff::Renderer::Line.new(renderer, color: @marker_color).render(x, @graph_bottom, x, @graph_bottom + 5)
|
|
@@ -775,6 +818,7 @@ module Gruff
|
|
|
775
818
|
|
|
776
819
|
# Draws a legend with the names of the datasets matched
|
|
777
820
|
# to the colors used to draw them.
|
|
821
|
+
# @rbs return: void
|
|
778
822
|
def draw_legend
|
|
779
823
|
return if @hide_legend
|
|
780
824
|
|
|
@@ -824,6 +868,7 @@ module Gruff
|
|
|
824
868
|
end
|
|
825
869
|
|
|
826
870
|
# Draws a title on the graph.
|
|
871
|
+
# @rbs return: void
|
|
827
872
|
def draw_title
|
|
828
873
|
return if hide_title?
|
|
829
874
|
|
|
@@ -842,6 +887,7 @@ module Gruff
|
|
|
842
887
|
# @rbs index: Integer
|
|
843
888
|
# @rbs gravity: untyped
|
|
844
889
|
# @rbs &: () -> void
|
|
890
|
+
# @rbs return: void
|
|
845
891
|
def draw_label(x, index, gravity = Magick::NorthGravity, &block)
|
|
846
892
|
draw_unique_label(index) do
|
|
847
893
|
if x.between?(@graph_left, @graph_right)
|
|
@@ -856,6 +902,7 @@ module Gruff
|
|
|
856
902
|
|
|
857
903
|
# @rbs index: Integer
|
|
858
904
|
# @rbs yields: () -> void
|
|
905
|
+
# @rbs return: void
|
|
859
906
|
def draw_unique_label(index)
|
|
860
907
|
return if hide_labels?
|
|
861
908
|
|
|
@@ -873,6 +920,7 @@ module Gruff
|
|
|
873
920
|
# @rbs text: String | _ToS
|
|
874
921
|
# @rbs gravity: untyped
|
|
875
922
|
# @rbs rotation: Float | Integer
|
|
923
|
+
# @rbs return: void
|
|
876
924
|
def draw_label_at(width, height, x, y, text, gravity: Magick::NorthGravity, rotation: 0)
|
|
877
925
|
label_text = truncate_label_text(text)
|
|
878
926
|
text_renderer = Gruff::Renderer::Text.new(renderer, label_text, font: @marker_font, rotation: rotation)
|
|
@@ -887,6 +935,7 @@ module Gruff
|
|
|
887
935
|
# @rbs y_offset: Float | Integer
|
|
888
936
|
# @rbs data_point: String | _ToS
|
|
889
937
|
# @rbs gravity: untyped
|
|
938
|
+
# @rbs return: void
|
|
890
939
|
def draw_value_label(width, height, x_offset, y_offset, data_point, gravity: Magick::CenterGravity)
|
|
891
940
|
return if @hide_line_markers
|
|
892
941
|
|
|
@@ -894,17 +943,20 @@ module Gruff
|
|
|
894
943
|
end
|
|
895
944
|
|
|
896
945
|
# Shows an error message because you have no data.
|
|
946
|
+
# @rbs return: void
|
|
897
947
|
def draw_no_data
|
|
898
948
|
font = @no_data_font
|
|
899
949
|
text_renderer = Gruff::Renderer::Text.new(renderer, @no_data_message, font: font)
|
|
900
950
|
text_renderer.render(@raw_columns, @raw_rows, 0, 0, Magick::CenterGravity)
|
|
901
951
|
end
|
|
902
952
|
|
|
953
|
+
# @rbs return: void
|
|
903
954
|
def draw_graph
|
|
904
955
|
raise 'Should implement this method at inherited class.'
|
|
905
956
|
end
|
|
906
957
|
|
|
907
958
|
# Resets everything to defaults (except data).
|
|
959
|
+
# @rbs return: void
|
|
908
960
|
def reset_themes
|
|
909
961
|
@theme_options = {}
|
|
910
962
|
end
|
|
@@ -945,17 +997,20 @@ module Gruff
|
|
|
945
997
|
end
|
|
946
998
|
|
|
947
999
|
# Sort with largest overall summed value at front of array.
|
|
1000
|
+
# @rbs return: void
|
|
948
1001
|
def sort_data
|
|
949
1002
|
store.sort_data!
|
|
950
1003
|
end
|
|
951
1004
|
|
|
952
1005
|
# Set the color for each data set unless it was given in the data(...) call.
|
|
1006
|
+
# @rbs return: void
|
|
953
1007
|
def set_colors
|
|
954
1008
|
store.change_colors(@colors)
|
|
955
1009
|
end
|
|
956
1010
|
|
|
957
1011
|
# Sort with largest overall summed value at front of array so it shows up
|
|
958
1012
|
# correctly in the drawn graph.
|
|
1013
|
+
# @rbs return: void
|
|
959
1014
|
def sort_norm_data
|
|
960
1015
|
store.sort_norm_data!
|
|
961
1016
|
end
|
|
@@ -1156,7 +1211,9 @@ module Gruff
|
|
|
1156
1211
|
end
|
|
1157
1212
|
end
|
|
1158
1213
|
|
|
1159
|
-
#
|
|
1214
|
+
# @rbs legend_labels: Array[String]
|
|
1215
|
+
# @rbs legend_square_width: Float | Integer
|
|
1216
|
+
# @rbs return: Array[Array[Float | Integer]]
|
|
1160
1217
|
def calculate_legend_label_widths_for_each_line(legend_labels, legend_square_width)
|
|
1161
1218
|
label_widths = [[]]
|
|
1162
1219
|
label_lines = [[]]
|
|
@@ -1179,7 +1236,7 @@ module Gruff
|
|
|
1179
1236
|
label_widths.map(&:sum).zip(label_lines)
|
|
1180
1237
|
end
|
|
1181
1238
|
|
|
1182
|
-
#
|
|
1239
|
+
# @rbs return: Float
|
|
1183
1240
|
def calculate_legend_height
|
|
1184
1241
|
return 0.0 if @hide_legend
|
|
1185
1242
|
|
data/lib/gruff/bezier.rb
CHANGED
data/lib/gruff/box.rb
CHANGED
|
@@ -26,6 +26,7 @@ class Gruff::Box < Gruff::Base
|
|
|
26
26
|
# Default value is +0.8+.
|
|
27
27
|
#
|
|
28
28
|
# @rbs space_percent: Float | Integer
|
|
29
|
+
# @rbs return: void
|
|
29
30
|
def spacing_factor=(space_percent)
|
|
30
31
|
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
|
31
32
|
|
|
@@ -34,6 +35,7 @@ class Gruff::Box < Gruff::Base
|
|
|
34
35
|
|
|
35
36
|
private
|
|
36
37
|
|
|
38
|
+
# @rbs return: void
|
|
37
39
|
def initialize_attributes
|
|
38
40
|
super
|
|
39
41
|
@fill_opacity = 0.2
|
|
@@ -41,6 +43,7 @@ private
|
|
|
41
43
|
@spacing_factor = 0.8
|
|
42
44
|
end
|
|
43
45
|
|
|
46
|
+
# @rbs return: void
|
|
44
47
|
def draw_graph
|
|
45
48
|
# Setup the BarConversion Object
|
|
46
49
|
conversion = Gruff::BarConversion.new(
|
|
@@ -93,6 +96,7 @@ private
|
|
|
93
96
|
end
|
|
94
97
|
end
|
|
95
98
|
|
|
99
|
+
# @rbs return: Array[Gruff::Box::BoxData]
|
|
96
100
|
def normalized_boxes
|
|
97
101
|
@normalized_boxes ||= store.norm_data.map { |data| Gruff::Box::BoxData.new(data.label, data.points, data.color) }
|
|
98
102
|
end
|
|
@@ -113,6 +117,10 @@ private
|
|
|
113
117
|
attr_accessor :points #: Array[Float | Integer]
|
|
114
118
|
attr_accessor :color #: String
|
|
115
119
|
|
|
120
|
+
# @rbs label: String
|
|
121
|
+
# @rbs points: Array[Float | Integer]
|
|
122
|
+
# @rbs color: String
|
|
123
|
+
# @rbs return: void
|
|
116
124
|
def initialize(label, points, color)
|
|
117
125
|
@label = label
|
|
118
126
|
@points = points.compact.sort
|
data/lib/gruff/bubble.rb
CHANGED
|
@@ -60,6 +60,7 @@ class Gruff::Bubble < Gruff::Scatter
|
|
|
60
60
|
# @rbs y_data_points: Array[nil | Float | Integer] | nil
|
|
61
61
|
# @rbs point_sizes: Array[nil | Float | Integer] | nil
|
|
62
62
|
# @rbs color: String
|
|
63
|
+
# @rbs return: void
|
|
63
64
|
def data(name, x_data_points = [], y_data_points = [], point_sizes = [], color = nil)
|
|
64
65
|
# make sure it's an array
|
|
65
66
|
x_data_points = Array(x_data_points)
|
|
@@ -78,10 +79,12 @@ class Gruff::Bubble < Gruff::Scatter
|
|
|
78
79
|
|
|
79
80
|
private
|
|
80
81
|
|
|
82
|
+
# @rbs return: void
|
|
81
83
|
def initialize_store
|
|
82
84
|
@store = Gruff::Store.new(Gruff::Store::XYPointsizeData)
|
|
83
85
|
end
|
|
84
86
|
|
|
87
|
+
# @rbs return: void
|
|
85
88
|
def initialize_attributes
|
|
86
89
|
super
|
|
87
90
|
|
|
@@ -89,6 +92,7 @@ private
|
|
|
89
92
|
@stroke_width = 1.0
|
|
90
93
|
end
|
|
91
94
|
|
|
95
|
+
# @rbs return: void
|
|
92
96
|
def draw_graph
|
|
93
97
|
store.norm_data.each do |data_row|
|
|
94
98
|
data_row.coordinate_and_pointsizes.each do |x_value, y_value, point_size|
|
data/lib/gruff/bullet.rb
CHANGED
|
@@ -31,6 +31,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
31
31
|
self.theme = Gruff::Themes::GREYSCALE
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
# @rbs return: void
|
|
34
35
|
def initialize_attributes
|
|
35
36
|
super
|
|
36
37
|
|
|
@@ -42,6 +43,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
42
43
|
# @rbs value: Float | Integer
|
|
43
44
|
# @rbs maximum_value: Float | Integer
|
|
44
45
|
# @rbs options: Hash[Symbol, Float | Integer]
|
|
46
|
+
# @rbs return: void
|
|
45
47
|
def data(value, maximum_value, options = {})
|
|
46
48
|
@value = value.to_f
|
|
47
49
|
self.maximum_value = maximum_value.to_f
|
|
@@ -49,6 +51,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
49
51
|
@options.map { |k, v| @options[k] = v.to_f if v.respond_to?(:to_f) }
|
|
50
52
|
end
|
|
51
53
|
|
|
54
|
+
# @rbs return: void
|
|
52
55
|
def draw
|
|
53
56
|
# TODO: Left label
|
|
54
57
|
# TODO Bottom labels and markers
|
|
@@ -95,6 +98,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
95
98
|
|
|
96
99
|
private
|
|
97
100
|
|
|
101
|
+
# @rbs return: void
|
|
98
102
|
def draw_title
|
|
99
103
|
return if hide_title?
|
|
100
104
|
|
data/lib/gruff/candlestick.rb
CHANGED
|
@@ -36,6 +36,7 @@ class Gruff::Candlestick < Gruff::Base
|
|
|
36
36
|
# Default value is +0.9+.
|
|
37
37
|
#
|
|
38
38
|
# @rbs space_percent: Float | Integer
|
|
39
|
+
# @rbs return: void
|
|
39
40
|
def spacing_factor=(space_percent)
|
|
40
41
|
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
|
41
42
|
|
|
@@ -43,11 +44,13 @@ class Gruff::Candlestick < Gruff::Base
|
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
# The sort feature is not supported in this graph.
|
|
47
|
+
# @rbs return: void
|
|
46
48
|
def sort=(_value)
|
|
47
49
|
raise 'Not support #sort= in Gruff::Candlestick'
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
# The sort feature is not supported in this graph.
|
|
53
|
+
# @rbs return: void
|
|
51
54
|
def sorted_drawing=(_value)
|
|
52
55
|
raise 'Not support #sorted_drawing= in Gruff::Candlestick'
|
|
53
56
|
end
|
|
@@ -56,12 +59,14 @@ class Gruff::Candlestick < Gruff::Base
|
|
|
56
59
|
# @rbs high: Float | Integer
|
|
57
60
|
# @rbs open: Float | Integer
|
|
58
61
|
# @rbs close: Float | Integer
|
|
62
|
+
# @rbs return: void
|
|
59
63
|
def data(low:, high:, open:, close:)
|
|
60
64
|
super('', [low, high, open, close])
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
private
|
|
64
68
|
|
|
69
|
+
# @rbs return: void
|
|
65
70
|
def initialize_attributes
|
|
66
71
|
super
|
|
67
72
|
@show_vertical_markers = false
|
|
@@ -74,6 +79,7 @@ private
|
|
|
74
79
|
@hide_legend = true
|
|
75
80
|
end
|
|
76
81
|
|
|
82
|
+
# @rbs return: void
|
|
77
83
|
def draw_graph
|
|
78
84
|
# Setup the BarConversion Object
|
|
79
85
|
conversion = Gruff::BarConversion.new(
|
|
@@ -81,7 +87,7 @@ private
|
|
|
81
87
|
minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
|
|
82
88
|
)
|
|
83
89
|
|
|
84
|
-
width =
|
|
90
|
+
width = @graph_width / calculate_spacing
|
|
85
91
|
bar_width = width * @spacing_factor
|
|
86
92
|
padding = width - bar_width
|
|
87
93
|
|
|
@@ -106,6 +112,7 @@ private
|
|
|
106
112
|
end
|
|
107
113
|
end
|
|
108
114
|
|
|
115
|
+
# @rbs return: Array[Gruff::Candlestick::CandlestickData]
|
|
109
116
|
def normalized_candlesticks
|
|
110
117
|
@normalized_candlesticks ||= store.norm_data.map { |data| Gruff::Candlestick::CandlestickData.new(*data.points) } # steep:ignore
|
|
111
118
|
end
|
|
@@ -115,9 +122,9 @@ private
|
|
|
115
122
|
normalized_candlesticks.size
|
|
116
123
|
end
|
|
117
124
|
|
|
118
|
-
# @rbs return:
|
|
125
|
+
# @rbs return: Float
|
|
119
126
|
def calculate_spacing
|
|
120
|
-
column_count
|
|
127
|
+
column_count.to_f
|
|
121
128
|
end
|
|
122
129
|
|
|
123
130
|
# @rbs return: bool
|
|
@@ -127,11 +134,16 @@ private
|
|
|
127
134
|
|
|
128
135
|
# @private
|
|
129
136
|
class CandlestickData
|
|
130
|
-
attr_accessor :low
|
|
131
|
-
attr_accessor :high
|
|
132
|
-
attr_accessor :open
|
|
133
|
-
attr_accessor :close
|
|
134
|
-
|
|
137
|
+
attr_accessor :low #: Float | Integer
|
|
138
|
+
attr_accessor :high #: Float | Integer
|
|
139
|
+
attr_accessor :open #: Float | Integer
|
|
140
|
+
attr_accessor :close #: Float | Integer
|
|
141
|
+
|
|
142
|
+
# @rbs low: Float | Integer
|
|
143
|
+
# @rbs high: Float | Integer
|
|
144
|
+
# @rbs open: Float | Integer
|
|
145
|
+
# @rbs close: Float | Integer
|
|
146
|
+
# @rbs return: void
|
|
135
147
|
def initialize(low, high, open, close)
|
|
136
148
|
@low = low.to_f
|
|
137
149
|
@high = high.to_f
|
data/lib/gruff/dot.rb
CHANGED
|
@@ -29,6 +29,7 @@ class Gruff::Dot < Gruff::Base
|
|
|
29
29
|
|
|
30
30
|
private
|
|
31
31
|
|
|
32
|
+
# @rbs return: void
|
|
32
33
|
def initialize_attributes
|
|
33
34
|
super
|
|
34
35
|
@hide_labels = false
|
|
@@ -49,6 +50,7 @@ private
|
|
|
49
50
|
@hide_line_markers && @x_axis_label.nil? && @legend_at_bottom == false
|
|
50
51
|
end
|
|
51
52
|
|
|
53
|
+
# @rbs return: void
|
|
52
54
|
def draw_graph
|
|
53
55
|
# Setup spacing.
|
|
54
56
|
#
|
|
@@ -76,6 +78,7 @@ private
|
|
|
76
78
|
end
|
|
77
79
|
|
|
78
80
|
# Instead of base class version, draws vertical background lines and label
|
|
81
|
+
# @rbs return: void
|
|
79
82
|
def draw_line_markers
|
|
80
83
|
return if @hide_line_markers
|
|
81
84
|
|
|
@@ -98,6 +101,7 @@ private
|
|
|
98
101
|
|
|
99
102
|
# @rbs y_offset: Float | Integer
|
|
100
103
|
# @rbs index: Integer
|
|
104
|
+
# @rbs return: void
|
|
101
105
|
def draw_label(y_offset, index)
|
|
102
106
|
draw_unique_label(index) do
|
|
103
107
|
draw_label_at(@graph_left - @label_margin, 1.0, 0.0, y_offset, @labels[index], gravity: Magick::EastGravity)
|
data/lib/gruff/font.rb
CHANGED
|
@@ -26,6 +26,7 @@ class Gruff::Font
|
|
|
26
26
|
# @rbs size: Float | Integer
|
|
27
27
|
# @rbs bold: bool
|
|
28
28
|
# @rbs color: String
|
|
29
|
+
# @rbs return: void
|
|
29
30
|
def initialize(path: nil, size: 20.0, bold: false, color: 'white')
|
|
30
31
|
@path = path
|
|
31
32
|
@bold = bold
|
|
@@ -36,6 +37,7 @@ class Gruff::Font
|
|
|
36
37
|
# Get font weight.
|
|
37
38
|
# @return [Magick::WeightType] font weight
|
|
38
39
|
# TODO: type annotation of return value
|
|
40
|
+
# @rbs return: untyped
|
|
39
41
|
def weight
|
|
40
42
|
@bold ? Magick::BoldWeight : Magick::NormalWeight
|
|
41
43
|
end
|
|
@@ -45,6 +45,7 @@ module Gruff::BarValueLabel
|
|
|
45
45
|
# @rbs format: nil | String | Proc
|
|
46
46
|
# @rbs proc_text_metrics: Proc
|
|
47
47
|
# @rbs yields: (Float | Integer, Float | Integer, String, Float, Float) -> void
|
|
48
|
+
# @rbs return: void
|
|
48
49
|
def prepare_rendering(format, proc_text_metrics)
|
|
49
50
|
left_x, left_y, _right_x, _right_y = @coordinate
|
|
50
51
|
val, metrics = Gruff::BarValueLabel.metrics(@value, format, proc_text_metrics)
|
|
@@ -59,6 +60,7 @@ module Gruff::BarValueLabel
|
|
|
59
60
|
# @rbs format: nil | String | Proc
|
|
60
61
|
# @rbs proc_text_metrics: Proc
|
|
61
62
|
# @rbs yields: (Float | Integer, Float | Integer, String, Float, Float) -> void
|
|
63
|
+
# @rbs return: void
|
|
62
64
|
def prepare_rendering(format, proc_text_metrics)
|
|
63
65
|
left_x, left_y, right_x, _right_y = @coordinate
|
|
64
66
|
val, metrics = Gruff::BarValueLabel.metrics(@value, format, proc_text_metrics)
|
data/lib/gruff/histogram.rb
CHANGED
|
@@ -35,12 +35,14 @@ class Gruff::Histogram < Gruff::Bar
|
|
|
35
35
|
# @rbs name: String | Symbol
|
|
36
36
|
# @rbs data_points: Array[Float | Integer] | nil
|
|
37
37
|
# @rbs color: String
|
|
38
|
+
# @rbs return: void
|
|
38
39
|
def data(name, data_points = [], color = nil)
|
|
39
40
|
@data << [name, Array(data_points), color]
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
private
|
|
43
44
|
|
|
45
|
+
# @rbs return: void
|
|
44
46
|
def initialize_attributes
|
|
45
47
|
super
|
|
46
48
|
@bin_width = 10
|
|
@@ -48,6 +50,7 @@ private
|
|
|
48
50
|
@maximum_bin = nil
|
|
49
51
|
end
|
|
50
52
|
|
|
53
|
+
# @rbs return: void
|
|
51
54
|
def setup_data
|
|
52
55
|
@data.each do |(name, data_points, color)|
|
|
53
56
|
if data_points.empty?
|