gruff 0.3.7 → 0.4.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 (540) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -1
  3. data/.travis.yml +6 -0
  4. data/Gemfile +2 -8
  5. data/History.txt +76 -0
  6. data/MIT-LICENSE +3 -2
  7. data/README.md +96 -6
  8. data/RELEASE.md +92 -0
  9. data/Rakefile +203 -23
  10. data/gruff.gemspec +13 -10
  11. data/lib/gruff.rb +8 -7
  12. data/lib/gruff/accumulator_bar.rb +4 -13
  13. data/lib/gruff/area.rb +6 -13
  14. data/lib/gruff/bar.rb +24 -3
  15. data/lib/gruff/bar_conversion.rb +31 -31
  16. data/lib/gruff/base.rb +310 -267
  17. data/lib/gruff/bezier.rb +46 -0
  18. data/lib/gruff/bullet.rb +3 -1
  19. data/lib/gruff/dot.rb +56 -44
  20. data/lib/gruff/line.rb +83 -69
  21. data/lib/gruff/net.rb +7 -9
  22. data/lib/gruff/pie.rb +2 -4
  23. data/lib/gruff/scatter.rb +25 -29
  24. data/lib/gruff/side_bar.rb +54 -37
  25. data/lib/gruff/side_stacked_bar.rb +25 -5
  26. data/lib/gruff/spider.rb +22 -21
  27. data/lib/gruff/themes.rb +102 -0
  28. data/lib/gruff/version.rb +1 -1
  29. data/test/gruff_test_case.rb +68 -38
  30. data/test/image_compare.rb +58 -0
  31. data/test/output/accum_bar.png +0 -0
  32. data/test/output/area_keynote.png +0 -0
  33. data/test/output/area_keynote_small.png +0 -0
  34. data/test/output/area_many.png +0 -0
  35. data/test/output/area_many_areas_small.png +0 -0
  36. data/test/output/area_tiny.png +0 -0
  37. data/test/output/area_wide.png +0 -0
  38. data/test/output/bar2_wrapped_legend_16_400.png +0 -0
  39. data/test/output/bar2_wrapped_legend_16_800.png +0 -0
  40. data/test/output/bar2_wrapped_legend_30_400.png +0 -0
  41. data/test/output/bar2_wrapped_legend_30_800.png +0 -0
  42. data/test/output/bar2_wrapped_legend_4_400.png +0 -0
  43. data/test/output/bar2_wrapped_legend_4_800.png +0 -0
  44. data/test/output/bar2_wrapped_legend__400.png +0 -0
  45. data/test/output/bar2_wrapped_legend__800.png +0 -0
  46. data/test/output/bar_background_gradient_bottom_top.png +0 -0
  47. data/test/output/bar_background_gradient_left_right.png +0 -0
  48. data/test/output/bar_background_gradient_right_left.png +0 -0
  49. data/test/output/bar_background_gradient_top_bottom.png +0 -0
  50. data/test/output/bar_background_gradient_topleft_bottomright.png +0 -0
  51. data/test/output/bar_background_gradient_topright_bottomleft.png +0 -0
  52. data/test/output/bar_formatted_numbers.png +0 -0
  53. data/test/output/bar_keynote.png +0 -0
  54. data/test/output/bar_keynote_small.png +0 -0
  55. data/test/output/bar_long_legend_text.png +0 -0
  56. data/test/output/bar_manual_colors.png +0 -0
  57. data/test/output/bar_marker_shadow.png +0 -0
  58. data/test/output/bar_nearly_zero_max_10.png +0 -0
  59. data/test/output/bar_no_legend.png +0 -0
  60. data/test/output/bar_no_line_markers.png +0 -0
  61. data/test/output/bar_no_title.png +0 -0
  62. data/test/output/bar_no_title_or_legend.png +0 -0
  63. data/test/output/bar_odeo.png +0 -0
  64. data/test/output/bar_one_value.png +0 -0
  65. data/test/output/bar_pos_neg.png +0 -0
  66. data/test/output/bar_rails_keynote.png +0 -0
  67. data/test/output/bar_set_absolute_trunc.png +0 -0
  68. data/test/output/bar_set_label_stagger_height.png +0 -0
  69. data/test/output/bar_set_legend_box_size_lg.png +0 -0
  70. data/test/output/bar_set_legend_box_size_sm.png +0 -0
  71. data/test/output/bar_set_marker.png +0 -0
  72. data/test/output/bar_set_trailing_dots_trunc.png +0 -0
  73. data/test/output/bar_spacing_full.png +0 -0
  74. data/test/output/bar_spacing_half.png +0 -0
  75. data/test/output/bar_spacing_none.png +0 -0
  76. data/test/output/bar_tall_graph.png +0 -0
  77. data/test/output/bar_tall_graph_small.png +0 -0
  78. data/test/output/bar_themed.png +0 -0
  79. data/test/output/bar_title_margin.png +0 -0
  80. data/test/output/bar_value_labels.png +0 -0
  81. data/test/output/bar_wide_graph.png +0 -0
  82. data/test/output/bar_wide_graph_small.png +0 -0
  83. data/test/output/bar_wrapped_legend_16_400.png +0 -0
  84. data/test/output/bar_wrapped_legend_16_800.png +0 -0
  85. data/test/output/bar_wrapped_legend_30_400.png +0 -0
  86. data/test/output/bar_wrapped_legend_30_800.png +0 -0
  87. data/test/output/bar_wrapped_legend_4_400.png +0 -0
  88. data/test/output/bar_wrapped_legend_4_800.png +0 -0
  89. data/test/output/bar_wrapped_legend__400.png +0 -0
  90. data/test/output/bar_wrapped_legend__800.png +0 -0
  91. data/test/output/bar_x_y_labels.png +0 -0
  92. data/test/output/bar_y_increment_1.png +0 -0
  93. data/test/output/bar_y_increment_2.0.png +0 -0
  94. data/test/output/bar_y_increment_20.png +0 -0
  95. data/test/output/bar_y_increment_5.png +0 -0
  96. data/test/output/bar_zero_marker_count.png +0 -0
  97. data/test/output/bar_zero_spacing.png +0 -0
  98. data/test/output/bezier.png +0 -0
  99. data/test/output/bezier_2.png +0 -0
  100. data/test/output/bezier_3.png +0 -0
  101. data/test/output/bullet_greyscale.png +0 -0
  102. data/test/output/bullet_no_options.png +0 -0
  103. data/test/output/dot.png +0 -0
  104. data/test/output/dot_manual_colors.png +0 -0
  105. data/test/output/dot_nearly_zero_max_10.png +0 -0
  106. data/test/output/dot_no_legend.png +0 -0
  107. data/test/output/dot_no_line_markers.png +0 -0
  108. data/test/output/dot_no_title.png +0 -0
  109. data/test/output/dot_no_title_or_legend.png +0 -0
  110. data/test/output/dot_one_value.png +0 -0
  111. data/test/output/dot_pos_neg.png +0 -0
  112. data/test/output/dot_set_legend_box_size_lg.png +0 -0
  113. data/test/output/dot_set_legend_box_size_sm.png +0 -0
  114. data/test/output/dot_set_marker.png +0 -0
  115. data/test/output/dot_small.png +0 -0
  116. data/test/output/dot_tall_graph.png +0 -0
  117. data/test/output/dot_tall_graph_small.png +0 -0
  118. data/test/output/dot_themed.png +0 -0
  119. data/test/output/dot_wide_graph.png +0 -0
  120. data/test/output/dot_wide_graph_small.png +0 -0
  121. data/test/output/dot_x_y_labels.png +0 -0
  122. data/test/output/dot_y_increment_1.png +0 -0
  123. data/test/output/dot_y_increment_2.0.png +0 -0
  124. data/test/output/dot_y_increment_20.png +0 -0
  125. data/test/output/dot_y_increment_5.png +0 -0
  126. data/test/output/enhancements-1.png +0 -0
  127. data/test/output/enhancements.png +0 -0
  128. data/test/output/line_all_neg.png +0 -0
  129. data/test/output/line_all_neg_400.png +0 -0
  130. data/test/output/line_all_neg_no_max.png +0 -0
  131. data/test/output/line_baseline.png +0 -0
  132. data/test/output/line_hang_value.png +0 -0
  133. data/test/output/line_hide_dots.png +0 -0
  134. data/test/output/line_hide_lines.png +0 -0
  135. data/test/output/line_jruby_error.png +0 -0
  136. data/test/output/line_large.png +0 -0
  137. data/test/output/line_large_baseline.png +0 -0
  138. data/test/output/line_legend_at_bottom.png +0 -0
  139. data/test/output/line_many.png +0 -0
  140. data/test/output/line_many_lines_small.png +0 -0
  141. data/test/output/line_many_numbers.png +0 -0
  142. data/test/output/line_marker_label_accuracy.png +0 -0
  143. data/test/output/line_more_sets_than_colors.png +0 -0
  144. data/test/output/line_no_data.png +0 -0
  145. data/test/output/line_no_data_msg.png +0 -0
  146. data/test/output/line_no_data_other.png +0 -0
  147. data/test/output/line_no_hide.png +0 -0
  148. data/test/output/line_no_legend.png +0 -0
  149. data/test/output/line_no_line_markers.png +0 -0
  150. data/test/output/line_no_title.png +0 -0
  151. data/test/output/line_nothing_but_the_graph.png +0 -0
  152. data/test/output/line_one_value.png +0 -0
  153. data/test/output/line_one_value_array.png +0 -0
  154. data/test/output/line_pos_neg.png +0 -0
  155. data/test/output/line_pos_neg_400.png +0 -0
  156. data/test/output/line_similar_high_end_values.png +0 -0
  157. data/test/output/line_similar_high_end_values_with_floor.png +0 -0
  158. data/test/output/line_small_small_zero.png +0 -0
  159. data/test/output/line_small_values.png +0 -0
  160. data/test/output/line_small_values_small.png +0 -0
  161. data/test/output/line_small_zero.png +0 -0
  162. data/test/output/line_some_nil_points.png +0 -0
  163. data/test/output/line_theme_37signals_.png +0 -0
  164. data/test/output/line_theme_37signals_400.png +0 -0
  165. data/test/output/line_theme_keynote_.png +0 -0
  166. data/test/output/line_theme_keynote_400.png +0 -0
  167. data/test/output/line_theme_odeo_.png +0 -0
  168. data/test/output/line_theme_odeo_400.png +0 -0
  169. data/test/output/line_theme_rails_keynote_.png +0 -0
  170. data/test/output/line_theme_rails_keynote_400.png +0 -0
  171. data/test/output/line_tiny.png +0 -0
  172. data/test/output/line_transparent.png +0 -0
  173. data/test/output/line_very_small.png +0 -0
  174. data/test/output/line_wide_graph.png +0 -0
  175. data/test/output/line_wide_graph_small.png +0 -0
  176. data/test/output/line_xy.png +0 -0
  177. data/test/output/line_xy_pairs.png +0 -0
  178. data/test/output/line_y_axis_increment.png +0 -0
  179. data/test/output/mini_bar.png +0 -0
  180. data/test/output/mini_pie.png +0 -0
  181. data/test/output/mini_pie_right_legend.png +0 -0
  182. data/test/output/mini_side_bar.png +0 -0
  183. data/test/output/mini_side_bar_multi_color.png +0 -0
  184. data/test/output/net_dots_tiny.png +0 -0
  185. data/test/output/net_large.png +0 -0
  186. data/test/output/net_many.png +0 -0
  187. data/test/output/net_many_nets_small.png +0 -0
  188. data/test/output/net_no_data.png +0 -0
  189. data/test/output/net_no_data_msg.png +0 -0
  190. data/test/output/net_no_data_other.png +0 -0
  191. data/test/output/net_no_legend.png +0 -0
  192. data/test/output/net_no_net_markers.png +0 -0
  193. data/test/output/net_no_title.png +0 -0
  194. data/test/output/net_nothing_but_the_graph.png +0 -0
  195. data/test/output/net_similar_high_end_values.png +0 -0
  196. data/test/output/net_small.png +0 -0
  197. data/test/output/net_small_small.png +0 -0
  198. data/test/output/net_small_small_zero.png +0 -0
  199. data/test/output/net_small_zero.png +0 -0
  200. data/test/output/net_wide_graph.png +0 -0
  201. data/test/output/net_wide_graph_small.png +0 -0
  202. data/test/output/pie_equal.png +0 -0
  203. data/test/output/pie_grey.png +0 -0
  204. data/test/output/pie_keynote.png +0 -0
  205. data/test/output/pie_keynote_small.png +0 -0
  206. data/test/output/pie_legend.png +0 -0
  207. data/test/output/pie_legend_small.png +0 -0
  208. data/test/output/pie_nearly_equal.png +0 -0
  209. data/test/output/pie_one_val.png +0 -0
  210. data/test/output/pie_pastel.png +0 -0
  211. data/test/output/pie_simple.png +0 -0
  212. data/test/output/pie_wide.png +0 -0
  213. data/test/output/pie_wrapped_legend_16_400.png +0 -0
  214. data/test/output/pie_wrapped_legend_16_800.png +0 -0
  215. data/test/output/pie_wrapped_legend_30_400.png +0 -0
  216. data/test/output/pie_wrapped_legend_30_800.png +0 -0
  217. data/test/output/pie_wrapped_legend_4_400.png +0 -0
  218. data/test/output/pie_wrapped_legend_4_800.png +0 -0
  219. data/test/output/pie_wrapped_legend__400.png +0 -0
  220. data/test/output/pie_wrapped_legend__800.png +0 -0
  221. data/test/output/pie_zero.png +0 -0
  222. data/test/output/scatter_all_neg.png +0 -0
  223. data/test/output/scatter_all_neg_400.png +0 -0
  224. data/test/output/scatter_basic.png +0 -0
  225. data/test/output/scatter_many.png +0 -0
  226. data/test/output/scatter_no_data.png +0 -0
  227. data/test/output/scatter_no_data_msg.png +0 -0
  228. data/test/output/scatter_no_data_other.png +0 -0
  229. data/test/output/scatter_no_hide.png +0 -0
  230. data/test/output/scatter_no_labels.png +0 -0
  231. data/test/output/scatter_no_legend.png +0 -0
  232. data/test/output/scatter_no_line_markers.png +0 -0
  233. data/test/output/scatter_no_title.png +0 -0
  234. data/test/output/scatter_nothing_but_the_graph.png +0 -0
  235. data/test/output/scatter_pos_neg.png +0 -0
  236. data/test/output/scatter_pos_neg_400.png +0 -0
  237. data/test/output/scatter_wide_graph.png +0 -0
  238. data/test/output/scatter_wide_graph_small.png +0 -0
  239. data/test/output/scene_hazy_night.png +0 -0
  240. data/test/output/scene_not_hazy_day.png +0 -0
  241. data/test/output/scene_partly_cloudy_day.png +0 -0
  242. data/test/output/scene_stormy_day.png +0 -0
  243. data/test/output/scene_stormy_night.png +0 -0
  244. data/test/output/side_bar.png +0 -0
  245. data/test/output/side_bar_data_range.png +0 -0
  246. data/test/output/side_bar_labels.png +0 -0
  247. data/test/output/side_bar_spacing_full.png +0 -0
  248. data/test/output/side_bar_spacing_half.png +0 -0
  249. data/test/output/side_bar_spacing_none.png +0 -0
  250. data/test/output/side_stacked_bar_keynote.png +0 -0
  251. data/test/output/side_stacked_bar_keynote_small.png +0 -0
  252. data/test/output/side_stacked_bar_labels.png +0 -0
  253. data/test/output/side_stacked_bar_long_label.png +0 -0
  254. data/test/output/side_stacked_bar_wide.png +0 -0
  255. data/test/output/spider_37signals.png +0 -0
  256. data/test/output/spider_equal.png +0 -0
  257. data/test/output/spider_keynote.png +0 -0
  258. data/test/output/spider_legend.png +0 -0
  259. data/test/output/spider_legend_small.png +0 -0
  260. data/test/output/spider_lots_of_data.png +0 -0
  261. data/test/output/spider_lots_of_data_normal_names.png +0 -0
  262. data/test/output/spider_nearly_equal.png +0 -0
  263. data/test/output/spider_no_axes.png +0 -0
  264. data/test/output/spider_no_background.png +0 -0
  265. data/test/output/spider_no_print.png +0 -0
  266. data/test/output/spider_overlay_1.png +0 -0
  267. data/test/output/spider_overlay_2.png +0 -0
  268. data/test/output/spider_rotation.png +0 -0
  269. data/test/output/spider_small.png +0 -0
  270. data/test/output/spider_wide.png +0 -0
  271. data/test/output/spider_zero.png +0 -0
  272. data/test/output/stacked_area_keynote.png +0 -0
  273. data/test/output/stacked_area_keynote_small.png +0 -0
  274. data/test/output/stacked_bar_keynote.png +0 -0
  275. data/test/output/stacked_bar_keynote_small.png +0 -0
  276. data/test/output_java/accum_bar.png +0 -0
  277. data/test/output_java/area_keynote.png +0 -0
  278. data/test/output_java/area_keynote_small.png +0 -0
  279. data/test/output_java/area_many.png +0 -0
  280. data/test/output_java/area_many_areas_small.png +0 -0
  281. data/test/output_java/area_tiny.png +0 -0
  282. data/test/output_java/area_wide.png +0 -0
  283. data/test/output_java/bar2_wrapped_legend_16_400.png +0 -0
  284. data/test/output_java/bar2_wrapped_legend_16_800.png +0 -0
  285. data/test/output_java/bar2_wrapped_legend_30_400.png +0 -0
  286. data/test/output_java/bar2_wrapped_legend_30_800.png +0 -0
  287. data/test/output_java/bar2_wrapped_legend_4_400.png +0 -0
  288. data/test/output_java/bar2_wrapped_legend_4_800.png +0 -0
  289. data/test/output_java/bar2_wrapped_legend__400.png +0 -0
  290. data/test/output_java/bar2_wrapped_legend__800.png +0 -0
  291. data/test/output_java/bar_background_gradient_bottom_top.png +0 -0
  292. data/test/output_java/bar_background_gradient_left_right.png +0 -0
  293. data/test/output_java/bar_background_gradient_right_left.png +0 -0
  294. data/test/output_java/bar_background_gradient_top_bottom.png +0 -0
  295. data/test/output_java/bar_background_gradient_topleft_bottomright.png +0 -0
  296. data/test/output_java/bar_background_gradient_topright_bottomleft.png +0 -0
  297. data/test/output_java/bar_formatted_numbers.png +0 -0
  298. data/test/output_java/bar_keynote.png +0 -0
  299. data/test/output_java/bar_keynote_small.png +0 -0
  300. data/test/output_java/bar_long_legend_text.png +0 -0
  301. data/test/output_java/bar_manual_colors.png +0 -0
  302. data/test/output_java/bar_marker_shadow.png +0 -0
  303. data/test/output_java/bar_nearly_zero_max_10.png +0 -0
  304. data/test/output_java/bar_no_legend.png +0 -0
  305. data/test/output_java/bar_no_line_markers.png +0 -0
  306. data/test/output_java/bar_no_title.png +0 -0
  307. data/test/output_java/bar_no_title_or_legend.png +0 -0
  308. data/test/output_java/bar_odeo.png +0 -0
  309. data/test/output_java/bar_one_value.png +0 -0
  310. data/test/output_java/bar_pos_neg.png +0 -0
  311. data/test/output_java/bar_rails_keynote.png +0 -0
  312. data/test/output_java/bar_set_absolute_trunc.png +0 -0
  313. data/test/output_java/bar_set_label_stagger_height.png +0 -0
  314. data/test/output_java/bar_set_legend_box_size_lg.png +0 -0
  315. data/test/output_java/bar_set_legend_box_size_sm.png +0 -0
  316. data/test/output_java/bar_set_marker.png +0 -0
  317. data/test/output_java/bar_set_trailing_dots_trunc.png +0 -0
  318. data/test/output_java/bar_spacing_full.png +0 -0
  319. data/test/output_java/bar_spacing_half.png +0 -0
  320. data/test/output_java/bar_spacing_none.png +0 -0
  321. data/test/output_java/bar_tall_graph.png +0 -0
  322. data/test/output_java/bar_tall_graph_small.png +0 -0
  323. data/test/output_java/bar_themed.png +0 -0
  324. data/test/output_java/bar_title_margin.png +0 -0
  325. data/test/output_java/bar_value_labels.png +0 -0
  326. data/test/output_java/bar_wide_graph.png +0 -0
  327. data/test/output_java/bar_wide_graph_small.png +0 -0
  328. data/test/output_java/bar_wrapped_legend_16_400.png +0 -0
  329. data/test/output_java/bar_wrapped_legend_16_800.png +0 -0
  330. data/test/output_java/bar_wrapped_legend_30_400.png +0 -0
  331. data/test/output_java/bar_wrapped_legend_30_800.png +0 -0
  332. data/test/output_java/bar_wrapped_legend_4_400.png +0 -0
  333. data/test/output_java/bar_wrapped_legend_4_800.png +0 -0
  334. data/test/output_java/bar_wrapped_legend__400.png +0 -0
  335. data/test/output_java/bar_wrapped_legend__800.png +0 -0
  336. data/test/output_java/bar_x_y_labels.png +0 -0
  337. data/test/output_java/bar_y_increment_1.png +0 -0
  338. data/test/output_java/bar_y_increment_2.0.png +0 -0
  339. data/test/output_java/bar_y_increment_20.png +0 -0
  340. data/test/output_java/bar_y_increment_5.png +0 -0
  341. data/test/output_java/bar_zero_marker_count.png +0 -0
  342. data/test/output_java/bar_zero_spacing.png +0 -0
  343. data/test/output_java/bezier.png +0 -0
  344. data/test/output_java/bezier_2.png +0 -0
  345. data/test/output_java/bezier_3.png +0 -0
  346. data/test/output_java/bullet_greyscale.png +0 -0
  347. data/test/output_java/bullet_no_options.png +0 -0
  348. data/test/output_java/dot.png +0 -0
  349. data/test/output_java/dot_manual_colors.png +0 -0
  350. data/test/output_java/dot_nearly_zero_max_10.png +0 -0
  351. data/test/output_java/dot_no_legend.png +0 -0
  352. data/test/output_java/dot_no_line_markers.png +0 -0
  353. data/test/output_java/dot_no_title.png +0 -0
  354. data/test/output_java/dot_no_title_or_legend.png +0 -0
  355. data/test/output_java/dot_one_value.png +0 -0
  356. data/test/output_java/dot_pos_neg.png +0 -0
  357. data/test/output_java/dot_set_legend_box_size_lg.png +0 -0
  358. data/test/output_java/dot_set_legend_box_size_sm.png +0 -0
  359. data/test/output_java/dot_set_marker.png +0 -0
  360. data/test/output_java/dot_small.png +0 -0
  361. data/test/output_java/dot_tall_graph.png +0 -0
  362. data/test/output_java/dot_tall_graph_small.png +0 -0
  363. data/test/output_java/dot_themed.png +0 -0
  364. data/test/output_java/dot_wide_graph.png +0 -0
  365. data/test/output_java/dot_wide_graph_small.png +0 -0
  366. data/test/output_java/dot_x_y_labels.png +0 -0
  367. data/test/output_java/dot_y_increment_1.png +0 -0
  368. data/test/output_java/dot_y_increment_2.0.png +0 -0
  369. data/test/output_java/dot_y_increment_20.png +0 -0
  370. data/test/output_java/dot_y_increment_5.png +0 -0
  371. data/test/output_java/enhancements-1.png +0 -0
  372. data/test/output_java/enhancements.png +0 -0
  373. data/test/output_java/line_all_neg.png +0 -0
  374. data/test/output_java/line_all_neg_400.png +0 -0
  375. data/test/output_java/line_all_neg_no_max.png +0 -0
  376. data/test/output_java/line_baseline.png +0 -0
  377. data/test/output_java/line_hang_value.png +0 -0
  378. data/test/output_java/line_hide_dots.png +0 -0
  379. data/test/output_java/line_hide_lines.png +0 -0
  380. data/test/output_java/line_jruby_error.png +0 -0
  381. data/test/output_java/line_large.png +0 -0
  382. data/test/output_java/line_large_baseline.png +0 -0
  383. data/test/output_java/line_legend_at_bottom.png +0 -0
  384. data/test/output_java/line_many.png +0 -0
  385. data/test/output_java/line_many_lines_small.png +0 -0
  386. data/test/output_java/line_many_numbers.png +0 -0
  387. data/test/output_java/line_marker_label_accuracy.png +0 -0
  388. data/test/output_java/line_more_sets_than_colors.png +0 -0
  389. data/test/output_java/line_no_data.png +0 -0
  390. data/test/output_java/line_no_data_msg.png +0 -0
  391. data/test/output_java/line_no_data_other.png +0 -0
  392. data/test/output_java/line_no_hide.png +0 -0
  393. data/test/output_java/line_no_legend.png +0 -0
  394. data/test/output_java/line_no_line_markers.png +0 -0
  395. data/test/output_java/line_no_title.png +0 -0
  396. data/test/output_java/line_nothing_but_the_graph.png +0 -0
  397. data/test/output_java/line_one_value.png +0 -0
  398. data/test/output_java/line_one_value_array.png +0 -0
  399. data/test/output_java/line_pos_neg.png +0 -0
  400. data/test/output_java/line_pos_neg_400.png +0 -0
  401. data/test/output_java/line_similar_high_end_values.png +0 -0
  402. data/test/output_java/line_similar_high_end_values_with_floor.png +0 -0
  403. data/test/output_java/line_small_small_zero.png +0 -0
  404. data/test/output_java/line_small_values.png +0 -0
  405. data/test/output_java/line_small_values_small.png +0 -0
  406. data/test/output_java/line_small_zero.png +0 -0
  407. data/test/output_java/line_some_nil_points.png +0 -0
  408. data/test/output_java/line_theme_37signals_.png +0 -0
  409. data/test/output_java/line_theme_37signals_400.png +0 -0
  410. data/test/output_java/line_theme_keynote_.png +0 -0
  411. data/test/output_java/line_theme_keynote_400.png +0 -0
  412. data/test/output_java/line_theme_odeo_.png +0 -0
  413. data/test/output_java/line_theme_odeo_400.png +0 -0
  414. data/test/output_java/line_theme_rails_keynote_.png +0 -0
  415. data/test/output_java/line_theme_rails_keynote_400.png +0 -0
  416. data/test/output_java/line_tiny.png +0 -0
  417. data/test/output_java/line_transparent.png +0 -0
  418. data/test/output_java/line_very_small.png +0 -0
  419. data/test/output_java/line_wide_graph.png +0 -0
  420. data/test/output_java/line_wide_graph_small.png +0 -0
  421. data/test/output_java/line_xy.png +0 -0
  422. data/test/output_java/line_xy_pairs.png +0 -0
  423. data/test/output_java/line_y_axis_increment.png +0 -0
  424. data/test/output_java/mini_bar.png +0 -0
  425. data/test/output_java/mini_pie.png +0 -0
  426. data/test/output_java/mini_pie_right_legend.png +0 -0
  427. data/test/output_java/mini_side_bar.png +0 -0
  428. data/test/output_java/mini_side_bar_multi_color.png +0 -0
  429. data/test/output_java/net_dots_tiny.png +0 -0
  430. data/test/output_java/net_large.png +0 -0
  431. data/test/output_java/net_many.png +0 -0
  432. data/test/output_java/net_many_nets_small.png +0 -0
  433. data/test/output_java/net_no_data.png +0 -0
  434. data/test/output_java/net_no_data_msg.png +0 -0
  435. data/test/output_java/net_no_data_other.png +0 -0
  436. data/test/output_java/net_no_legend.png +0 -0
  437. data/test/output_java/net_no_net_markers.png +0 -0
  438. data/test/output_java/net_no_title.png +0 -0
  439. data/test/output_java/net_nothing_but_the_graph.png +0 -0
  440. data/test/output_java/net_similar_high_end_values.png +0 -0
  441. data/test/output_java/net_small.png +0 -0
  442. data/test/output_java/net_small_small.png +0 -0
  443. data/test/output_java/net_small_small_zero.png +0 -0
  444. data/test/output_java/net_small_zero.png +0 -0
  445. data/test/output_java/net_wide_graph.png +0 -0
  446. data/test/output_java/net_wide_graph_small.png +0 -0
  447. data/test/output_java/pie_equal.png +0 -0
  448. data/test/output_java/pie_grey.png +0 -0
  449. data/test/output_java/pie_keynote.png +0 -0
  450. data/test/output_java/pie_keynote_small.png +0 -0
  451. data/test/output_java/pie_legend.png +0 -0
  452. data/test/output_java/pie_legend_small.png +0 -0
  453. data/test/output_java/pie_nearly_equal.png +0 -0
  454. data/test/output_java/pie_one_val.png +0 -0
  455. data/test/output_java/pie_pastel.png +0 -0
  456. data/test/output_java/pie_simple.png +0 -0
  457. data/test/output_java/pie_wide.png +0 -0
  458. data/test/output_java/pie_wrapped_legend_16_400.png +0 -0
  459. data/test/output_java/pie_wrapped_legend_16_800.png +0 -0
  460. data/test/output_java/pie_wrapped_legend_30_400.png +0 -0
  461. data/test/output_java/pie_wrapped_legend_30_800.png +0 -0
  462. data/test/output_java/pie_wrapped_legend_4_400.png +0 -0
  463. data/test/output_java/pie_wrapped_legend_4_800.png +0 -0
  464. data/test/output_java/pie_wrapped_legend__400.png +0 -0
  465. data/test/output_java/pie_wrapped_legend__800.png +0 -0
  466. data/test/output_java/pie_zero.png +0 -0
  467. data/test/output_java/scatter_all_neg.png +0 -0
  468. data/test/output_java/scatter_all_neg_400.png +0 -0
  469. data/test/output_java/scatter_basic.png +0 -0
  470. data/test/output_java/scatter_many.png +0 -0
  471. data/test/output_java/scatter_no_data.png +0 -0
  472. data/test/output_java/scatter_no_data_msg.png +0 -0
  473. data/test/output_java/scatter_no_data_other.png +0 -0
  474. data/test/output_java/scatter_no_hide.png +0 -0
  475. data/test/output_java/scatter_no_labels.png +0 -0
  476. data/test/output_java/scatter_no_legend.png +0 -0
  477. data/test/output_java/scatter_no_line_markers.png +0 -0
  478. data/test/output_java/scatter_no_title.png +0 -0
  479. data/test/output_java/scatter_nothing_but_the_graph.png +0 -0
  480. data/test/output_java/scatter_pos_neg.png +0 -0
  481. data/test/output_java/scatter_pos_neg_400.png +0 -0
  482. data/test/output_java/scatter_wide_graph.png +0 -0
  483. data/test/output_java/scatter_wide_graph_small.png +0 -0
  484. data/test/output_java/scene_hazy_night.png +0 -0
  485. data/test/output_java/scene_not_hazy_day.png +0 -0
  486. data/test/output_java/scene_partly_cloudy_day.png +0 -0
  487. data/test/output_java/scene_stormy_day.png +0 -0
  488. data/test/output_java/scene_stormy_night.png +0 -0
  489. data/test/output_java/side_bar.png +0 -0
  490. data/test/output_java/side_bar_data_range.png +0 -0
  491. data/test/output_java/side_bar_labels.png +0 -0
  492. data/test/output_java/side_bar_spacing_full.png +0 -0
  493. data/test/output_java/side_bar_spacing_half.png +0 -0
  494. data/test/output_java/side_bar_spacing_none.png +0 -0
  495. data/test/output_java/side_stacked_bar_keynote.png +0 -0
  496. data/test/output_java/side_stacked_bar_keynote_small.png +0 -0
  497. data/test/output_java/side_stacked_bar_labels.png +0 -0
  498. data/test/output_java/side_stacked_bar_long_label.png +0 -0
  499. data/test/output_java/side_stacked_bar_wide.png +0 -0
  500. data/test/output_java/spider_37signals.png +0 -0
  501. data/test/output_java/spider_equal.png +0 -0
  502. data/test/output_java/spider_keynote.png +0 -0
  503. data/test/output_java/spider_legend.png +0 -0
  504. data/test/output_java/spider_legend_small.png +0 -0
  505. data/test/output_java/spider_lots_of_data.png +0 -0
  506. data/test/output_java/spider_lots_of_data_normal_names.png +0 -0
  507. data/test/output_java/spider_nearly_equal.png +0 -0
  508. data/test/output_java/spider_no_axes.png +0 -0
  509. data/test/output_java/spider_no_background.png +0 -0
  510. data/test/output_java/spider_no_print.png +0 -0
  511. data/test/output_java/spider_overlay_1.png +0 -0
  512. data/test/output_java/spider_overlay_2.png +0 -0
  513. data/test/output_java/spider_rotation.png +0 -0
  514. data/test/output_java/spider_small.png +0 -0
  515. data/test/output_java/spider_wide.png +0 -0
  516. data/test/output_java/spider_zero.png +0 -0
  517. data/test/output_java/stacked_area_keynote.png +0 -0
  518. data/test/output_java/stacked_area_keynote_small.png +0 -0
  519. data/test/output_java/stacked_bar_keynote.png +0 -0
  520. data/test/output_java/stacked_bar_keynote_small.png +0 -0
  521. data/test/test_accumulator_bar.rb +7 -6
  522. data/test/test_area.rb +2 -2
  523. data/test/test_bar.rb +296 -112
  524. data/test/test_bezier.rb +33 -0
  525. data/test/test_bullet.rb +26 -26
  526. data/test/test_dot.rb +44 -54
  527. data/test/test_legend.rb +29 -29
  528. data/test/test_line.rb +250 -218
  529. data/test/test_net.rb +2 -1
  530. data/test/test_pie.rb +2 -2
  531. data/test/test_scatter.rb +85 -85
  532. data/test/test_side_bar.rb +13 -0
  533. data/test/test_sidestacked_bar.rb +16 -0
  534. data/test/test_spider.rb +11 -1
  535. data/test/test_stacked_area.rb +5 -5
  536. metadata +1041 -49
  537. data/.rvmrc +0 -5
  538. data/Gemfile.lock +0 -20
  539. data/LICENSE.txt +0 -22
  540. data/README.txt +0 -43
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/base'
2
+
3
+ class Gruff::Bezier < Gruff::Base
4
+ def draw
5
+ super
6
+
7
+ return unless @has_data
8
+
9
+ @x_increment = @graph_width / (@column_count - 1).to_f
10
+
11
+ @norm_data.each do |data_row|
12
+ poly_points = Array.new
13
+ @d = @d.fill data_row[DATA_COLOR_INDEX]
14
+
15
+ data_row[1].each_with_index do |data_point, index|
16
+ # Use incremented x and scaled y
17
+ new_x = @graph_left + (@x_increment * index)
18
+ new_y = @graph_top + (@graph_height - data_point * @graph_height)
19
+
20
+ if index == 0 && RUBY_PLATFORM != 'java'
21
+ poly_points << @graph_left
22
+ poly_points << @graph_bottom - 1
23
+ end
24
+
25
+ poly_points << new_x
26
+ poly_points << new_y
27
+
28
+ draw_label(new_x, index)
29
+ end
30
+
31
+ @d = @d.fill_opacity 0.0
32
+ @d = @d.stroke data_row[DATA_COLOR_INDEX]
33
+ @d = @d.stroke_width clip_value_if_greater_than(@columns / (@norm_data.first[1].size * 4), 5.0)
34
+
35
+ if RUBY_PLATFORM == 'java'
36
+ @d = @d.polyline(*poly_points)
37
+ else
38
+ @d = @d.bezier(*poly_points)
39
+ end
40
+ end
41
+
42
+ @d.draw(@base_image)
43
+ end
44
+
45
+
46
+ end
data/lib/gruff/bullet.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/base'
2
+ require 'gruff/themes'
2
3
 
