Class: Gruff::StackedBar

Inherits:
Base
  • Object
show all
Includes:
StackedMixin
Defined in:
lib/gruff/stacked_bar.rb

Direct Known Subclasses

AccumulatorBar

Constant Summary

Constants inherited from Base

Base::DATA_COLOR_INDEX, Base::DATA_LABEL_INDEX, Base::DATA_VALUES_INDEX, Base::DATA_VALUES_X_INDEX, Base::DEBUG, Base::DEFAULT_MARGIN, Base::DEFAULT_TARGET_WIDTH, Base::LABEL_MARGIN, Base::LEGEND_MARGIN, Base::THOUSAND_SEPARATOR

Instance Attribute Summary collapse

Attributes inherited from Base

#additional_line_values, #bottom_margin, #center_labels_over_point, #colors, #font, #font_color, #has_left_labels, #hide_legend, #hide_line_markers, #hide_line_numbers, #hide_title, #labels, #left_margin, #legend_box_size, #legend_font_size, #legend_margin, #marker_color, #marker_count, #marker_font_size, #maximum_value, #minimum_value, #no_data_message, #right_margin, #sort, #stacked, #title, #title_font_size, #title_margin, #top_margin, #x_axis_label, #y_axis_increment, #y_axis_label

Instance Method Summary collapse

Methods inherited from Base

#add_color, #data, #initialize, #initialize_ivars, #margins=, #replace_colors, #theme=, #theme_37signals, #theme_greyscale, #theme_keynote, #theme_odeo, #theme_pastel, #theme_rails_keynote, #to_blob, #write

Methods included from Deprecated

#graph_height, #graph_left, #graph_top, #graph_width, #scale_measurements, #total_height

Constructor Details

This class inherits a constructor from Gruff::Base

Instance Attribute Details

#bar_spacingObject

Spacing factor applied between bars



9
10
11
# File 'lib/gruff/stacked_bar.rb', line 9

def bar_spacing
  @bar_spacing
end

Instance Method Details

#drawObject

Draws a bar graph, but multiple sets are stacked on top of each other.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/gruff/stacked_bar.rb', line 12

def draw
  get_maximum_by_stack
  super
  return unless @has_data

  # Setup spacing.
  #
  # Columns sit stacked.
  @bar_spacing ||= 0.9
  @bar_width = @graph_width / @column_count.to_f
  padding = (@bar_width * (1 - @bar_spacing)) / 2

  @d = @d.stroke_opacity 0.0
  
  height = Array.new(@column_count, 0)

  @norm_data.each_with_index do |data_row, row_index|      
    data_row[DATA_VALUES_INDEX].each_with_index do |data_point, point_index|
      @d = @d.fill data_row[DATA_COLOR_INDEX]
      
      # Calculate center based on bar_width and current row
      label_center = @graph_left + (@bar_width * point_index) + (@bar_width * @bar_spacing / 2.0)
      draw_label(label_center, point_index)

      next if (data_point == 0)
      # Use incremented x and scaled y
      left_x = @graph_left + (@bar_width * point_index) + padding
      left_y = @graph_top + (@graph_height -
                             data_point * @graph_height - 
                             height[point_index]) + 1
      right_x = left_x + @bar_width * @bar_spacing
      right_y = @graph_top + @graph_height - height[point_index] - 1
      
      # update the total height of the current stacked bar
      height[point_index] += (data_point * @graph_height ) 
      
      @d = @d.rectangle(left_x, left_y, right_x, right_y)
      
    end

  end

  @d.draw(@base_image)    
end