Class: Gruff::Bullet
Overview
A bullet graph is a variation of a bar graph. en.wikipedia.org/wiki/Bullet_graph
Here’s how to set up a Gruff::Bullet.
g = Gruff::Bullet.new
g.title = 'Monthly Revenue'
g.data 75, 100, { target: 80, low: 50, high: 90 }
g.write('bullet.png')
Constant Summary
Constants inherited from Base
Gruff::Base::DEFAULT_MARGIN, Gruff::Base::DEFAULT_TARGET_WIDTH, Gruff::Base::LABEL_MARGIN, Gruff::Base::LEGEND_MARGIN, Gruff::Base::TITLE_MARGIN
Instance Attribute Summary
Attributes inherited from Base
#bottom_margin, #colors, #hide_legend, #hide_line_markers, #hide_line_numbers, #hide_title, #label_margin, #label_max_size, #label_truncation_style, #left_margin, #legend_at_bottom, #legend_box_size, #legend_margin, #marker_color, #marker_shadow_color, #maximum_value, #minimum_value, #no_data_message, #right_margin, #sort, #sorted_drawing, #title_margin, #top_margin, #x_axis_increment, #x_axis_label_format, #y_axis_increment, #y_axis_label_format
Instance Method Summary collapse
- #data(value, maximum_value, options = {}) ⇒ Object
- #draw ⇒ Object
-
#initialize(target_width = '400x40') ⇒ Bullet
constructor
A new instance of Bullet.
Methods inherited from Base
#add_color, #bold_title=, #font=, #font_color=, #label_rotation=, #label_stagger_height=, #labels=, #legend_font_size=, #margins=, #marker_font_size=, #no_data_font_size=, #replace_colors, #theme=, #theme_37signals, #theme_greyscale, #theme_keynote, #theme_odeo, #theme_pastel, #theme_rails_keynote, #title=, #title_font=, #title_font_size=, #to_blob, #to_image, #transparent_background=, #write
Constructor Details
#initialize(target_width = '400x40') ⇒ Bullet
Returns a new instance of Bullet.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/gruff/bullet.rb', line 19 def initialize(target_width = '400x40') super if target_width.is_a?(String) @columns, @rows = target_width.split('x').map(&:to_f) else @columns = target_width.to_f @rows = target_width.to_f / 5.0 end @columns.freeze @rows.freeze self.theme = Gruff::Themes::GREYSCALE end |
Instance Method Details
#data(value, maximum_value, options = {}) ⇒ Object
47 48 49 50 51 52 |
# File 'lib/gruff/bullet.rb', line 47 def data(value, maximum_value, = {}) @value = value.to_f self.maximum_value = maximum_value.to_f @options = @options.map { |k, v| @options[k] = v.to_f if v.respond_to?(:to_f) } end |
#draw ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/gruff/bullet.rb', line 55 def draw # TODO: Left label # TODO Bottom labels and markers # @graph_bottom # Calculations are off 800x??? @colors.reverse! draw_title title_width = calculate_width(@title_font, @title) margin = 30.0 thickness = @raw_rows / 6.0 right_margin = margin graph_left = [title_width * 1.3, margin].max graph_width = @raw_columns - graph_left - right_margin graph_height = thickness * 3.0 # Background rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: @colors[0]) rect_renderer.render(graph_left, 0, graph_left + graph_width, graph_height) %i[high low].each_with_index do |indicator, index| next unless @options.key?(indicator) indicator_width_x = graph_left + (graph_width * (@options[indicator] / maximum_value)) rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: @colors[index + 1]) rect_renderer.render(graph_left, 0, indicator_width_x, graph_height) end if @options.key?(:target) target_x = graph_left + (graph_width * (@options[:target] / maximum_value)) half_thickness = thickness / 2.0 rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: @marker_color) rect_renderer.render(target_x, half_thickness, target_x + half_thickness, (thickness * 2) + half_thickness) end # Value rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: @marker_color) rect_renderer.render(graph_left, thickness, graph_left + (graph_width * (@value / maximum_value)), thickness * 2) end |