4
+ # http://en.wikipedia.org/wiki/Bullet_graph
3
5
  class Gruff::Bullet < Gruff::Base
4
6
 
5
7
  def initialize(target_width="400x40")
@@ -15,7 +17,7 @@ class Gruff::Bullet < Gruff::Base
15
17
  initialize_ivars
16
18
 
17
19
  reset_themes
18
- theme_greyscale
20
+ self.theme = Gruff::Themes::GREYSCALE
19
21
  @title_font_size = 20
20
22
  end
21
23
 
data/lib/gruff/dot.rb CHANGED
@@ -18,31 +18,29 @@ class Gruff::Dot < Gruff::Base
18
18
 
19
19
  @items_width = @graph_height / @column_count.to_f
20
20
  @item_width = @items_width * spacing_factor / @norm_data.size
21
- @d = @d.stroke_opacity 0.0
22
- height = Array.new(@column_count, 0)
23
- length = Array.new(@column_count, @graph_left)
24
- padding = (@items_width * (1 - spacing_factor)) / 2
21
+ @d = @d.stroke_opacity 0.0
22
+ padding = (@items_width * (1 - spacing_factor)) / 2
25
23
 
26
24
  @norm_data.each_with_index do |data_row, row_index|
27
25
  data_row[DATA_VALUES_INDEX].each_with_index do |data_point, point_index|
