Class: Gruffy::StackedBar

Inherits:
Base
  • Object
show all
Includes:
StackedMixin
Defined in:
lib/gruffy/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, #background_label_height, #bold_title, #bottom_margin, #center_labels_over_point, #colors, #font, #font_color, #has_left_labels, #hide_legend, #hide_line_markers, #hide_line_numbers, #hide_title, #label_formatting, #label_max_size, #label_rotation, #label_stagger_height, #label_truncation_style, #label_y_axis, #labels, #left_margin, #legend_at_bottom, #legend_box_size, #legend_font_size, #legend_margin, #marker_color, #marker_count, #marker_font_size, #marker_shadow_color, #maximum_value, #minimum_value, #no_data_message, #right_margin, #show_labels_for_bar_values, #sort, #sorted_drawing, #stacked, #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, #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 Gruffy::Base

Instance Attribute Details

#bar_spacingObject

Spacing factor applied between bars



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

def bar_spacing
  @bar_spacing
end

#segment_spacingObject

Number of pixels between bar segments



12
13
14
# File 'lib/gruffy/stacked_bar.rb', line 12

def segment_spacing
  @segment_spacing
end

Instance Method Details

#drawObject

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



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
56
57
58
59
# File 'lib/gruffy/stacked_bar.rb', line 15

def draw
  get_maximum_by_stack
  super
  return unless @has_data

  # Setup spacing.
  #
  # Columns sit stacked.
  @bar_spacing ||= 0.9
  @segment_spacing ||= 1
  @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]) + @segment_spacing
      right_x = left_x + @bar_width * @bar_spacing
      right_y = @graph_top + @graph_height - height[point_index] - @segment_spacing
      
      # 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