gruff 0.6.0-java → 0.11.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +14 -0
  3. data/.github/ISSUE_TEMPLATE.md +18 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +109 -0
  6. data/.rubocop_todo.yml +112 -0
  7. data/.travis.yml +24 -15
  8. data/.yardopts +1 -0
  9. data/{History.txt → CHANGELOG.md} +72 -25
  10. data/Gemfile +3 -7
  11. data/README.md +57 -25
  12. data/Rakefile +21 -192
  13. data/assets/plastik/blue.png +0 -0
  14. data/assets/plastik/green.png +0 -0
  15. data/assets/plastik/red.png +0 -0
  16. data/docker/Dockerfile +14 -0
  17. data/docker/build.sh +4 -0
  18. data/docker/launch.sh +4 -0
  19. data/gruff.gemspec +21 -13
  20. data/init.rb +2 -0
  21. data/lib/gruff.rb +26 -2
  22. data/lib/gruff/accumulator_bar.rb +18 -8
  23. data/lib/gruff/area.rb +33 -19
  24. data/lib/gruff/bar.rb +76 -45
  25. data/lib/gruff/base.rb +435 -704
  26. data/lib/gruff/bezier.rb +32 -17
  27. data/lib/gruff/bullet.rb +62 -68
  28. data/lib/gruff/dot.rb +38 -82
  29. data/lib/gruff/helper/bar_conversion.rb +47 -0
  30. data/lib/gruff/helper/bar_value_label_mixin.rb +30 -0
  31. data/lib/gruff/helper/stacked_mixin.rb +23 -0
  32. data/lib/gruff/histogram.rb +60 -0
  33. data/lib/gruff/line.rb +134 -170
  34. data/lib/gruff/mini/bar.rb +17 -10
  35. data/lib/gruff/mini/legend.rb +24 -36
  36. data/lib/gruff/mini/pie.rb +18 -12
  37. data/lib/gruff/mini/side_bar.rb +26 -12
  38. data/lib/gruff/net.rb +68 -81
  39. data/lib/gruff/patch/rmagick.rb +33 -0
  40. data/lib/gruff/patch/string.rb +10 -0
  41. data/lib/gruff/photo_bar.rb +39 -42
  42. data/lib/gruff/pie.rb +180 -89
  43. data/lib/gruff/renderer/bezier.rb +21 -0
  44. data/lib/gruff/renderer/circle.rb +21 -0
  45. data/lib/gruff/renderer/dash_line.rb +22 -0
  46. data/lib/gruff/renderer/dot.rb +39 -0
  47. data/lib/gruff/renderer/ellipse.rb +21 -0
  48. data/lib/gruff/renderer/line.rb +42 -0
  49. data/lib/gruff/renderer/polygon.rb +23 -0
  50. data/lib/gruff/renderer/polyline.rb +21 -0
  51. data/lib/gruff/renderer/rectangle.rb +19 -0
  52. data/lib/gruff/renderer/renderer.rb +132 -0
  53. data/lib/gruff/renderer/text.rb +53 -0
  54. data/lib/gruff/scatter.rb +163 -182
  55. data/lib/gruff/scene.rb +31 -41
  56. data/lib/gruff/side_bar.rb +81 -65
  57. data/lib/gruff/side_stacked_bar.rb +78 -62
  58. data/lib/gruff/spider.rb +49 -57
  59. data/lib/gruff/stacked_area.rb +40 -32
  60. data/lib/gruff/stacked_bar.rb +86 -53
  61. data/lib/gruff/store/base_data.rb +38 -0
  62. data/lib/gruff/store/custom_data.rb +38 -0
  63. data/lib/gruff/store/store.rb +80 -0
  64. data/lib/gruff/store/xy_data.rb +59 -0
  65. data/lib/gruff/themes.rb +32 -33
  66. data/lib/gruff/version.rb +3 -1
  67. metadata +80 -102
  68. data/Manifest.txt +0 -81
  69. data/RELEASE.md +0 -30
  70. data/assets/bubble.png +0 -0
  71. data/assets/city_scene/background/0000.png +0 -0
  72. data/assets/city_scene/background/0600.png +0 -0
  73. data/assets/city_scene/background/2000.png +0 -0
  74. data/assets/city_scene/clouds/cloudy.png +0 -0
  75. data/assets/city_scene/clouds/partly_cloudy.png +0 -0
  76. data/assets/city_scene/clouds/stormy.png +0 -0
  77. data/assets/city_scene/grass/default.png +0 -0
  78. data/assets/city_scene/haze/true.png +0 -0
  79. data/assets/city_scene/number_sample/1.png +0 -0
  80. data/assets/city_scene/number_sample/2.png +0 -0
  81. data/assets/city_scene/number_sample/default.png +0 -0
  82. data/assets/city_scene/sky/0000.png +0 -0
  83. data/assets/city_scene/sky/0200.png +0 -0
  84. data/assets/city_scene/sky/0400.png +0 -0
  85. data/assets/city_scene/sky/0600.png +0 -0
  86. data/assets/city_scene/sky/0800.png +0 -0
  87. data/assets/city_scene/sky/1000.png +0 -0
  88. data/assets/city_scene/sky/1200.png +0 -0
  89. data/assets/city_scene/sky/1400.png +0 -0
  90. data/assets/city_scene/sky/1500.png +0 -0
  91. data/assets/city_scene/sky/1700.png +0 -0
  92. data/assets/city_scene/sky/2000.png +0 -0
  93. data/assets/pc306715.jpg +0 -0
  94. data/lib/gruff/bar_conversion.rb +0 -46
  95. data/lib/gruff/deprecated.rb +0 -39
  96. data/lib/gruff/stacked_mixin.rb +0 -23
  97. data/test/gruff_test_case.rb +0 -154
  98. data/test/image_compare.rb +0 -58
  99. data/test/test_accumulator_bar.rb +0 -51
  100. data/test/test_area.rb +0 -134
  101. data/test/test_bar.rb +0 -505
  102. data/test/test_base.rb +0 -8
  103. data/test/test_bezier.rb +0 -33
  104. data/test/test_bullet.rb +0 -26
  105. data/test/test_dot.rb +0 -263
  106. data/test/test_labels_for_null_data.rb +0 -27
  107. data/test/test_legend.rb +0 -68
  108. data/test/test_line.rb +0 -657
  109. data/test/test_mini_bar.rb +0 -33
  110. data/test/test_mini_pie.rb +0 -25
  111. data/test/test_mini_side_bar.rb +0 -36
  112. data/test/test_net.rb +0 -231
  113. data/test/test_photo.rb +0 -41
  114. data/test/test_pie.rb +0 -161
  115. data/test/test_scatter.rb +0 -233
  116. data/test/test_scene.rb +0 -100
  117. data/test/test_side_bar.rb +0 -56
  118. data/test/test_sidestacked_bar.rb +0 -105
  119. data/test/test_spider.rb +0 -226
  120. data/test/test_stacked_area.rb +0 -52
  121. data/test/test_stacked_bar.rb +0 -68