28
-
29
- x_pos = @graph_left + (data_point * @graph_width) - (@item_width.to_f/6.0).round
30
- y_pos = @graph_top + (@items_width * point_index) + padding + (@item_width.to_f/2.0).round
26
+ x_pos = @graph_left + (data_point * @graph_width)
27
+ y_pos = @graph_top + (@items_width * point_index) + padding + (@items_width.to_f/2.0).round
31
28
 
32
29
  if row_index == 0
33
- @d = @d.stroke(@marker_color)
34
- @d = @d.stroke_width 1.0
35
- @d = @d.opacity 0.1
36
- @d = @d.line(@graph_left, y_pos, @graph_left + @graph_width, y_pos)
30
+ @d = @d.stroke(@marker_color)
31
+ @d = @d.fill(@marker_color)
32
+ @d = @d.stroke_width 1.0
33
+ @d = @d.stroke_opacity 0.1
34
+ @d = @d.fill_opacity 0.1
35
+ @d = @d.line(@graph_left, y_pos, @graph_left + @graph_width, y_pos)
36
+ @d = @d.fill_opacity 1
37
37
  end
38
38
 
39
- @d = @d.fill data_row[DATA_COLOR_INDEX]
40
- @d = @d.stroke('transparent')
41
- @d = @d.circle(x_pos, y_pos, x_pos + (@item_width.to_f/3.0).round, y_pos)
39
+ @d = @d.fill data_row[DATA_COLOR_INDEX]
40
+ @d = @d.stroke('transparent')
41
+ @d = @d.circle(x_pos, y_pos, x_pos + (@item_width.to_f/3.0).round, y_pos)
42
42
 
