gruff 0.5.0-java → 0.9.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|