gruff 0.12.2 → 0.15.0

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +66 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +34 -27
  5. data/CHANGELOG.md +29 -0
  6. data/README.md +15 -7
  7. data/assets/fonts/LICENSE.txt +202 -0
  8. data/assets/fonts/Roboto-Bold.ttf +0 -0
  9. data/assets/fonts/Roboto-Regular.ttf +0 -0
  10. data/gruff.gemspec +9 -10
  11. data/lib/gruff/accumulator_bar.rb +3 -1
  12. data/lib/gruff/area.rb +5 -8
  13. data/lib/gruff/bar.rb +32 -49
  14. data/lib/gruff/base.rb +199 -115
  15. data/lib/gruff/bezier.rb +4 -6
  16. data/lib/gruff/bullet.rb +12 -11
  17. data/lib/gruff/dot.rb +13 -14
  18. data/lib/gruff/font.rb +39 -0
  19. data/lib/gruff/helper/bar_conversion.rb +27 -12
  20. data/lib/gruff/helper/bar_value_label.rb +71 -0
  21. data/lib/gruff/helper/stacked_mixin.rb +1 -2
  22. data/lib/gruff/histogram.rb +9 -7
  23. data/lib/gruff/line.rb +57 -50
  24. data/lib/gruff/mini/bar.rb +9 -6
  25. data/lib/gruff/mini/legend.rb +12 -8
  26. data/lib/gruff/mini/pie.rb +9 -6
  27. data/lib/gruff/mini/side_bar.rb +9 -6
  28. data/lib/gruff/net.rb +9 -15
  29. data/lib/gruff/patch/rmagick.rb +0 -1
  30. data/lib/gruff/patch/string.rb +1 -1
  31. data/lib/gruff/pie.rb +23 -65
  32. data/lib/gruff/renderer/bezier.rb +8 -9
  33. data/lib/gruff/renderer/circle.rb +8 -9
  34. data/lib/gruff/renderer/dash_line.rb +9 -10
  35. data/lib/gruff/renderer/dot.rb +13 -14
  36. data/lib/gruff/renderer/ellipse.rb +8 -9
  37. data/lib/gruff/renderer/line.rb +8 -9
  38. data/lib/gruff/renderer/polygon.rb +9 -10
  39. data/lib/gruff/renderer/polyline.rb +8 -9
  40. data/lib/gruff/renderer/rectangle.rb +7 -8
  41. data/lib/gruff/renderer/renderer.rb +25 -40
  42. data/lib/gruff/renderer/text.rb +21 -29
  43. data/lib/gruff/scatter.rb +55 -75
  44. data/lib/gruff/scene.rb +28 -18
  45. data/lib/gruff/side_bar.rb +35 -54
  46. data/lib/gruff/side_stacked_bar.rb +14 -17
  47. data/lib/gruff/spider.rb +11 -20
  48. data/lib/gruff/stacked_area.rb +10 -11
  49. data/lib/gruff/stacked_bar.rb +14 -15
  50. data/lib/gruff/store/store.rb +6 -10
  51. data/lib/gruff/store/xy_data.rb +2 -0
  52. data/lib/gruff/themes.rb +6 -6
  53. data/lib/gruff/version.rb +1 -1
  54. data/lib/gruff.rb +68 -55
  55. data/rails_generators/gruff/templates/controller.rb +1 -1
  56. metadata +34 -20
  57. data/.rubocop_todo.yml +0 -190
  58. data/.travis.yml +0 -23
  59. data/assets/plastik/blue.png +0 -0
  60. data/assets/plastik/green.png +0 -0
  61. data/assets/plastik/red.png +0 -0
  62. data/lib/gruff/helper/bar_value_label_mixin.rb +0 -33
  63. data/lib/gruff/photo_bar.rb +0 -93
data/lib/gruff/bar.rb CHANGED
@@ -16,15 +16,13 @@
16
16
  # g.write('bar.png')
17
17
  #
18
18
  class Gruff::Bar < Gruff::Base
19
- using String::GruffCommify
20
-
21
19
  # Spacing factor applied between bars.
22
20
  attr_writer :bar_spacing
23
21
 
24
22
  # Spacing factor applied between a group of bars belonging to the same label.
25
23
  attr_writer :group_spacing
26
24
 
27
- # Set the number output format for labels using sprintf.
25
+ # Set the number output format string or lambda.
28
26
  # Default is +"%.2f"+.
29
27
  attr_writer :label_formatting
30
28
 
@@ -35,7 +33,21 @@ class Gruff::Bar < Gruff::Base
35
33
  # Prevent drawing of column labels below a bar graph. Default is +false+.
36
34
  attr_writer :hide_labels
37
35
 