43
- # Calculate center based on item_width and current row
44
- label_center = @graph_top + (@items_width * point_index + @items_width / 2) + padding
45
- draw_label(label_center, point_index)
43
+ draw_label(y_pos, point_index)
46
44
  end
47
45
 
48
46
  end
@@ -50,11 +48,10 @@ class Gruff::Dot < Gruff::Base
50
48
  @d.draw(@base_image)
51
49
  end
52
50
 
53
- protected
51
+ protected
54
52
 
55
53
  # Instead of base class version, draws vertical background lines and label
56
54
  def draw_line_markers
57
-
58
55
  return if @hide_line_markers
59
56
 
60
57
  @d = @d.stroke_antialias false
@@ -62,29 +59,45 @@ protected
62
59
  # Draw horizontal line markers and annotate with numbers
63
60
  @d = @d.stroke(@marker_color)
64
61
  @d = @d.stroke_width 1
65
- number_of_lines = 5
62
+ if @y_axis_increment
63
+ increment = @y_axis_increment
64
+ number_of_lines = (@spread / @y_axis_increment).to_i
65
+ else
66
+ # Try to use a number of horizontal lines that will come out even.
67
+ #
68
+ # TODO Do the same for larger numbers...100, 75, 50, 25
69
+ if @marker_count.nil?
70
+ (3..7).each do |lines|
71
+ if @spread % lines == 0.0
72
+ @marker_count = lines
73
+ break
74
+ end
75
+ end
76
+ @marker_count ||= 5
77
+ end
78
+ # TODO Round maximum marker value to a round number like 100, 0.1, 0.5, etc.
79
+ @increment = (@spread > 0 && @marker_count > 0) ? significant(@spread / @marker_count) : 1
66
80
 
