gruff 0.5.0-java → 0.9.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 +5 -5
- data/.editorconfig +14 -0
- data/.github/ISSUE_TEMPLATE.md +18 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +109 -0
- data/.rubocop_todo.yml +136 -0
- data/.travis.yml +24 -12
- data/.yardopts +1 -0
- data/{History.txt → CHANGELOG.md} +63 -24
- data/Gemfile +3 -7
- data/README.md +53 -25
- data/Rakefile +6 -201
- data/assets/plastik/blue.png +0 -0
- data/assets/plastik/green.png +0 -0
- data/assets/plastik/red.png +0 -0
- data/docker/Dockerfile +14 -0
- data/docker/build.sh +4 -0
- data/docker/launch.sh +4 -0
- data/gruff.gemspec +18 -14
- data/init.rb +2 -0
- data/lib/gruff.rb +25 -2
- data/lib/gruff/accumulator_bar.rb +7 -7
- data/lib/gruff/area.rb +12 -19
- data/lib/gruff/bar.rb +60 -44
- data/lib/gruff/base.rb +281 -585
- data/lib/gruff/bezier.rb +15 -18
- data/lib/gruff/bullet.rb +41 -62
- data/lib/gruff/dot.rb +26 -61
- data/lib/gruff/helper/bar_conversion.rb +47 -0
- data/lib/gruff/helper/bar_value_label_mixin.rb +30 -0
- data/lib/gruff/{stacked_mixin.rb → helper/stacked_mixin.rb} +8 -8
- data/lib/gruff/line.rb +126 -148
- data/lib/gruff/mini/bar.rb +8 -9
- data/lib/gruff/mini/legend.rb +24 -36
- data/lib/gruff/mini/pie.rb +10 -11
- data/lib/gruff/mini/side_bar.rb +9 -10
- data/lib/gruff/net.rb +37 -82
- data/lib/gruff/patch/rmagick.rb +33 -0
- data/lib/gruff/patch/string.rb +8 -0
- data/lib/gruff/photo_bar.rb +27 -30
- data/lib/gruff/pie.rb +185 -89
- data/lib/gruff/renderer/bezier.rb +21 -0
- data/lib/gruff/renderer/circle.rb +21 -0
- data/lib/gruff/renderer/dash_line.rb +22 -0
- data/lib/gruff/renderer/dot.rb +39 -0
- data/lib/gruff/renderer/ellipse.rb +21 -0
- data/lib/gruff/renderer/line.rb +34 -0
- data/lib/gruff/renderer/polygon.rb +23 -0
- data/lib/gruff/renderer/polyline.rb +21 -0
- data/lib/gruff/renderer/rectangle.rb +19 -0
- data/lib/gruff/renderer/renderer.rb +127 -0
- data/lib/gruff/renderer/text.rb +42 -0
- data/lib/gruff/scatter.rb +154 -179
- data/lib/gruff/scene.rb +31 -41
- data/lib/gruff/side_bar.rb +64 -63
- data/lib/gruff/side_stacked_bar.rb +61 -59
- data/lib/gruff/spider.rb +25 -49
- data/lib/gruff/stacked_area.rb +21 -29
- data/lib/gruff/stacked_bar.rb +77 -49
- data/lib/gruff/store/base_data.rb +34 -0
- data/lib/gruff/store/custom_data.rb +34 -0
- data/lib/gruff/store/store.rb +80 -0
- data/lib/gruff/store/xy_data.rb +55 -0
- data/lib/gruff/themes.rb +32 -33
- data/lib/gruff/version.rb +3 -1
- metadata +75 -1084
- data/Manifest.txt +0 -81
- data/RELEASE.md +0 -41
- data/assets/bubble.png +0 -0
- data/assets/city_scene/background/0000.png +0 -0
- data/assets/city_scene/background/0600.png +0 -0
- data/assets/city_scene/background/2000.png +0 -0
- data/assets/city_scene/clouds/cloudy.png +0 -0
- data/assets/city_scene/clouds/partly_cloudy.png +0 -0
- data/assets/city_scene/clouds/stormy.png +0 -0
- data/assets/city_scene/grass/default.png +0 -0
- data/assets/city_scene/haze/true.png +0 -0
- data/assets/city_scene/number_sample/1.png +0 -0
- data/assets/city_scene/number_sample/2.png +0 -0
- data/assets/city_scene/number_sample/default.png +0 -0
- data/assets/city_scene/sky/0000.png +0 -0
- data/assets/city_scene/sky/0200.png +0 -0
- data/assets/city_scene/sky/0400.png +0 -0
- data/assets/city_scene/sky/0600.png +0 -0
- data/assets/city_scene/sky/0800.png +0 -0
- data/assets/city_scene/sky/1000.png +0 -0
- data/assets/city_scene/sky/1200.png +0 -0
- data/assets/city_scene/sky/1400.png +0 -0
- data/assets/city_scene/sky/1500.png +0 -0
- data/assets/city_scene/sky/1700.png +0 -0
- data/assets/city_scene/sky/2000.png +0 -0
- data/assets/pc306715.jpg +0 -0
- data/lib/gruff/bar_conversion.rb +0 -46
- data/lib/gruff/deprecated.rb +0 -39
- data/test/gruff_test_case.rb +0 -154
- data/test/image_compare.rb +0 -58
- data/test/output/accum_bar.png +0 -0
- data/test/output/area_keynote.png +0 -0
- data/test/output/area_keynote_small.png +0 -0
- data/test/output/area_many.png +0 -0
- data/test/output/area_many_areas_small.png +0 -0
- data/test/output/area_tiny.png +0 -0
- data/test/output/area_wide.png +0 -0
- data/test/output/bar2_wrapped_legend_16_400.png +0 -0
- data/test/output/bar2_wrapped_legend_16_800.png +0 -0
- data/test/output/bar2_wrapped_legend_30_400.png +0 -0
- data/test/output/bar2_wrapped_legend_30_800.png +0 -0
- data/test/output/bar2_wrapped_legend_4_400.png +0 -0
- data/test/output/bar2_wrapped_legend_4_800.png +0 -0
- data/test/output/bar2_wrapped_legend__400.png +0 -0
- data/test/output/bar2_wrapped_legend__800.png +0 -0
- data/test/output/bar_background_gradient_bottom_top.png +0 -0
- data/test/output/bar_background_gradient_left_right.png +0 -0
- data/test/output/bar_background_gradient_right_left.png +0 -0
- data/test/output/bar_background_gradient_top_bottom.png +0 -0
- data/test/output/bar_background_gradient_topleft_bottomright.png +0 -0
- data/test/output/bar_background_gradient_topright_bottomleft.png +0 -0
- data/test/output/bar_formatted_numbers.png +0 -0
- data/test/output/bar_keynote.png +0 -0
- data/test/output/bar_keynote_small.png +0 -0
- data/test/output/bar_long_legend_text.png +0 -0
- data/test/output/bar_manual_colors.png +0 -0
- data/test/output/bar_marker_shadow.png +0 -0
- data/test/output/bar_nearly_zero_max_10.png +0 -0
- data/test/output/bar_no_legend.png +0 -0
- data/test/output/bar_no_line_markers.png +0 -0
- data/test/output/bar_no_title.png +0 -0
- data/test/output/bar_no_title_or_legend.png +0 -0
- data/test/output/bar_odeo.png +0 -0
- data/test/output/bar_one_value.png +0 -0
- data/test/output/bar_pos_neg.png +0 -0
- data/test/output/bar_rails_keynote.png +0 -0
- data/test/output/bar_set_absolute_trunc.png +0 -0
- data/test/output/bar_set_label_stagger_height.png +0 -0
- data/test/output/bar_set_legend_box_size_lg.png +0 -0
- data/test/output/bar_set_legend_box_size_sm.png +0 -0
- data/test/output/bar_set_marker.png +0 -0
- data/test/output/bar_set_trailing_dots_trunc.png +0 -0
- data/test/output/bar_spacing_full.png +0 -0
- data/test/output/bar_spacing_half.png +0 -0
- data/test/output/bar_spacing_none.png +0 -0
- data/test/output/bar_tall_graph.png +0 -0
- data/test/output/bar_tall_graph_small.png +0 -0
- data/test/output/bar_themed.png +0 -0
- data/test/output/bar_title_margin.png +0 -0
- data/test/output/bar_value_labels.png +0 -0
- data/test/output/bar_wide_graph.png +0 -0
- data/test/output/bar_wide_graph_small.png +0 -0
- data/test/output/bar_wrapped_legend_16_400.png +0 -0
- data/test/output/bar_wrapped_legend_16_800.png +0 -0
- data/test/output/bar_wrapped_legend_30_400.png +0 -0
- data/test/output/bar_wrapped_legend_30_800.png +0 -0
- data/test/output/bar_wrapped_legend_4_400.png +0 -0
- data/test/output/bar_wrapped_legend_4_800.png +0 -0
- data/test/output/bar_wrapped_legend__400.png +0 -0
- data/test/output/bar_wrapped_legend__800.png +0 -0
- data/test/output/bar_x_y_labels.png +0 -0
- data/test/output/bar_y_increment_1.png +0 -0
- data/test/output/bar_y_increment_2.0.png +0 -0
- data/test/output/bar_y_increment_20.png +0 -0
- data/test/output/bar_y_increment_5.png +0 -0
- data/test/output/bar_zero_marker_count.png +0 -0
- data/test/output/bar_zero_spacing.png +0 -0
- data/test/output/bezier.png +0 -0
- data/test/output/bezier_2.png +0 -0
- data/test/output/bezier_3.png +0 -0
- data/test/output/bullet_greyscale.png +0 -0
- data/test/output/bullet_no_options.png +0 -0
- data/test/output/dot.png +0 -0
- data/test/output/dot_manual_colors.png +0 -0
- data/test/output/dot_nearly_zero_max_10.png +0 -0
- data/test/output/dot_no_legend.png +0 -0
- data/test/output/dot_no_line_markers.png +0 -0
- data/test/output/dot_no_title.png +0 -0
- data/test/output/dot_no_title_or_legend.png +0 -0
- data/test/output/dot_one_value.png +0 -0
- data/test/output/dot_pos_neg.png +0 -0
- data/test/output/dot_set_legend_box_size_lg.png +0 -0
- data/test/output/dot_set_legend_box_size_sm.png +0 -0
- data/test/output/dot_set_marker.png +0 -0
- data/test/output/dot_small.png +0 -0
- data/test/output/dot_tall_graph.png +0 -0
- data/test/output/dot_tall_graph_small.png +0 -0
- data/test/output/dot_themed.png +0 -0
- data/test/output/dot_wide_graph.png +0 -0
- data/test/output/dot_wide_graph_small.png +0 -0
- data/test/output/dot_x_y_labels.png +0 -0
- data/test/output/dot_y_increment_1.png +0 -0
- data/test/output/dot_y_increment_2.0.png +0 -0
- data/test/output/dot_y_increment_20.png +0 -0
- data/test/output/dot_y_increment_5.png +0 -0
- data/test/output/enhancements-1.png +0 -0
- data/test/output/enhancements.png +0 -0
- data/test/output/line_all_neg.png +0 -0
- data/test/output/line_all_neg_400.png +0 -0
- data/test/output/line_all_neg_no_max.png +0 -0
- data/test/output/line_baseline.png +0 -0
- data/test/output/line_hang_value.png +0 -0
- data/test/output/line_hide_dots.png +0 -0
- data/test/output/line_hide_lines.png +0 -0
- data/test/output/line_jruby_error.png +0 -0
- data/test/output/line_large.png +0 -0
- data/test/output/line_large_baseline.png +0 -0
- data/test/output/line_legend_at_bottom.png +0 -0
- data/test/output/line_many.png +0 -0
- data/test/output/line_many_lines_small.png +0 -0
- data/test/output/line_many_numbers.png +0 -0
- data/test/output/line_marker_label_accuracy.png +0 -0
- data/test/output/line_more_sets_than_colors.png +0 -0
- data/test/output/line_no_data.png +0 -0
- data/test/output/line_no_data_msg.png +0 -0
- data/test/output/line_no_data_other.png +0 -0
- data/test/output/line_no_hide.png +0 -0
- data/test/output/line_no_legend.png +0 -0
- data/test/output/line_no_line_markers.png +0 -0
- data/test/output/line_no_title.png +0 -0
- data/test/output/line_nothing_but_the_graph.png +0 -0
- data/test/output/line_one_value.png +0 -0
- data/test/output/line_one_value_array.png +0 -0
- data/test/output/line_pos_neg.png +0 -0
- data/test/output/line_pos_neg_400.png +0 -0
- data/test/output/line_reference_lines.png +0 -0
- data/test/output/line_similar_high_end_values.png +0 -0
- data/test/output/line_similar_high_end_values_with_floor.png +0 -0
- data/test/output/line_small_small_zero.png +0 -0
- data/test/output/line_small_values.png +0 -0
- data/test/output/line_small_values_small.png +0 -0
- data/test/output/line_small_zero.png +0 -0
- data/test/output/line_some_nil_points.png +0 -0
- data/test/output/line_theme_37signals_.png +0 -0
- data/test/output/line_theme_37signals_400.png +0 -0
- data/test/output/line_theme_keynote_.png +0 -0
- data/test/output/line_theme_keynote_400.png +0 -0
- data/test/output/line_theme_odeo_.png +0 -0
- data/test/output/line_theme_odeo_400.png +0 -0
- data/test/output/line_theme_rails_keynote_.png +0 -0
- data/test/output/line_theme_rails_keynote_400.png +0 -0
- data/test/output/line_tiny.png +0 -0
- data/test/output/line_transparent.png +0 -0
- data/test/output/line_very_small.png +0 -0
- data/test/output/line_webp.webp +0 -0
- data/test/output/line_wide_graph.png +0 -0
- data/test/output/line_wide_graph_small.png +0 -0
- data/test/output/line_xy.png +0 -0
- data/test/output/line_xy_pairs.png +0 -0
- data/test/output/line_y_axis_increment.png +0 -0
- data/test/output/mini_bar.png +0 -0
- data/test/output/mini_pie.png +0 -0
- data/test/output/mini_pie_right_legend.png +0 -0
- data/test/output/mini_side_bar.png +0 -0
- data/test/output/mini_side_bar_multi_color.png +0 -0
- data/test/output/net_dots_tiny.png +0 -0
- data/test/output/net_large.png +0 -0
- data/test/output/net_many.png +0 -0
- data/test/output/net_many_nets_small.png +0 -0
- data/test/output/net_no_data.png +0 -0
- data/test/output/net_no_data_msg.png +0 -0
- data/test/output/net_no_data_other.png +0 -0
- data/test/output/net_no_legend.png +0 -0
- data/test/output/net_no_net_markers.png +0 -0
- data/test/output/net_no_title.png +0 -0
- data/test/output/net_nothing_but_the_graph.png +0 -0
- data/test/output/net_similar_high_end_values.png +0 -0
- data/test/output/net_small.png +0 -0
- data/test/output/net_small_small.png +0 -0
- data/test/output/net_small_small_zero.png +0 -0
- data/test/output/net_small_zero.png +0 -0
- data/test/output/net_wide_graph.png +0 -0
- data/test/output/net_wide_graph_small.png +0 -0
- data/test/output/pie_equal.png +0 -0
- data/test/output/pie_grey.png +0 -0
- data/test/output/pie_keynote.png +0 -0
- data/test/output/pie_keynote_small.png +0 -0
- data/test/output/pie_legend.png +0 -0
- data/test/output/pie_legend_small.png +0 -0
- data/test/output/pie_nearly_equal.png +0 -0
- data/test/output/pie_one_val.png +0 -0
- data/test/output/pie_pastel.png +0 -0
- data/test/output/pie_simple.png +0 -0
- data/test/output/pie_wide.png +0 -0
- data/test/output/pie_wrapped_legend_16_400.png +0 -0
- data/test/output/pie_wrapped_legend_16_800.png +0 -0
- data/test/output/pie_wrapped_legend_30_400.png +0 -0
- data/test/output/pie_wrapped_legend_30_800.png +0 -0
- data/test/output/pie_wrapped_legend_4_400.png +0 -0
- data/test/output/pie_wrapped_legend_4_800.png +0 -0
- data/test/output/pie_wrapped_legend__400.png +0 -0
- data/test/output/pie_wrapped_legend__800.png +0 -0
- data/test/output/pie_zero.png +0 -0
- data/test/output/scatter_all_neg.png +0 -0
- data/test/output/scatter_all_neg_400.png +0 -0
- data/test/output/scatter_basic.png +0 -0
- data/test/output/scatter_many.png +0 -0
- data/test/output/scatter_no_data.png +0 -0
- data/test/output/scatter_no_data_msg.png +0 -0
- data/test/output/scatter_no_data_other.png +0 -0
- data/test/output/scatter_no_hide.png +0 -0
- data/test/output/scatter_no_labels.png +0 -0
- data/test/output/scatter_no_legend.png +0 -0
- data/test/output/scatter_no_line_markers.png +0 -0
- data/test/output/scatter_no_title.png +0 -0
- data/test/output/scatter_nothing_but_the_graph.png +0 -0
- data/test/output/scatter_pos_neg.png +0 -0
- data/test/output/scatter_pos_neg_400.png +0 -0
- data/test/output/scatter_wide_graph.png +0 -0
- data/test/output/scatter_wide_graph_small.png +0 -0
- data/test/output/scene_hazy_night.png +0 -0
- data/test/output/scene_not_hazy_day.png +0 -0
- data/test/output/scene_partly_cloudy_day.png +0 -0
- data/test/output/scene_stormy_day.png +0 -0
- data/test/output/scene_stormy_night.png +0 -0
- data/test/output/side_bar.png +0 -0
- data/test/output/side_bar_data_range.png +0 -0
- data/test/output/side_bar_labels.png +0 -0
- data/test/output/side_bar_spacing_full.png +0 -0
- data/test/output/side_bar_spacing_half.png +0 -0
- data/test/output/side_bar_spacing_none.png +0 -0
- data/test/output/side_stacked_bar_keynote.png +0 -0
- data/test/output/side_stacked_bar_keynote_small.png +0 -0
- data/test/output/side_stacked_bar_labels.png +0 -0
- data/test/output/side_stacked_bar_long_label.png +0 -0
- data/test/output/side_stacked_bar_wide.png +0 -0
- data/test/output/spider_37signals.png +0 -0
- data/test/output/spider_equal.png +0 -0
- data/test/output/spider_keynote.png +0 -0
- data/test/output/spider_legend.png +0 -0
- data/test/output/spider_legend_small.png +0 -0
- data/test/output/spider_lots_of_data.png +0 -0
- data/test/output/spider_lots_of_data_normal_names.png +0 -0
- data/test/output/spider_nearly_equal.png +0 -0
- data/test/output/spider_no_axes.png +0 -0
- data/test/output/spider_no_background.png +0 -0
- data/test/output/spider_no_print.png +0 -0
- data/test/output/spider_overlay_1.png +0 -0
- data/test/output/spider_overlay_2.png +0 -0
- data/test/output/spider_rotation.png +0 -0
- data/test/output/spider_small.png +0 -0
- data/test/output/spider_wide.png +0 -0
- data/test/output/spider_zero.png +0 -0
- data/test/output/stacked_area_keynote.png +0 -0
- data/test/output/stacked_area_keynote_small.png +0 -0
- data/test/output/stacked_bar_keynote.png +0 -0
- data/test/output/stacked_bar_keynote_small.png +0 -0
- data/test/output_java/accum_bar.png +0 -0
- data/test/output_java/area_keynote.png +0 -0
- data/test/output_java/area_keynote_small.png +0 -0
- data/test/output_java/area_many.png +0 -0
- data/test/output_java/area_many_areas_small.png +0 -0
- data/test/output_java/area_tiny.png +0 -0
- data/test/output_java/area_wide.png +0 -0
- data/test/output_java/bar2_wrapped_legend_16_400.png +0 -0
- data/test/output_java/bar2_wrapped_legend_16_800.png +0 -0
- data/test/output_java/bar2_wrapped_legend_30_400.png +0 -0
- data/test/output_java/bar2_wrapped_legend_30_800.png +0 -0
- data/test/output_java/bar2_wrapped_legend_4_400.png +0 -0
- data/test/output_java/bar2_wrapped_legend_4_800.png +0 -0
- data/test/output_java/bar2_wrapped_legend__400.png +0 -0
- data/test/output_java/bar2_wrapped_legend__800.png +0 -0
- data/test/output_java/bar_background_gradient_bottom_top.png +0 -0
- data/test/output_java/bar_background_gradient_left_right.png +0 -0
- data/test/output_java/bar_background_gradient_right_left.png +0 -0
- data/test/output_java/bar_background_gradient_top_bottom.png +0 -0
- data/test/output_java/bar_background_gradient_topleft_bottomright.png +0 -0
- data/test/output_java/bar_background_gradient_topright_bottomleft.png +0 -0
- data/test/output_java/bar_formatted_numbers.png +0 -0
- data/test/output_java/bar_keynote.png +0 -0
- data/test/output_java/bar_keynote_small.png +0 -0
- data/test/output_java/bar_long_legend_text.png +0 -0
- data/test/output_java/bar_manual_colors.png +0 -0
- data/test/output_java/bar_marker_shadow.png +0 -0
- data/test/output_java/bar_nearly_zero_max_10.png +0 -0
- data/test/output_java/bar_no_legend.png +0 -0
- data/test/output_java/bar_no_line_markers.png +0 -0
- data/test/output_java/bar_no_title.png +0 -0
- data/test/output_java/bar_no_title_or_legend.png +0 -0
- data/test/output_java/bar_odeo.png +0 -0
- data/test/output_java/bar_one_value.png +0 -0
- data/test/output_java/bar_pos_neg.png +0 -0
- data/test/output_java/bar_rails_keynote.png +0 -0
- data/test/output_java/bar_set_absolute_trunc.png +0 -0
- data/test/output_java/bar_set_label_stagger_height.png +0 -0
- data/test/output_java/bar_set_legend_box_size_lg.png +0 -0
- data/test/output_java/bar_set_legend_box_size_sm.png +0 -0
- data/test/output_java/bar_set_marker.png +0 -0
- data/test/output_java/bar_set_trailing_dots_trunc.png +0 -0
- data/test/output_java/bar_spacing_full.png +0 -0
- data/test/output_java/bar_spacing_half.png +0 -0
- data/test/output_java/bar_spacing_none.png +0 -0
- data/test/output_java/bar_tall_graph.png +0 -0
- data/test/output_java/bar_tall_graph_small.png +0 -0
- data/test/output_java/bar_themed.png +0 -0
- data/test/output_java/bar_title_margin.png +0 -0
- data/test/output_java/bar_value_labels.png +0 -0
- data/test/output_java/bar_wide_graph.png +0 -0
- data/test/output_java/bar_wide_graph_small.png +0 -0
- data/test/output_java/bar_wrapped_legend_16_400.png +0 -0
- data/test/output_java/bar_wrapped_legend_16_800.png +0 -0
- data/test/output_java/bar_wrapped_legend_30_400.png +0 -0
- data/test/output_java/bar_wrapped_legend_30_800.png +0 -0
- data/test/output_java/bar_wrapped_legend_4_400.png +0 -0
- data/test/output_java/bar_wrapped_legend_4_800.png +0 -0
- data/test/output_java/bar_wrapped_legend__400.png +0 -0
- data/test/output_java/bar_wrapped_legend__800.png +0 -0
- data/test/output_java/bar_x_y_labels.png +0 -0
- data/test/output_java/bar_y_increment_1.png +0 -0
- data/test/output_java/bar_y_increment_2.0.png +0 -0
- data/test/output_java/bar_y_increment_20.png +0 -0
- data/test/output_java/bar_y_increment_5.png +0 -0
- data/test/output_java/bar_zero_marker_count.png +0 -0
- data/test/output_java/bar_zero_spacing.png +0 -0
- data/test/output_java/bezier.png +0 -0
- data/test/output_java/bezier_2.png +0 -0
- data/test/output_java/bezier_3.png +0 -0
- data/test/output_java/bullet_greyscale.png +0 -0
- data/test/output_java/bullet_no_options.png +0 -0
- data/test/output_java/dot.png +0 -0
- data/test/output_java/dot_manual_colors.png +0 -0
- data/test/output_java/dot_nearly_zero_max_10.png +0 -0
- data/test/output_java/dot_no_legend.png +0 -0
- data/test/output_java/dot_no_line_markers.png +0 -0
- data/test/output_java/dot_no_title.png +0 -0
- data/test/output_java/dot_no_title_or_legend.png +0 -0
- data/test/output_java/dot_one_value.png +0 -0
- data/test/output_java/dot_pos_neg.png +0 -0
- data/test/output_java/dot_set_legend_box_size_lg.png +0 -0
- data/test/output_java/dot_set_legend_box_size_sm.png +0 -0
- data/test/output_java/dot_set_marker.png +0 -0
- data/test/output_java/dot_small.png +0 -0
- data/test/output_java/dot_tall_graph.png +0 -0
- data/test/output_java/dot_tall_graph_small.png +0 -0
- data/test/output_java/dot_themed.png +0 -0
- data/test/output_java/dot_wide_graph.png +0 -0
- data/test/output_java/dot_wide_graph_small.png +0 -0
- data/test/output_java/dot_x_y_labels.png +0 -0
- data/test/output_java/dot_y_increment_1.png +0 -0
- data/test/output_java/dot_y_increment_2.0.png +0 -0
- data/test/output_java/dot_y_increment_20.png +0 -0
- data/test/output_java/dot_y_increment_5.png +0 -0
- data/test/output_java/enhancements-1.png +0 -0
- data/test/output_java/enhancements.png +0 -0
- data/test/output_java/line_all_neg.png +0 -0
- data/test/output_java/line_all_neg_400.png +0 -0
- data/test/output_java/line_all_neg_no_max.png +0 -0
- data/test/output_java/line_baseline.png +0 -0
- data/test/output_java/line_hang_value.png +0 -0
- data/test/output_java/line_hide_dots.png +0 -0
- data/test/output_java/line_hide_lines.png +0 -0
- data/test/output_java/line_jruby_error.png +0 -0
- data/test/output_java/line_large.png +0 -0
- data/test/output_java/line_large_baseline.png +0 -0
- data/test/output_java/line_legend_at_bottom.png +0 -0
- data/test/output_java/line_many.png +0 -0
- data/test/output_java/line_many_lines_small.png +0 -0
- data/test/output_java/line_many_numbers.png +0 -0
- data/test/output_java/line_marker_label_accuracy.png +0 -0
- data/test/output_java/line_more_sets_than_colors.png +0 -0
- data/test/output_java/line_no_data.png +0 -0
- data/test/output_java/line_no_data_msg.png +0 -0
- data/test/output_java/line_no_data_other.png +0 -0
- data/test/output_java/line_no_hide.png +0 -0
- data/test/output_java/line_no_legend.png +0 -0
- data/test/output_java/line_no_line_markers.png +0 -0
- data/test/output_java/line_no_title.png +0 -0
- data/test/output_java/line_nothing_but_the_graph.png +0 -0
- data/test/output_java/line_one_value.png +0 -0
- data/test/output_java/line_one_value_array.png +0 -0
- data/test/output_java/line_pos_neg.png +0 -0
- data/test/output_java/line_pos_neg_400.png +0 -0
- data/test/output_java/line_reference_lines.png +0 -0
- data/test/output_java/line_similar_high_end_values.png +0 -0
- data/test/output_java/line_similar_high_end_values_with_floor.png +0 -0
- data/test/output_java/line_small_small_zero.png +0 -0
- data/test/output_java/line_small_values.png +0 -0
- data/test/output_java/line_small_values_small.png +0 -0
- data/test/output_java/line_small_zero.png +0 -0
- data/test/output_java/line_some_nil_points.png +0 -0
- data/test/output_java/line_theme_37signals_.png +0 -0
- data/test/output_java/line_theme_37signals_400.png +0 -0
- data/test/output_java/line_theme_keynote_.png +0 -0
- data/test/output_java/line_theme_keynote_400.png +0 -0
- data/test/output_java/line_theme_odeo_.png +0 -0
- data/test/output_java/line_theme_odeo_400.png +0 -0
- data/test/output_java/line_theme_rails_keynote_.png +0 -0
- data/test/output_java/line_theme_rails_keynote_400.png +0 -0
- data/test/output_java/line_tiny.png +0 -0
- data/test/output_java/line_transparent.png +0 -0
- data/test/output_java/line_very_small.png +0 -0
- data/test/output_java/line_webp.webp +0 -0
- data/test/output_java/line_wide_graph.png +0 -0
- data/test/output_java/line_wide_graph_small.png +0 -0
- data/test/output_java/line_xy.png +0 -0
- data/test/output_java/line_xy_pairs.png +0 -0
- data/test/output_java/line_y_axis_increment.png +0 -0
- data/test/output_java/mini_bar.png +0 -0
- data/test/output_java/mini_pie.png +0 -0
- data/test/output_java/mini_pie_right_legend.png +0 -0
- data/test/output_java/mini_side_bar.png +0 -0
- data/test/output_java/mini_side_bar_multi_color.png +0 -0
- data/test/output_java/net_dots_tiny.png +0 -0
- data/test/output_java/net_large.png +0 -0
- data/test/output_java/net_many.png +0 -0
- data/test/output_java/net_many_nets_small.png +0 -0
- data/test/output_java/net_no_data.png +0 -0
- data/test/output_java/net_no_data_msg.png +0 -0
- data/test/output_java/net_no_data_other.png +0 -0
- data/test/output_java/net_no_legend.png +0 -0
- data/test/output_java/net_no_net_markers.png +0 -0
- data/test/output_java/net_no_title.png +0 -0
- data/test/output_java/net_nothing_but_the_graph.png +0 -0
- data/test/output_java/net_similar_high_end_values.png +0 -0
- data/test/output_java/net_small.png +0 -0
- data/test/output_java/net_small_small.png +0 -0
- data/test/output_java/net_small_small_zero.png +0 -0
- data/test/output_java/net_small_zero.png +0 -0
- data/test/output_java/net_wide_graph.png +0 -0
- data/test/output_java/net_wide_graph_small.png +0 -0
- data/test/output_java/pie_equal.png +0 -0
- data/test/output_java/pie_grey.png +0 -0
- data/test/output_java/pie_keynote.png +0 -0
- data/test/output_java/pie_keynote_small.png +0 -0
- data/test/output_java/pie_legend.png +0 -0
- data/test/output_java/pie_legend_small.png +0 -0
- data/test/output_java/pie_nearly_equal.png +0 -0
- data/test/output_java/pie_one_val.png +0 -0
- data/test/output_java/pie_pastel.png +0 -0
- data/test/output_java/pie_simple.png +0 -0
- data/test/output_java/pie_wide.png +0 -0
- data/test/output_java/pie_wrapped_legend_16_400.png +0 -0
- data/test/output_java/pie_wrapped_legend_16_800.png +0 -0
- data/test/output_java/pie_wrapped_legend_30_400.png +0 -0
- data/test/output_java/pie_wrapped_legend_30_800.png +0 -0
- data/test/output_java/pie_wrapped_legend_4_400.png +0 -0
- data/test/output_java/pie_wrapped_legend_4_800.png +0 -0
- data/test/output_java/pie_wrapped_legend__400.png +0 -0
- data/test/output_java/pie_wrapped_legend__800.png +0 -0
- data/test/output_java/pie_zero.png +0 -0
- data/test/output_java/scatter_all_neg.png +0 -0
- data/test/output_java/scatter_all_neg_400.png +0 -0
- data/test/output_java/scatter_basic.png +0 -0
- data/test/output_java/scatter_many.png +0 -0
- data/test/output_java/scatter_no_data.png +0 -0
- data/test/output_java/scatter_no_data_msg.png +0 -0
- data/test/output_java/scatter_no_data_other.png +0 -0
- data/test/output_java/scatter_no_hide.png +0 -0
- data/test/output_java/scatter_no_labels.png +0 -0
- data/test/output_java/scatter_no_legend.png +0 -0
- data/test/output_java/scatter_no_line_markers.png +0 -0
- data/test/output_java/scatter_no_title.png +0 -0
- data/test/output_java/scatter_nothing_but_the_graph.png +0 -0
- data/test/output_java/scatter_pos_neg.png +0 -0
- data/test/output_java/scatter_pos_neg_400.png +0 -0
- data/test/output_java/scatter_wide_graph.png +0 -0
- data/test/output_java/scatter_wide_graph_small.png +0 -0
- data/test/output_java/scene_hazy_night.png +0 -0
- data/test/output_java/scene_not_hazy_day.png +0 -0
- data/test/output_java/scene_partly_cloudy_day.png +0 -0
- data/test/output_java/scene_stormy_day.png +0 -0
- data/test/output_java/scene_stormy_night.png +0 -0
- data/test/output_java/side_bar.png +0 -0
- data/test/output_java/side_bar_data_range.png +0 -0
- data/test/output_java/side_bar_labels.png +0 -0
- data/test/output_java/side_bar_spacing_full.png +0 -0
- data/test/output_java/side_bar_spacing_half.png +0 -0
- data/test/output_java/side_bar_spacing_none.png +0 -0
- data/test/output_java/side_stacked_bar_keynote.png +0 -0
- data/test/output_java/side_stacked_bar_keynote_small.png +0 -0
- data/test/output_java/side_stacked_bar_labels.png +0 -0
- data/test/output_java/side_stacked_bar_long_label.png +0 -0
- data/test/output_java/side_stacked_bar_wide.png +0 -0
- data/test/output_java/spider_37signals.png +0 -0
- data/test/output_java/spider_equal.png +0 -0
- data/test/output_java/spider_keynote.png +0 -0
- data/test/output_java/spider_legend.png +0 -0
- data/test/output_java/spider_legend_small.png +0 -0
- data/test/output_java/spider_lots_of_data.png +0 -0
- data/test/output_java/spider_lots_of_data_normal_names.png +0 -0
- data/test/output_java/spider_nearly_equal.png +0 -0
- data/test/output_java/spider_no_axes.png +0 -0
- data/test/output_java/spider_no_background.png +0 -0
- data/test/output_java/spider_no_print.png +0 -0
- data/test/output_java/spider_overlay_1.png +0 -0
- data/test/output_java/spider_overlay_2.png +0 -0
- data/test/output_java/spider_rotation.png +0 -0
- data/test/output_java/spider_small.png +0 -0
- data/test/output_java/spider_wide.png +0 -0
- data/test/output_java/spider_zero.png +0 -0
- data/test/output_java/stacked_area_keynote.png +0 -0
- data/test/output_java/stacked_area_keynote_small.png +0 -0
- data/test/output_java/stacked_bar_keynote.png +0 -0
- data/test/output_java/stacked_bar_keynote_small.png +0 -0
- data/test/test_accumulator_bar.rb +0 -51
- data/test/test_area.rb +0 -134
- data/test/test_bar.rb +0 -505
- data/test/test_base.rb +0 -8
- data/test/test_bezier.rb +0 -33
- data/test/test_bullet.rb +0 -26
- data/test/test_dot.rb +0 -263
- data/test/test_legend.rb +0 -68
- data/test/test_line.rb +0 -657
- data/test/test_mini_bar.rb +0 -33
- data/test/test_mini_pie.rb +0 -25
- data/test/test_mini_side_bar.rb +0 -36
- data/test/test_net.rb +0 -231
- data/test/test_photo.rb +0 -41
- data/test/test_pie.rb +0 -154
- data/test/test_scatter.rb +0 -233
- data/test/test_scene.rb +0 -100
- data/test/test_side_bar.rb +0 -56
- data/test/test_sidestacked_bar.rb +0 -105
- data/test/test_spider.rb +0 -226
- data/test/test_stacked_area.rb +0 -52
- data/test/test_stacked_bar.rb +0 -52
data/lib/gruff/line.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'gruff/base'
|
|
2
4
|
|
|
3
|
-
##
|
|
4
5
|
# Here's how to make a Line graph:
|
|
5
6
|
#
|
|
6
7
|
# g = Gruff::Line.new
|
|
@@ -9,155 +10,145 @@ require File.dirname(__FILE__) + '/base'
|
|
|
9
10
|
# g.data 'Hamburgers', [50, 19, 99, 29]
|
|
10
11
|
# g.write("test/output/line.png")
|
|
11
12
|
#
|
|
12
|
-
# There are also other options described below, such as #baseline_value, #baseline_color,
|
|
13
|
-
|
|
13
|
+
# There are also other options described below, such as {#baseline_value}, {#baseline_color},
|
|
14
|
+
# {#hide_dots}, and {#hide_lines}.
|
|
14
15
|
class Gruff::Line < Gruff::Base
|
|
15
|
-
|
|
16
|
-
# Allow for reference lines ( which are like baseline ... just allowing for more & on both axes )
|
|
16
|
+
# Allow for reference lines ( which are like baseline ... just allowing for more & on both axes ).
|
|
17
17
|
attr_accessor :reference_lines
|
|
18
18
|
attr_accessor :reference_line_default_color
|
|
19
19
|
attr_accessor :reference_line_default_width
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# Allow for vertical marker lines.
|
|
22
|
+
attr_accessor :show_vertical_markers
|
|
23
|
+
|
|
24
|
+
# Dimensions of lines and dots; calculated based on dataset size if left unspecified.
|
|
22
25
|
attr_accessor :line_width
|
|
23
26
|
attr_accessor :dot_radius
|
|
24
27
|
|
|
28
|
+
# default is +'circle'+, other options include square.
|
|
29
|
+
attr_accessor :dot_style
|
|
30
|
+
|
|
25
31
|
# Hide parts of the graph to fit more datapoints, or for a different appearance.
|
|
26
32
|
attr_accessor :hide_dots, :hide_lines
|
|
27
33
|
|
|
28
|
-
#accessors for support of xy data
|
|
34
|
+
# accessors for support of xy data.
|
|
29
35
|
attr_accessor :minimum_x_value
|
|
36
|
+
|
|
37
|
+
# accessors for support of xy data.
|
|
30
38
|
attr_accessor :maximum_x_value
|
|
31
39
|
|
|
32
40
|
# Get the value if somebody has defined it.
|
|
33
41
|
def baseline_value
|
|
34
|
-
if
|
|
42
|
+
if @reference_lines.key?(:baseline)
|
|
35
43
|
@reference_lines[:baseline][:value]
|
|
36
|
-
else
|
|
37
|
-
nil
|
|
38
44
|
end
|
|
39
45
|
end
|
|
40
46
|
|
|
41
47
|
# Set a value for a baseline reference line..
|
|
42
48
|
def baseline_value=(new_value)
|
|
43
|
-
@reference_lines[:baseline] ||=
|
|
49
|
+
@reference_lines[:baseline] ||= {}
|
|
44
50
|
@reference_lines[:baseline][:value] = new_value
|
|
45
51
|
end
|
|
46
52
|
|
|
47
53
|
def baseline_color
|
|
48
|
-
if
|
|
54
|
+
if @reference_lines.key?(:baseline)
|
|
49
55
|
@reference_lines[:baseline][:color]
|
|
50
|
-
else
|
|
51
|
-
nil
|
|
52
56
|
end
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
def baseline_color=(new_value)
|
|
56
|
-
@reference_lines[:baseline] ||=
|
|
60
|
+
@reference_lines[:baseline] ||= {}
|
|
57
61
|
@reference_lines[:baseline][:color] = new_value
|
|
58
62
|
end
|
|
59
63
|
|
|
60
|
-
# Call with target pixel width of graph (800
|
|
61
|
-
#
|
|
62
|
-
# g = Gruff::Line.new(400) # 400px wide with lines
|
|
64
|
+
# Call with target pixel width of graph (+800+, +400+, +300+), and/or +false+ to omit lines (points only).
|
|
63
65
|
#
|
|
64
|
-
#
|
|
66
|
+
# g = Gruff::Line.new(400) # 400px wide with lines
|
|
67
|
+
# g = Gruff::Line.new(400, false) # 400px wide, no lines (for backwards compatibility)
|
|
68
|
+
# g = Gruff::Line.new(false) # Defaults to 800px wide, no lines (for backwards compatibility)
|
|
65
69
|
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
# The preferred way is to call hide_dots or hide_lines instead.
|
|
70
|
+
# The preferred way is to call {#hide_dots} or {#hide_lines} instead.
|
|
69
71
|
def initialize(*args)
|
|
70
72
|
raise ArgumentError, 'Wrong number of arguments' if args.length > 2
|
|
71
|
-
|
|
73
|
+
|
|
74
|
+
if args.empty? || (!args.first.is_a?(Numeric) && !args.first.is_a?(String))
|
|
72
75
|
super()
|
|
73
76
|
else
|
|
74
77
|
super args.shift
|
|
75
78
|
end
|
|
76
79
|
|
|
77
|
-
@reference_lines =
|
|
80
|
+
@reference_lines = {}
|
|
78
81
|
@reference_line_default_color = 'red'
|
|
79
82
|
@reference_line_default_width = 5
|
|
80
83
|
|
|
81
84
|
@hide_dots = @hide_lines = false
|
|
82
85
|
@maximum_x_value = nil
|
|
83
86
|
@minimum_x_value = nil
|
|
87
|
+
|
|
88
|
+
@dot_style = 'circle'
|
|
89
|
+
|
|
90
|
+
@show_vertical_markers = false
|
|
91
|
+
|
|
92
|
+
@store = Gruff::Store.new(Gruff::Store::XYData)
|
|
84
93
|
end
|
|
85
94
|
|
|
86
95
|
# This method allows one to plot a dataset with both X and Y data.
|
|
87
96
|
#
|
|
88
|
-
#
|
|
89
|
-
# name
|
|
90
|
-
# x_data_points
|
|
91
|
-
# y_data_points
|
|
92
|
-
# color
|
|
93
|
-
#
|
|
94
|
-
# or
|
|
97
|
+
# @overload dataxy(name, x_data_points = [], y_data_points = [], color = nil)
|
|
98
|
+
# @param name [String] the title of the dataset.
|
|
99
|
+
# @param x_data_points [Array] an array containing the x data points for the graph.
|
|
100
|
+
# @param y_data_points [Array] an array containing the y data points for the graph.
|
|
101
|
+
# @param color [String] hex number indicating the line color as an RGB triplet.
|
|
95
102
|
#
|
|
96
|
-
#
|
|
97
|
-
#
|
|
98
|
-
#
|
|
103
|
+
# @overload dataxy(name, xy_data_points = [], color = nil)
|
|
104
|
+
# @param name [String] the title of the dataset.
|
|
105
|
+
# @param xy_data_points [Array] an array containing both x and y data points for the graph.
|
|
106
|
+
# @param color [String] hex number indicating the line color as an RGB triplet.
|
|
99
107
|
#
|
|
100
|
-
#
|
|
101
|
-
# -if (x_data_points.length != y_data_points.length) an error is
|
|
108
|
+
# @note
|
|
109
|
+
# - if (x_data_points.length != y_data_points.length) an error is
|
|
102
110
|
# returned.
|
|
103
|
-
# -if the color argument is nil, the next color from the default theme will
|
|
111
|
+
# - if the color argument is nil, the next color from the default theme will
|
|
104
112
|
# be used.
|
|
105
|
-
# -if you want to use a preset theme, you must set it before calling
|
|
106
|
-
# dataxy().
|
|
113
|
+
# - if you want to use a preset theme, you must set it before calling {#dataxy}.
|
|
107
114
|
#
|
|
108
|
-
#
|
|
115
|
+
# @example
|
|
109
116
|
# g = Gruff::Line.new
|
|
110
117
|
# g.title = "X/Y Dataset"
|
|
111
118
|
# g.dataxy("Apples", [1,3,4,5,6,10], [1, 2, 3, 4, 4, 3])
|
|
112
119
|
# g.dataxy("Bapples", [1,3,4,5,7,9], [1, 1, 2, 2, 3, 3])
|
|
113
120
|
# g.dataxy("Capples", [[1,1],[2,3],[3,4],[4,5],[5,7],[6,9]])
|
|
114
|
-
#
|
|
115
|
-
#
|
|
116
|
-
#
|
|
121
|
+
#
|
|
122
|
+
# # you can still use the old data method too if you want:
|
|
123
|
+
# g.data("Capples", [1, 1, 2, 2, 3, 3])
|
|
124
|
+
#
|
|
125
|
+
# # labels will be drawn at the x locations of the keys passed in.
|
|
117
126
|
# In this example the lables are drawn at x positions 2, 4, and 6:
|
|
118
127
|
# g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006'}
|
|
119
|
-
# The 0 => '2003' label will be ignored since it is outside the chart range.
|
|
120
|
-
def dataxy(name, x_data_points=[], y_data_points=[], color=nil)
|
|
121
|
-
|
|
128
|
+
# # The 0 => '2003' label will be ignored since it is outside the chart range.
|
|
129
|
+
def dataxy(name, x_data_points = [], y_data_points = [], color = nil)
|
|
130
|
+
# make sure it's an array
|
|
131
|
+
x_data_points = Array(x_data_points)
|
|
132
|
+
y_data_points = Array(y_data_points)
|
|
133
|
+
|
|
134
|
+
raise ArgumentError, 'x_data_points is nil!' if x_data_points.empty?
|
|
122
135
|
|
|
123
136
|
if x_data_points.all? { |p| p.is_a?(Array) && p.size == 2 }
|
|
124
|
-
x_data_points, y_data_points = x_data_points.
|
|
137
|
+
x_data_points, y_data_points = x_data_points.transpose
|
|
125
138
|
end
|
|
126
139
|
|
|
127
140
|
raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length
|
|
128
141
|
|
|
129
|
-
# call the existing data routine for the y data.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
x_data_points = Array(x_data_points) # make sure it's an array
|
|
133
|
-
# append the x data to the last entry that was just added in the @data member
|
|
134
|
-
@data.last[DATA_VALUES_X_INDEX] = x_data_points
|
|
135
|
-
|
|
136
|
-
# Update the global min/max values for the x data
|
|
137
|
-
x_data_points.each do |x_data_point|
|
|
138
|
-
next if x_data_point.nil?
|
|
139
|
-
|
|
140
|
-
# Setup max/min so spread starts at the low end of the data points
|
|
141
|
-
if @maximum_x_value.nil? && @minimum_x_value.nil?
|
|
142
|
-
@maximum_x_value = @minimum_x_value = x_data_point
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
@maximum_x_value = (x_data_point > @maximum_x_value) ?
|
|
146
|
-
x_data_point : @maximum_x_value
|
|
147
|
-
@minimum_x_value = (x_data_point < @minimum_x_value) ?
|
|
148
|
-
x_data_point : @minimum_x_value
|
|
149
|
-
end
|
|
150
|
-
|
|
142
|
+
# call the existing data routine for the x/y data.
|
|
143
|
+
store.add(name, y_data_points, color, x_data_points)
|
|
151
144
|
end
|
|
152
145
|
|
|
153
146
|
def draw_reference_line(reference_line, left, right, top, bottom)
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
@d.line(left, top, right, bottom)
|
|
160
|
-
@d = @d.pop
|
|
147
|
+
config = {
|
|
148
|
+
color: reference_line[:color] || @reference_line_default_color,
|
|
149
|
+
width: reference_line[:width] || @reference_line_default_width
|
|
150
|
+
}
|
|
151
|
+
Gruff::Renderer::DashLine.new(config).render(left, top, right, bottom)
|
|
161
152
|
end
|
|
162
153
|
|
|
163
154
|
def draw_horizontal_reference_line(reference_line)
|
|
@@ -167,118 +158,118 @@ class Gruff::Line < Gruff::Base
|
|
|
167
158
|
|
|
168
159
|
def draw_vertical_reference_line(reference_line)
|
|
169
160
|
index = @graph_left + (@x_increment * reference_line[:index])
|
|
170
|
-
draw_reference_line(reference_line, index, index, @graph_top, @graph_top + graph_height)
|
|
161
|
+
draw_reference_line(reference_line, index, index, @graph_top, @graph_top + @graph_height)
|
|
171
162
|
end
|
|
172
163
|
|
|
173
164
|
def draw
|
|
174
165
|
super
|
|
175
166
|
|
|
176
|
-
return unless
|
|
167
|
+
return unless data_given?
|
|
177
168
|
|
|
178
|
-
# Check to see if more than one datapoint was given. NaN can result otherwise.
|
|
179
|
-
@x_increment = (
|
|
169
|
+
# Check to see if more than one datapoint was given. NaN can result otherwise.
|
|
170
|
+
@x_increment = (column_count > 1) ? (@graph_width / (column_count - 1).to_f) : @graph_width
|
|
180
171
|
|
|
181
172
|
@reference_lines.each_value do |curr_reference_line|
|
|
182
173
|
draw_horizontal_reference_line(curr_reference_line) if curr_reference_line.key?(:norm_value)
|
|
183
174
|
draw_vertical_reference_line(curr_reference_line) if curr_reference_line.key?(:index)
|
|
184
175
|
end
|
|
185
176
|
|
|
186
|
-
@
|
|
177
|
+
if @show_vertical_markers
|
|
178
|
+
(0..column_count).each do |column|
|
|
179
|
+
x = @graph_left + @graph_width - column.to_f * @x_increment
|
|
180
|
+
|
|
181
|
+
Gruff::Renderer::Line.new(color: @marker_color).render(x, @graph_bottom, x, @graph_top)
|
|
182
|
+
#If the user specified a marker shadow color, draw a shadow just below it
|
|
183
|
+
if @marker_shadow_color
|
|
184
|
+
Gruff::Renderer::Line.new(color: @marker_shadow_color).render(x + 1, @graph_bottom, x + 1, @graph_top)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
store.norm_data.each do |data_row|
|
|
187
190
|
prev_x = prev_y = nil
|
|
188
191
|
|
|
189
|
-
|
|
192
|
+
one_point = contains_one_point_only?(data_row)
|
|
190
193
|
|
|
191
|
-
data_row
|
|
192
|
-
|
|
193
|
-
prev_x = prev_y = nil
|
|
194
|
-
next
|
|
195
|
-
end
|
|
196
|
-
x_data = data_row[DATA_VALUES_X_INDEX]
|
|
197
|
-
if x_data == nil
|
|
194
|
+
data_row.coordinates.each_with_index do |(x_data, y_data), index|
|
|
195
|
+
if x_data.nil?
|
|
198
196
|
#use the old method: equally spaced points along the x-axis
|
|
199
197
|
new_x = @graph_left + (@x_increment * index)
|
|
200
198
|
draw_label(new_x, index)
|
|
201
199
|
else
|
|
202
|
-
new_x = get_x_coord(x_data
|
|
200
|
+
new_x = get_x_coord(x_data, @graph_width, @graph_left)
|
|
203
201
|
@labels.each do |label_pos, _|
|
|
204
202
|
draw_label(@graph_left + ((label_pos - @minimum_x_value) * @graph_width) / (@maximum_x_value - @minimum_x_value), label_pos)
|
|
205
203
|
end
|
|
206
204
|
end
|
|
205
|
+
unless y_data # we can't draw a line for a null data point, we can still label the axis though
|
|
206
|
+
prev_x = prev_y = nil
|
|
207
|
+
next
|
|
208
|
+
end
|
|
207
209
|
|
|
208
|
-
new_y = @graph_top + (@graph_height -
|
|
210
|
+
new_y = @graph_top + (@graph_height - y_data * @graph_height)
|
|
209
211
|
|
|
210
212
|
# Reset each time to avoid thin-line errors
|
|
211
|
-
@
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
circle_radius = dot_radius ||
|
|
218
|
-
clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 2.5), 5.0)
|
|
219
|
-
|
|
220
|
-
if !@hide_lines && !prev_x.nil? && !prev_y.nil?
|
|
221
|
-
@d = @d.line(prev_x, prev_y, new_x, new_y)
|
|
222
|
-
elsif @one_point
|
|
223
|
-
# Show a circle if there's just one_point
|
|
224
|
-
@d = @d.circle(new_x, new_y, new_x - circle_radius, new_y)
|
|
213
|
+
stroke_width = line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 4), 5.0)
|
|
214
|
+
circle_radius = dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0)
|
|
215
|
+
|
|
216
|
+
if !@hide_lines && prev_x && prev_y
|
|
217
|
+
Gruff::Renderer::Line.new(color: data_row.color, width: stroke_width)
|
|
218
|
+
.render(prev_x, prev_y, new_x, new_y)
|
|
225
219
|
end
|
|
226
|
-
@d = @d.circle(new_x, new_y, new_x - circle_radius, new_y) unless @hide_dots
|
|
227
220
|
|
|
228
|
-
|
|
221
|
+
if one_point || !@hide_dots
|
|
222
|
+
Gruff::Renderer::Dot.new(@dot_style, color: data_row.color, width: stroke_width).render(new_x, new_y, circle_radius)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
prev_x = new_x
|
|
226
|
+
prev_y = new_y
|
|
229
227
|
end
|
|
230
228
|
end
|
|
231
229
|
|
|
232
|
-
|
|
230
|
+
Gruff::Renderer.finish
|
|
233
231
|
end
|
|
234
232
|
|
|
233
|
+
private
|
|
234
|
+
|
|
235
235
|
def setup_data
|
|
236
|
+
# Update the global min/max values for the x data
|
|
237
|
+
@maximum_x_value ||= store.max_x
|
|
238
|
+
@minimum_x_value ||= store.min_x
|
|
236
239
|
|
|
237
240
|
# Deal with horizontal reference line values that exceed the existing minimum & maximum values.
|
|
238
|
-
possible_maximums = [
|
|
239
|
-
possible_minimums = [
|
|
241
|
+
possible_maximums = [maximum_value.to_f]
|
|
242
|
+
possible_minimums = [minimum_value.to_f]
|
|
240
243
|
|
|
241
244
|
@reference_lines.each_value do |curr_reference_line|
|
|
242
|
-
if
|
|
245
|
+
if curr_reference_line.key?(:value)
|
|
243
246
|
possible_maximums << curr_reference_line[:value].to_f
|
|
244
247
|
possible_minimums << curr_reference_line[:value].to_f
|
|
245
248
|
end
|
|
246
249
|
end
|
|
247
250
|
|
|
248
|
-
|
|
249
|
-
|
|
251
|
+
self.maximum_value = possible_maximums.max
|
|
252
|
+
self.minimum_value = possible_minimums.min
|
|
250
253
|
|
|
251
254
|
super
|
|
252
255
|
end
|
|
253
256
|
|
|
254
|
-
def normalize
|
|
255
|
-
|
|
257
|
+
def normalize
|
|
258
|
+
return unless data_given?
|
|
256
259
|
|
|
257
|
-
@
|
|
260
|
+
spread_x = @maximum_x_value.to_f - @minimum_x_value.to_f
|
|
261
|
+
store.normalize(minimum_x: @minimum_x_value, spread_x: spread_x, minimum_y: minimum_value, spread_y: @spread)
|
|
258
262
|
|
|
259
|
-
|
|
263
|
+
@reference_lines.each_value do |curr_reference_line|
|
|
264
|
+
# We only care about horizontal markers ... for normalization.
|
|
260
265
|
# Vertical markers won't have a :value, they will have an :index
|
|
261
266
|
|
|
262
|
-
curr_reference_line[:norm_value] = ((curr_reference_line[:value].to_f -
|
|
263
|
-
|
|
267
|
+
curr_reference_line[:norm_value] = ((curr_reference_line[:value].to_f - minimum_value) / @spread.to_f) if curr_reference_line.key?(:value)
|
|
264
268
|
end
|
|
265
|
-
|
|
266
|
-
#normalize the x data if it is specified
|
|
267
|
-
@data.each_with_index do |data_row, index|
|
|
268
|
-
norm_x_data_points = []
|
|
269
|
-
if data_row[DATA_VALUES_X_INDEX] != nil
|
|
270
|
-
data_row[DATA_VALUES_X_INDEX].each do |x_data_point|
|
|
271
|
-
norm_x_data_points << ((x_data_point.to_f - @minimum_x_value.to_f) /
|
|
272
|
-
(@maximum_x_value.to_f - @minimum_x_value.to_f))
|
|
273
|
-
end
|
|
274
|
-
@norm_data[index] << norm_x_data_points
|
|
275
|
-
end
|
|
276
|
-
end
|
|
277
|
-
|
|
278
269
|
end
|
|
279
270
|
|
|
280
271
|
def sort_norm_data
|
|
281
|
-
super unless
|
|
272
|
+
super unless store.data.any?(&:x_points)
|
|
282
273
|
end
|
|
283
274
|
|
|
284
275
|
def get_x_coord(x_data_point, width, offset)
|
|
@@ -286,19 +277,6 @@ class Gruff::Line < Gruff::Base
|
|
|
286
277
|
end
|
|
287
278
|
|
|
288
279
|
def contains_one_point_only?(data_row)
|
|
289
|
-
|
|
290
|
-
one_point = false
|
|
291
|
-
data_row[DATA_VALUES_INDEX].each do |data_point|
|
|
292
|
-
unless data_point.nil?
|
|
293
|
-
if one_point
|
|
294
|
-
# more than one point, bail
|
|
295
|
-
return false
|
|
296
|
-
end
|
|
297
|
-
# there is at least one data point
|
|
298
|
-
one_point = true
|
|
299
|
-
end
|
|
300
|
-
end
|
|
301
|
-
one_point
|
|
280
|
+
data_row.y_points.compact.count == 1
|
|
302
281
|
end
|
|
303
|
-
|
|
304
282
|
end
|
data/lib/gruff/mini/bar.rb
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
##
|
|
2
4
|
#
|
|
3
5
|
# Makes a small bar graph suitable for display at 200px or even smaller.
|
|
4
6
|
#
|
|
5
7
|
module Gruff
|
|
6
8
|
module Mini
|
|
7
|
-
|
|
8
9
|
class Bar < Gruff::Bar
|
|
9
|
-
|
|
10
10
|
include Gruff::Mini::Legend
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
def initialize_ivars
|
|
13
13
|
super
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
@hide_legend = true
|
|
16
16
|
@hide_title = true
|
|
17
17
|
@hide_line_numbers = true
|
|
18
18
|
|
|
19
19
|
@marker_font_size = 50.0
|
|
20
|
-
@minimum_value = 0.0
|
|
21
|
-
@maximum_value = 0.0
|
|
22
20
|
@legend_font_size = 60.0
|
|
21
|
+
|
|
22
|
+
@minimum_value = 0.0
|
|
23
23
|
end
|
|
24
|
+
private :initialize_ivars
|
|
24
25
|
|
|
25
26
|
def draw
|
|
26
27
|
expand_canvas_for_vertical_legend
|
|
@@ -28,10 +29,8 @@ module Gruff
|
|
|
28
29
|
super
|
|
29
30
|
|
|
30
31
|
draw_vertical_legend
|
|
31
|
-
|
|
32
|
+
Gruff::Renderer.finish
|
|
32
33
|
end
|
|
33
|
-
|
|
34
34
|
end
|
|
35
|
-
|
|
36
35
|
end
|
|
37
36
|
end
|