38
- def initialize_ivars
36
+ # Can be used to adjust the spaces between the bars.
37
+ # Accepts values between 0.00 and 1.00 where 0.00 means no spacing at all
38
+ # and 1 means that each bars' width is nearly 0 (so each bar is a simple
39
+ # line with no x dimension).
40
+ #
41
+ # Default value is +0.9+.
42
+ def spacing_factor=(space_percent)
43
+ raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' unless (space_percent >= 0) && (space_percent <= 1)
44
+
45
+ @spacing_factor = (1 - space_percent)
46
+ end
47
+
48
+ private
49
+
50
+ def initialize_attributes
39
51
  super
40
52
  @spacing_factor = 0.9
41
53
  @group_spacing = 10
@@ -43,34 +55,16 @@ class Gruff::Bar < Gruff::Base
43
55
  @show_labels_for_bar_values = false
44
56
  @hide_labels = false
45
57
  end
46
- private :initialize_ivars
47
58
 
48
- def draw
59
+ def setup_drawing
49
60
  # Labels will be centered over the left of the bar if
50
61
  # there are more labels than columns. This is basically the same
51
62
  # as where it would be for a line graph.
52
63
  @center_labels_over_point = (@labels.keys.length > column_count)
53
64
 
54
65
  super
55
- return unless data_given?
56
-
57
- draw_bars
58
66
  end
59
67
 
60
- # Can be used to adjust the spaces between the bars.
61
- # Accepts values between 0.00 and 1.00 where 0.00 means no spacing at all
62
- # and 1 means that each bars' width is nearly 0 (so each bar is a simple
63
- # line with no x dimension).
64
- #
65
- # Default value is +0.9+.
66
- def spacing_factor=(space_percent)
67
- raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' unless (space_percent >= 0) && (space_percent <= 1)
68
-
69
- @spacing_factor = (1 - space_percent)
70
- end
71
-
72
- protected
73
-
74
68
  def hide_labels?
75
69
  @hide_labels
76
70
  end
@@ -83,7 +77,10 @@ protected
83
77
  hide_labels?
84
78
  end
85
79
 
86
- def draw_bars
80
+ # Value to avoid completely overwriting the coordinate axis
81
+ AXIS_MARGIN = 0.5
82
+
83
+ def draw_graph
87
84
  # Setup spacing.
88
85
  #
89
86
  # Columns sit side-by-side.
@@ -93,24 +90,10 @@ protected
93
90
  padding = (bar_width * (1 - @bar_spacing)) / 2
94
91
 
95
92
  # Setup the BarConversion Object
96
- conversion = Gruff::BarConversion.new
97
- conversion.graph_height = @graph_height
98
- conversion.graph_top = @graph_top
99
-
100
- # Set up the right mode [1,2,3] see BarConversion for further explanation
101
- if minimum_value >= 0
102
- # all bars go from zero to positive
103
- conversion.mode = 1
104
- elsif maximum_value <= 0
105
- # all bars go from 0 to negative
106
- conversion.mode = 2
107
- else
108
- # bars either go from zero to negative or to positive
109
- conversion.mode = 3
110
- conversion.spread = @spread
111
- conversion.minimum_value = minimum_value
112
- conversion.zero = -minimum_value / @spread
113
- end
93
+ conversion = Gruff::BarConversion.new(
94
+ top: @graph_top, bottom: @graph_bottom,
95
+ minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
96
+ )
114
97
 
115
98
  # iterate over all normalised data
116
99
  store.norm_data.each_with_index do |data_row, row_index|
@@ -122,11 +105,11 @@ protected
122
105
  left_x = @graph_left + (bar_width * (row_index + point_index + ((store.length - 1) * point_index))) + padding + group_spacing
123
106
  right_x = left_x + bar_width * @bar_spacing
124
107
  # y
125
- left_y, right_y = conversion.get_left_y_right_y_scaled(data_point)
108
+ left_y, right_y = conversion.get_top_bottom_scaled(data_point)
126
109
 
127
110
  # create new bar
128
- rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
129
- rect_renderer.render(left_x, left_y, right_x, right_y)
111
+ rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: data_row.color)
112
+ rect_renderer.render(left_x, left_y - AXIS_MARGIN, right_x, right_y - AXIS_MARGIN)
130
113
 
131
114
  # Calculate center based on bar_width and current row
132
115
  label_center = @graph_left + group_spacing + (store.length * bar_width * point_index) + (store.length * bar_width / 2.0)
@@ -134,10 +117,10 @@ protected
134
117
  # Subtract half a bar width to center left if requested
135
118
  draw_label(label_center, point_index)
136
119
  if @show_labels_for_bar_values
137
- raw_value = store.data[row_index].points[point_index]
138
- val = (@label_formatting || '%.2f') % raw_value
139
- y = raw_value >= 0 ? left_y - 30 : left_y + 12
140
- draw_value_label(left_x + (right_x - left_x) / 2, y, val.commify, true)
120
+ bar_value_label = Gruff::BarValueLabel::Bar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
121
+ bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
122
+ draw_value_label(x, y, text)
123
+ end
141
124
  end
142
125
  end
143
126
  end