67
- # TODO Round maximum marker value to a round number like 100, 0.1, 0.5, etc.
68
- increment = significant(@maximum_value.to_f / number_of_lines)
69
- (0..number_of_lines).each do |index|
81
+ number_of_lines = @marker_count
82
+ increment = @increment
83
+ end
70
84
 
71
- line_diff = (@graph_right - @graph_left) / number_of_lines
72
- x = @graph_right - (line_diff * index) - 1
73
- @d = @d.line(x, @graph_bottom, x, @graph_bottom + 0.5 * LABEL_MARGIN)
74
- diff = index - number_of_lines
75
- marker_label = diff.abs * increment
85
+ (0..number_of_lines).each do |index|
86
+ marker_label = @minimum_value + index * increment
87
+ x = @graph_left + (marker_label - @minimum_value) * @graph_width / @spread
88
+ @d = @d.line(x, @graph_bottom, x, @graph_bottom + 0.5 * LABEL_MARGIN)
76
89
 
77
90
  unless @hide_line_numbers
78
- @d.fill = @font_color
79
- @d.font = @font if @font
80
- @d.stroke = 'transparent'
91
+ @d.fill = @font_color
92
+ @d.font = @font if @font
93
+ @d.stroke = 'transparent'
81
94
  @d.pointsize = scale_fontsize(@marker_font_size)
