Class: Gruff::Bullet

Inherits:
Base
  • Object
show all
Defined in:
lib/gruff/bullet.rb

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

#bold_title, #bottom_margin, #center_labels_over_point, #colors, #font_color, #has_left_labels, #hide_legend, #hide_line_markers, #hide_line_numbers, #hide_title, #label_max_size, #label_stagger_height, #label_truncation_style, #labels, #left_margin, #legend_at_bottom, #legend_box_size, #legend_font_size, #legend_margin, #marker_color, #marker_font_size, #marker_shadow_color, #maximum_value, #minimum_value, #no_data_message, #right_margin, #sort, #sorted_drawing, #title, #title_font, #title_font_size, #title_margin, #top_margin, #use_data_label, #x_axis_increment, #x_axis_label, #y_axis_increment, #y_axis_label

Instance Method Summary collapse

Methods inherited from Base

#add_color, #font=, #margins=, #replace_colors, #theme=, #theme_37signals, #theme_greyscale, #theme_keynote, #theme_odeo, #theme_pastel, #theme_rails_keynote, #to_blob, #to_image, #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



37
38
39
40
41
42
# File 'lib/gruff/bullet.rb', line 37

def data(value, maximum_value, options = {})
  @value = value.to_f
  self.maximum_value = maximum_value.to_f
  @options = options
  @options.map { |k, v| @options[k] = v.to_f if v.is_a?(Numeric) }
end

#drawObject



44
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
# File 'lib/gruff/bullet.rb', line 44

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_size, @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(color: @colors[0])
  rect_renderer.render(graph_left, 0, graph_left + graph_width, graph_height)

  [: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(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(color: @font_color)
    rect_renderer.render(target_x, half_thickness, target_x + half_thickness, thickness * 2 + half_thickness)
  end

  # Value
  rect_renderer = Gruff::Renderer::Rectangle.new(color: @font_color)
  rect_renderer.render(graph_left, thickness, graph_left + graph_width * (@value / maximum_value), thickness * 2)
end