Class: Gruff::StackedBar

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

Direct Known Subclasses

AccumulatorBar

Constant Summary

Constants inherited from Base

Base::DATA_ATTRS_INDEX, Base::DATA_COLOR_INDEX, Base::DATA_LABEL_INDEX, Base::DATA_VALUES_INDEX, Base::DEBUG, Base::DEFAULT_TARGET_WIDTH, Base::LEGEND_MARGIN

Instance Attribute Summary

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, #label_rotation, #labels, #left_margin, #legend_box_size, #legend_font_size, #marker_color, #marker_count, #marker_font_size, #maximum_value, #minimum_value, #no_data_message, #right_margin, #sort, #stacked, #title, #title_font_size, #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, #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 Method Details

#drawObject

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



11
12
13
14
15
16
# File 'lib/gruff/stacked_bar.rb', line 11

def draw
  get_maximum_by_stack
  super
  draw_stacked_bars if @has_data
  draw_ldata if @has_ldata
end

#draw_stacked_barsObject



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
60
61
62
63
64
# File 'lib/gruff/stacked_bar.rb', line 19

def draw_stacked_bars

  # Setup spacing.
  #
  # Columns sit stacked.
  spacing_factor = 0.9
  @bar_width = @graph_width / @column_count.to_f
  padding = (@bar_width * (1 - spacing_factor)) / 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 * spacing_factor / 2.0)
      draw_label(label_center, point_index)

      # 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 * spacing_factor
      right_y = @graph_top + @graph_height - height[point_index] - 1
      

	  if @has_ldata
 @ldata_offset_and_increment[row_index] ||=
   [ label_center, @bar_width ]
	  end

      next if (data_point == 0)
	  
	  # 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