82
- @d.gravity = CenterGravity
95
+ @d.gravity = CenterGravity
83
96
  # TODO Center text over line
84
- @d = @d.annotate_scaled( @base_image,
85
- 0, 0, # Width of box to draw text in
86
- x, @graph_bottom + (LABEL_MARGIN * 2.0), # Coordinates of text
87
- marker_label.to_s, @scale)
97
+ @d = @d.annotate_scaled(@base_image,
98
+ 0, 0, # Width of box to draw text in
99
+ x, @graph_bottom + (LABEL_MARGIN * 2.0), # Coordinates of text
100
+ label(marker_label, increment), @scale)
88
101
  end # unless
89
102
  @d = @d.stroke_antialias true
90
103
  end
@@ -95,13 +108,13 @@ protected
95
108
 
96
109
  def draw_label(y_offset, index)
97
110
  if !@labels[index].nil? && @labels_seen[index].nil?
98
- @d.fill = @font_color
99
- @d.font = @font if @font
100
- @d.stroke = 'transparent'
101
- @d.font_weight = NormalWeight
102
- @d.pointsize = scale_fontsize(@marker_font_size)
103
- @d.gravity = EastGravity
104
- @d = @d.annotate_scaled(@base_image,
111
+ @d.fill = @font_color
112
+ @d.font = @font if @font
113
+ @d.stroke = 'transparent'
114
+ @d.font_weight = NormalWeight
115
+ @d.pointsize = scale_fontsize(@marker_font_size)
116
+ @d.gravity = EastGravity
117
+ @d = @d.annotate_scaled(@base_image,
105
118
  1, 1,
106
119
  -@graph_left + LABEL_MARGIN * 2.0, y_offset,
107
120
  @labels[index], @scale)
@@ -110,4 +123,3 @@ protected
110
123
  end
111
124
 
112
125
  end
113
-
data/lib/gruff/line.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require File.dirname(__FILE__) + '/base'
3
2
 
4
3
  ##
@@ -16,17 +15,17 @@ class Gruff::Line < Gruff::Base
16
15
 
17
16
  # Draw a dashed line at the given value
18
17
  attr_accessor :baseline_value
19
-
18
+
20
19
  # Color of the baseline
21
20
  attr_accessor :baseline_color
22
-
21
+
23
22
  # Dimensions of lines and dots; calculated based on dataset size if left unspecified
24
23
  attr_accessor :line_width
25
24
  attr_accessor :dot_radius
26
25
 
27
26
  # Hide parts of the graph to fit more datapoints, or for a different appearance.
28
27
  attr_accessor :hide_dots, :hide_lines
29
-
28
+
30
29
  #accessors for support of xy data
31
30
  attr_accessor :minimum_x_value
32
31
  attr_accessor :maximum_x_value
@@ -41,20 +40,20 @@ class Gruff::Line < Gruff::Base
41
40
  #
42
41
  # The preferred way is to call hide_dots or hide_lines instead.
43
42
  def initialize(*args)
44
- raise ArgumentError, "Wrong number of arguments" if args.length > 2
45
- if args.empty? or ((not Numeric === args.first) && (not String === args.first)) then
43
+ raise ArgumentError, 'Wrong number of arguments' if args.length > 2
44
+ if args.empty? || ((not Numeric === args.first) && (not String === args.first))
46
45
  super()
47
46
  else
48
47
  super args.shift
49
48
  end
50
-
49
+
51
50
  @hide_dots = @hide_lines = false
52
51
  @baseline_color = 'red'
53
52
  @baseline_value = nil
54
53
  @maximum_x_value = nil
55
54
  @minimum_x_value = nil
56
55
  end
57
-
56
+
58
57
  # This method allows one to plot a dataset with both X and Y data.
59
58
  #
60
59
  # Parameters are as follows:
@@ -63,7 +62,13 @@ class Gruff::Line < Gruff::Base
63
62
  # y_data_points: an array containing the y data points for the graph
64
63
  # color: hex number indicating the line color as an RGB triplet
65
64
  #
66
- # Notes:
65
+ # or
66
+ #
67
+ # name: string, the title of the dataset
68
+ # xy_data_points: an array containing both x and y data points for the graph
69
+ # color: hex number indicating the line color as an RGB triplet
70
+ #
71
+ # Notes:
67
72
  # -if (x_data_points.length != y_data_points.length) an error is
68
73
  # returned.
69
74
  # -if the color argument is nil, the next color from the default theme will
@@ -76,67 +81,55 @@ class Gruff::Line < Gruff::Base
76
81
  # g.title = "X/Y Dataset"
77
82
  # g.dataxy("Apples", [1,3,4,5,6,10], [1, 2, 3, 4, 4, 3])
78
83
  # g.dataxy("Bapples", [1,3,4,5,7,9], [1, 1, 2, 2, 3, 3])
84
+ # g.dataxy("Capples", [[1,1],[2,3],[3,4],[4,5],[5,7],[6,9])
79
85
  # #you can still use the old data method too if you want:
80
86
  # g.data("Capples", [1, 1, 2, 2, 3, 3])
81
- # #labels will be drawn at the x locations of the 1st dataset that you
82
- # #passed in. In this example the lables are drawn at x locations 1,4,6
83
- # g.labels = {0 => '2003', 2 => '2004', 4 => '2005'} #labels
84
-
87
+ # #labels will be drawn at the x locations of the keys passed in.
88
+ # In this example the lables are drawn at x positions 2, 4, and 6:
89
+ # g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006'}
90
+ # The 0 => '2003' label will be ignored since it is outside the chart range.
85
91
  def dataxy(name, x_data_points=[], y_data_points=[], color=nil)
86
- raise ArgumentError, "x_data_points is nil!" if x_data_points.length == 0
92
+ raise ArgumentError, 'x_data_points is nil!' if x_data_points.length == 0
87
93
 
88
- if x_data_points.all?{|p| p.size == 2}
89
- x_data_points, y_data_points = x_data_points.map{|p| p[0]}, x_data_points.map{|p| p[1]}
94
+ if x_data_points.all? { |p| p.is_a?(Array) && p.size == 2 }
95
+ x_data_points, y_data_points = x_data_points.map { |p| p[0] }, x_data_points.map { |p| p[1] }
90
96
  end
91
97
 
92
- raise ArgumentError, "x_data_points.length != y_data_points.length!" if x_data_points.length != y_data_points.length
98
+ raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length
93
99
 
94
- #call the existing data routine for the y data.
100
+ # call the existing data routine for the y data.
95
101
  self.data(name, y_data_points, color)
96
-
102
+
97
103
  x_data_points = Array(x_data_points) # make sure it's an array
98
- #append the x data to the last entry that was just added in the @data member
99
- lastElem = @data.length()-1
100
- @data[lastElem][DATA_VALUES_X_INDEX] = x_data_points
101
-
104
+ # append the x data to the last entry that was just added in the @data member
105
+ @data.last[DATA_VALUES_X_INDEX] = x_data_points
106
+
102
107
  # Update the global min/max values for the x data
103
- x_data_points.each_with_index do |x_data_point, index|
108
+ x_data_points.each do |x_data_point|
104
109
  next if x_data_point.nil?
105
-
110
+
106
111
  # Setup max/min so spread starts at the low end of the data points
107
112
  if @maximum_x_value.nil? && @minimum_x_value.nil?
108
113
  @maximum_x_value = @minimum_x_value = x_data_point
109
114
  end
110
-
111
- @maximum_x_value = (x_data_point > @maximum_x_value) ?
112
- x_data_point : @maximum_x_value
113
- @minimum_x_value = (x_data_point < @minimum_x_value) ?
114
- x_data_point : @minimum_x_value
115
+
116
+ @maximum_x_value = (x_data_point > @maximum_x_value) ?
117
+ x_data_point : @maximum_x_value
118
+ @minimum_x_value = (x_data_point < @minimum_x_value) ?
119
+ x_data_point : @minimum_x_value
115
120
  end
116
-
121
+
117
122
  end
118
123
 
119
124
  def draw
120
125
  super
121
126
 
122
127
  return unless @has_data
123
-
128
+
124
129
  # Check to see if more than one datapoint was given. NaN can result otherwise.
125
130
  @x_increment = (@column_count > 1) ? (@graph_width / (@column_count - 1).to_f) : @graph_width
126
131
 
127
- #normalize the x data if it is specified
128
- @data.each_with_index do |data_row, index|
129
- norm_x_data_points = []
130
- if (data_row[DATA_VALUES_X_INDEX] != nil)
131
- data_row[DATA_VALUES_X_INDEX].each do |x_data_point|
132
- norm_x_data_points << ( (x_data_point.to_f - @minimum_x_value.to_f ) /
133
- (@maximum_x_value.to_f - @minimum_x_value.to_f) )
134
- end
135
- @norm_data[index] << norm_x_data_points
136
- end
137
- end
138
-
139
- if (defined?(@norm_baseline)) then
132
+ if defined?(@norm_baseline)
140
133
  level = @graph_top + (@graph_height - @norm_baseline * @graph_height)
141
134
  @d = @d.push
142
135
  @d.stroke_color @baseline_color
@@ -147,23 +140,27 @@ class Gruff::Line < Gruff::Base
147
140
  @d = @d.pop
148
141
  end
149
142
 
150
- @norm_data.each_with_index do |data_row, dr_index|
143
+ @norm_data.each do |data_row|
151
144
  prev_x = prev_y = nil
152
145
 
153
146
  @one_point = contains_one_point_only?(data_row)
154
147
 
155
148
  data_row[DATA_VALUES_INDEX].each_with_index do |data_point, index|
156
- next if data_point.nil?
157
-
149
+ unless data_point
150
+ prev_x = prev_y = nil
151
+ next
152
+ end
158
153
  x_data = data_row[DATA_VALUES_X_INDEX]
159
- if (x_data == nil)
154
+ if x_data == nil
160
155
  #use the old method: equally spaced points along the x-axis
161
- new_x = @graph_left + (@x_increment * index)
156
+ new_x = @graph_left + (@x_increment * index)
157
+ draw_label(new_x, index)
162
158
  else
163
- new_x = getXCoord(x_data[index], @graph_width, @graph_left)
159
+ new_x = get_x_coord(x_data[index], @graph_width, @graph_left)
160
+ @labels.each do |label_pos, _|
161
+ draw_label(@graph_left + ((label_pos - @minimum_x_value) * @graph_width) / (@maximum_x_value - @minimum_x_value), label_pos)
162
+ end
164
163
  end
165
-
166
- draw_label(new_x, index)
167
164
 
168
165
  new_y = @graph_top + (@graph_height - data_point * @graph_height)
169
166
 
@@ -172,13 +169,12 @@ class Gruff::Line < Gruff::Base
172
169
  @d = @d.fill data_row[DATA_COLOR_INDEX]
173
170
  @d = @d.stroke_opacity 1.0
174
171
  @d = @d.stroke_width line_width ||
175
- clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 4), 5.0)
176
-
172
+ clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 4), 5.0)
177
173
 