@@ -1,233 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + '/gruff_test_case'
4
-
5
- class TestGruffScatter < Test::Unit::TestCase
6
-
7
- def setup
8
- @datasets = [
9
- [:Chuck, [20, 10, 5, 12, 11, 6, 10, 7], [5, 10, 19, 6, 9, 1, 14, 8]],
10
- [:Brown, [5, 10, 20, 6, 9, 12, 14, 8], [20, 10, 5, 12, 11, 6, 10, 7]],
11
- [:Lucy, [19, 9, 6, 11, 12, 7, 15, 8], [6, 11, 18, 8, 12, 8, 10, 6]]
12
- ]
13
- end
14
-
15
- # Done
16
- def test_scatter_graph
17
- g = setup_basic_graph
18
- g.title = 'Basic Scatter Plot Test'
19
- g.write('test/output/scatter_basic.png')
20
- end
21
-
22
- #~ # Done
23
- def test_many_datapoints
24
- g = Gruff::Scatter.new
25
- g.title = 'Many Datapoint Graph Test'
26
- y_values = (0..50).map { rand(100) }
27
- x_values = (0..50).map { rand(100) }
28
- g.data('many points', x_values, y_values)
29
-
30
- # Default theme
31
- g.write('test/output/scatter_many.png')
32
- end
33
-
34
- # Done
35
- def test_no_data
36
- g = Gruff::Scatter.new(400)
37
- g.title = 'No Data'
38
- # Default theme
39
- g.write('test/output/scatter_no_data.png')
40
-
41
- g = Gruff::Scatter.new(400)
42
- g.title = 'No Data Title'
43
- g.no_data_message = 'There is no data'
44
- g.write('test/output/scatter_no_data_msg.png')
45
- end
46
-
47
- # Done
48
- def test_all_zeros
49
- g = Gruff::Scatter.new(400)
50
- g.title = 'All Zeros'
51
-
52
- g.data(:gus, [0, 0, 0, 0], [0, 0, 0, 0])
53
-
54
- # Default theme
55
- g.write('test/output/scatter_no_data_other.png')
56
- end
57
-
58
- # Done
59
- def test_some_nil_points
60
- g = Gruff::Scatter.new
61
- g.title = 'Some Nil Points'
62
-
63
- @datasets = [
64
- [:data1, [1, 2, 3, nil, 3, 5, 6], [5, nil, nil, nil, nil, 5, 7]]
65
- ]
66
-
67
- @datasets.each do |data|
68
- assert_raise ArgumentError do
69
- g.data(*data)
70
- end
71
- end
72
- end
73
-
74
- # Done
75
- def test_unequal_number_of_x_and_y_values
76
- g = Gruff::Scatter.new
77
- g.title = 'Unequal number of X and Y values'
78
-
79
- @datasets = [
80
- [:data1, [1, 2, 3], [1, 2]],
81
- [:data2, [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6]],
82
- ]
83
-
84
- @datasets.each do |data|
85
- assert_raise ArgumentError do
86
- g.data(*data)
87
- end
88
- end
89
- end
90
-
91
- # Done
92
- def test_empty_set_of_axis_values
93
- g = Gruff::Scatter.new
94
- g.title = 'Missing Axis Values'
95
-
96
- @datasets = [
97
- [:data1, [1, 2, 3, 4, 5]]
98
- ]
99
-
100
- @datasets.each do |data|
101
- assert_raise ArgumentError do
102
- g.data(*data)
103
- end
104
- end
105
- end
106
-
107
- # Done
108
- def test_no_title
109
- g = Gruff::Scatter.new(400)
110
- g.data(:data1, [1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
111
- g.write('test/output/scatter_no_title.png')
112
- end
113
-
114
- # Done
115
- def test_no_line_markers
116
- g = setup_basic_graph(400)
117
- g.title = 'No Line Markers'
118
- g.hide_line_markers = true
119
- g.write('test/output/scatter_no_line_markers.png')
120
- end
121
-
122
- # Done
123
- def test_no_legend
124
- g = setup_basic_graph(400)
125
- g.title = 'No Legend'
126
- g.hide_legend = true
127
- g.write('test/output/scatter_no_legend.png')
128
- end
129
-
130
- # Done
131
- def test_nothing_but_the_graph
132
- g = setup_basic_graph(400)
133
- g.title = 'THIS TITLE SHOULD NOT DISPLAY!!!'
134
- g.hide_line_markers = true
135
- g.hide_legend = true
136
- g.hide_title = true
137
- g.write('test/output/scatter_nothing_but_the_graph.png')
138
- end
139
-
140
- # TODO Implement baselines on x and y axis
141
- #~ def test_baseline_larger_than_data
142
- #~ g = setup_basic_graph(400)
143
- #~ g.title = "Baseline Larger Than Data"
144
- #~ g.baseline_value = 150
145
- #~ g.write("test/output/scatter_large_baseline.png")
146
- #~ end
147
-
148
- # Done
149
- def test_wide_graph
150
- g = setup_basic_graph('800x400')
151
- g.title = 'Wide Graph'
152
- g.write('test/output/scatter_wide_graph.png')
153
-
154
- g = setup_basic_graph('400x200')
155
- g.title = 'Wide Graph Small'
156
- g.write('test/output/scatter_wide_graph_small.png')
157
- end
158
-
159
- # Done
160
- def test_negative
161
- g = setup_pos_neg(800)
162
- g.write('test/output/scatter_pos_neg.png')
163
-
164
- g = setup_pos_neg(400)
165
- g.title = 'Pos/Neg Line Test Small'
166
- g.write('test/output/scatter_pos_neg_400.png')
167
- end
168
-
169
- # Done
170
- def test_all_negative
171
- g = setup_all_neg(800)
172
- g.write('test/output/scatter_all_neg.png')
173
-
174
- g = setup_all_neg(400)
175
- g.title = 'All Neg Line Test Small'
176
- g.write('test/output/scatter_all_neg_400.png')
177
- end
178
-
179
- # Done
180
- def test_no_hide_line_no_labels
181
- g = Gruff::Scatter.new
182
- g.title = 'No Hide Line No Labels'
183
- @datasets.each do |data|
184
- g.data(data[0], data[1], data[2])
185
- end
186
- g.hide_line_markers = false
187
- g.write('test/output/scatter_no_hide.png')
188
- end
189
-
190
- def test_no_set_labels
191
- g = Gruff::Scatter.new
192
- g.title = 'Setting Labels Test'
193
- g.labels = {
194
- 0 => 'This',
195
- 1 => 'should',
196
- 2 => 'not',
197
- 3 => 'show',
198
- 4 => 'up'
199
- }
200
- @datasets.each do |data|
201
- g.data(data[0], data[1], data[2])
202
- end
203
- g.write('test/output/scatter_no_labels.png')
204
- end
205
-
206
- protected
207
-
208
- def setup_basic_graph(size=800)
209
- g = Gruff::Scatter.new(size)
210
- g.title = 'Rad Graph'
211
- @datasets.each do |data|
212
- g.data(data[0], data[1], data[2])
213
- end
214
- g
215
- end
216
-
217
- def setup_pos_neg(size=800)
218
- g = Gruff::Scatter.new(size)
219
- g.title = 'Pos/Neg Scatter Graph Test'
220
- g.data(:apples, [-1, 0, 4, -4], [-5, -1, 3, 4])
221
- g.data(:peaches, [10, 8, 6, 3], [-1, 1, 3, 3])
222
- g
223
- end
224
-
225
- def setup_all_neg(size=800)
226
- g = Gruff::Scatter.new(size)
227
- g.title = 'Neg Scatter Graph Test'
228
- g.data(:apples, [-1, -1, -4, -4], [-5, -1, -3, -4])
229
- g.data(:peaches, [-10, -8, -6, -3], [-1, -1, -3, -3])
230
- g
231
- end
232
-
233
- end # end GruffTestCase
@@ -1,100 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + "/gruff_test_case"
4
- require 'yaml'
5
-
6
- class LayerStub < Gruff::Layer; attr_reader :base_dir, :filenames, :selected_filename; end
7
-
8
- class TestGruffScene < GruffTestCase
9
-
10
- def test_hazy
11
- g = setup_scene
12
- g.weather = "cloudy"
13
- g.haze = true
14
- g.time = Time.mktime(2006, 7, 4, 4, 35)
15
- g.write "test/output/scene_hazy_night.png"
16
- end
17
-
18
- def test_stormy_night
19
- g = setup_scene
20
- g.weather = "stormy"
21
- g.time = Time.mktime(2006, 7, 4, 0, 0)
22
- g.write "test/output/scene_stormy_night.png"
23
- end
24
-
25
-
26
- def test_not_hazy
27
- g = setup_scene
28
- g.weather = "cloudy"
29
- g.haze = false
30
- g.time = Time.mktime(2006, 7, 4, 6, 00)
31
- g.write "test/output/scene_not_hazy_day.png"
32
- end
33
-
34
- def test_partly_cloudy
35
- g = setup_scene
36
- g.weather = "partly cloudy"
37
- g.haze = false
38
- g.time = Time.mktime(2006, 7, 4, 13, 00)
39
- g.write "test/output/scene_partly_cloudy_day.png"
40
- end
41
-
42
-
43
- def test_stormy_day
44
- g = setup_scene
45
- g.weather = "stormy"
46
- g.haze = false
47
- g.time = Time.mktime(2006, 7, 4, 8, 00)
48
- g.write "test/output/scene_stormy_day.png"
49
- end
50
-
51
-
52
- def test_layer
53
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "clouds")
54
- assert_equal %w(cloudy.png partly_cloudy.png stormy.png), l.filenames.sort
55
-
56
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "grass")
57
- assert_equal 'default.png', l.selected_filename
58
-
59
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
60
- l.update Time.mktime(2006, 7, 4, 12, 35) # 12:35, July 4, 2006
61
- assert_equal '1200.png', l.selected_filename
62
-
63
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
64
- l.update Time.mktime(2006, 7, 4, 0, 0) # 00:00, July 4, 2006
65
- assert_equal '0000.png', l.selected_filename
66
-
67
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
68
- l.update Time.mktime(2006, 7, 4, 23, 35) # 23:35, July 4, 2006
69
- assert_equal '2000.png', l.selected_filename
70
-
71
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
72
- l.update Time.mktime(2006, 7, 4, 0, 1) # 00:01, July 4, 2006
73
- assert_equal '0000.png', l.selected_filename
74
-
75
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
76
- l.update Time.mktime(2006, 7, 4, 2, 0) # 02:00, July 4, 2006
77
- assert_equal '0200.png', l.selected_filename
78
-
79
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
80
- l.update Time.mktime(2006, 7, 4, 4, 00) # 04:00, July 4, 2006
81
- assert_equal '0400.png', l.selected_filename
82
-
83
- # TODO Need number_sample folder
84
- # l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "number_sample")
85
- # assert_equal %w(1.png 2.png default.png), l.filenames
86
- # l.update 3
87
- # assert_equal 'default.png', l.selected_filename
88
- end
89
-
90
- private
91
-
92
- def setup_scene
93
- g = Gruff::Scene.new("500x100", File.expand_path("../assets/city_scene", File.dirname(__FILE__)) )
94
- g.layers = %w(background haze sky clouds)
95
- g.weather_group = %w(clouds)
96
- g.time_group = %w(background sky)
97
- g
98
- end
99
-
100
- end
@@ -1,56 +0,0 @@
1
-
2
- require File.dirname(__FILE__) + "/gruff_test_case"
3
-
4
- class TestGruffSideBar < GruffTestCase
5
-
6
- def test_bar_graph
7
- g = setup_basic_graph(Gruff::SideBar, 800)
8
- write_test_file g, 'side_bar.png'
9
- end
10
-
11
- def test_bar_spacing
12
- g = setup_basic_graph(Gruff::SideBar, 800)
13
- g.bar_spacing = 0
14
- g.title = "100% spacing between bars"
15
- g.write("test/output/side_bar_spacing_full.png")
16
-
17
- g = setup_basic_graph(Gruff::SideBar, 800)
18
- g.bar_spacing = 0.5
19
- g.title = "50% spacing between bars"
20
- g.write("test/output/side_bar_spacing_half.png")
21
-
22
- g = setup_basic_graph(Gruff::SideBar, 800)
23
- g.bar_spacing = 1
24
- g.title = "0% spacing between bars"
25
- g.write("test/output/side_bar_spacing_none.png")
26
- end
27
-
28
- def test_x_axis_range
29
- g = Gruff::SideBar.new('400x300')
30
- g.title = 'Should run from 8 to 32'
31
- g.hide_line_numbers = false
32
- g.theme_37signals
33
- g.data("Grapes", [8])
34
- g.data("Apples", [24])
35
- g.data("Oranges", [32])
36
- g.data("Watermelon", [8])
37
- g.data("Peaches", [12])
38
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
39
- g.write("test/output/side_bar_data_range.png")
40
- end
41
-
42
- def test_bar_labels
43
- g = Gruff::SideBar.new('400x300')
44
- g.title = 'Should show labels for each bar'
45
- g.data("Grapes", [8])
46
- g.data("Apples", [24])
47
- g.data("Oranges", [32])
48
- g.data("Watermelon", [8])
49
- g.data("Peaches", [12])
50
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
51
- g.show_labels_for_bar_values = true
52
- g.write("test/output/side_bar_labels.png")
53
- end
54
-
55
- end
56
-
@@ -1,105 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + "/gruff_test_case"
4
-
5
- class TestGruffSideStackedBar < GruffTestCase
6
-
7
- def setup
8
- @datasets = [
9
- [:Jimmy, [25, 36, 86, 39]],
10
- [:Charles, [80, 54, 67, 54]],
11
- [:Julie, [22, 29, 35, 38]],
12
- #[:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
13
- #[:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
14
- #["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
15
- ]
16
- @sample_labels = {
17
- 0 => '5/6',
18
- 1 => '5/15',
19
- 2 => '5/24'
20
- }
21
-
22
- end
23
-
24
- def test_bar_graph
25
- g = Gruff::SideStackedBar.new
26
- g.title = "Visual Stacked Bar Graph Test"
27
- g.labels = {
28
- 0 => '5/6',
29
- 1 => '5/15',
30
- 2 => '5/24',
31
- 3 => '5/30',
32
- }
33
- @datasets.each do |data|
34
- g.data(data[0], data[1])
35
- end
36
- g.write "test/output/side_stacked_bar_keynote.png"
37
- end
38
-
39
-
40
- def test_bar_graph_small
41
- g = Gruff::SideStackedBar.new(400)
42
- g.title = "Visual Stacked Bar Graph Test"
43
- g.labels = {
44
- 0 => '5/6',
45
- 1 => '5/15',
46
- 2 => '5/24',
47
- 3 => '5/30',
48
- }
49
- @datasets.each do |data|
50
- g.data(data[0], data[1])
51
- end
52
- g.write "test/output/side_stacked_bar_keynote_small.png"
53
- end
54
-
55
- def test_wide
56
- g = setup_basic_graph('800x400')
57
- g.title = "Wide SSBar"
58
- g.write "test/output/side_stacked_bar_wide.png"
59
- end
60
-
61
- def test_should_space_long_left_labels_appropriately
62
- g = Gruff::SideStackedBar.new
63
- g.title = "Stacked Bar Long Label"
64
- g.labels = {
65
- 0 => 'September',
66
- 1 => 'Oct',
67
- 2 => 'Nov',
68
- 3 => 'Dec',
69
- }
70
- @datasets.each do |data|
71
- g.data(data[0], data[1])
72
- end
73
- g.write "test/output/side_stacked_bar_long_label.png"
74
- end
75
-
76
- def test_bar_labels
77
- g = Gruff::SideStackedBar.new
78
- g.title = "Stacked Bar Long Label"
79
- g.labels = {
80
- 0 => 'September',
81
- 1 => 'Oct',
82
- 2 => 'Nov',
83
- 3 => 'Dec',
84
- }
85
- @datasets.each do |data|
86
- g.data(data[0], data[1])
87
- end
88
- g.show_labels_for_bar_values = true
89
- g.write "test/output/side_stacked_bar_labels.png"
90
- end
91
-
92
- protected
93
-
94
- def setup_basic_graph(size=800)
95
- g = Gruff::SideStackedBar.new(size)
96
- g.title = "My Graph Title"
97
- g.labels = @sample_labels
98
- @datasets.each do |data|
99
- g.data(data[0], data[1])
100
- end
101
- return g
102
- end
103
-
104
- end
105
-