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
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=, #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.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/gruff/bullet.rb', line 15 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
38 39 40 41 42 43 |
# File 'lib/gruff/bullet.rb', line 38 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.is_a?(Numeric) } end |
#draw ⇒ Object
45 46 47 48 49 50 51 52 53 54 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 |
# File 'lib/gruff/bullet.rb', line 45 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 |