178
174
  circle_radius = dot_radius ||
179
- clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 2.5), 5.0)
175
+ clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 2.5), 5.0)
180
176
 
181
- if !@hide_lines and !prev_x.nil? and !prev_y.nil? then
177
+ if !@hide_lines && !prev_x.nil? && !prev_y.nil?
182
178
  @d = @d.line(prev_x, prev_y, new_x, new_y)
183
179
  elsif @one_point
184
180
  # Show a circle if there's just one_point
@@ -186,34 +182,52 @@ class Gruff::Line < Gruff::Base
186
182
  end
187
183
  @d = @d.circle(new_x, new_y, new_x - circle_radius, new_y) unless @hide_dots
188
184
 
189
- prev_x = new_x
190
- prev_y = new_y
185
+ prev_x, prev_y = new_x, new_y
191
186
  end
192
-
193
187
  end
194
188
 
195
189
  @d.draw(@base_image)
196
190
  end
197
191
 
198
- def normalize
199
- @maximum_value = [@maximum_value.to_f, @baseline_value.to_f].max
192
+ def setup_data
193
+ if @baseline_value
194
+ @maximum_value = [@maximum_value.to_f, @baseline_value.to_f].max
195
+ @minimum_value = [@minimum_value.to_f, @baseline_value.to_f].min
196
+ end
200
197
  super
201
- @norm_baseline = (@baseline_value.to_f / @maximum_value.to_f) if @baseline_value
202
198
  end
203
-
199
+
200
+ def normalize(force=false)
201
+ super(force)
202
+ @norm_baseline = ((@baseline_value.to_f - @minimum_value) / @spread.to_f) if @baseline_value
203
+
204
+ #normalize the x data if it is specified
205
+ @data.each_with_index do |data_row, index|
206
+ norm_x_data_points = []
207
+ if data_row[DATA_VALUES_X_INDEX] != nil
208
+ data_row[DATA_VALUES_X_INDEX].each do |x_data_point|
209
+ norm_x_data_points << ((x_data_point.to_f - @minimum_x_value.to_f) /
210
+ (@maximum_x_value.to_f - @minimum_x_value.to_f))
211
+ end
212
+ @norm_data[index] << norm_x_data_points
213
+ end
214
+ end
215
+
216
+ end
217
+
204
218
  def sort_norm_data
205
- super unless @data.any?{|d| d[DATA_VALUES_X_INDEX]}
219
+ super unless @data.any? { |d| d[DATA_VALUES_X_INDEX] }
206
220
  end
207
221
 
208
- def getXCoord(x_data_point, width, offset)
209
- return(x_data_point * width + offset)
222
+ def get_x_coord(x_data_point, width, offset)
223
+ x_data_point * width + offset
210
224
  end
211
225
 
212
226
  def contains_one_point_only?(data_row)
213
227
  # Spin through data to determine if there is just one_value present.
214
228
  one_point = false
215
229
  data_row[DATA_VALUES_INDEX].each do |data_point|
216
- if !data_point.nil?
230
+ unless data_point.nil?
217
231
  if one_point
218
232
  # more than one point, bail
219
233
  return false
@@ -222,7 +236,7 @@ class Gruff::Line < Gruff::Base
222
236
  one_point = true
223
237
  end
224
238
  end
225
- return one_point
239
+ one_point
226
240
  end
227
241
 
228
242
  end