Class: Charts::BarChart

Inherits:
Chart
  • Object
show all
Includes:
Grid, Legend
Defined in:
lib/charts/bar_chart/bar_chart.rb

Defined Under Namespace

Classes: Bar, HorizontalBar, VerticalBar

Instance Attribute Summary collapse

Attributes inherited from Chart

#data, #options, #prepared_data, #renderer

Instance Method Summary collapse

Methods included from Legend

#draw_labels, #label_rows, #label_total_height

Methods included from Grid

#draw_grid, #grid_line_values, #lines, #number_of_grid_lines, #rounded_spread, #spread, #spread_factor, #spread_log10, #spread_order_of_magnitude

Methods inherited from Chart

#create_options_methods, #draw_background, #draw_title, #initialize, #post_draw, #render, #validate_array_and_count

Constructor Details

This class inherits a constructor from Charts::Chart

Instance Attribute Details

#base_lineObject (readonly)

Returns the value of attribute base_line.



5
6
7
# File 'lib/charts/bar_chart/bar_chart.rb', line 5

def base_line
  @base_line
end

#group_countObject (readonly)

Returns the value of attribute group_count.



5
6
7
# File 'lib/charts/bar_chart/bar_chart.rb', line 5

def group_count
  @group_count
end

#max_valueObject (readonly)

Returns the value of attribute max_value.



5
6
7
# File 'lib/charts/bar_chart/bar_chart.rb', line 5

def max_value
  @max_value
end

#min_valueObject (readonly)

Returns the value of attribute min_value.



5
6
7
# File 'lib/charts/bar_chart/bar_chart.rb', line 5

def min_value
  @min_value
end

#set_countObject (readonly)

Returns the value of attribute set_count.



5
6
7
# File 'lib/charts/bar_chart/bar_chart.rb', line 5

def set_count
  @set_count
end

#total_bar_countObject (readonly)

Returns the value of attribute total_bar_count.



5
6
7
# File 'lib/charts/bar_chart/bar_chart.rb', line 5

def total_bar_count
  @total_bar_count
end

Instance Method Details

#all_bars_widthObject



95
96
97
# File 'lib/charts/bar_chart/bar_chart.rb', line 95

def all_bars_width
  (vertical? ? inner_width : inner_height) - sum_of_group_margins
end

#bar_inner_widthObject



87
88
89
# File 'lib/charts/bar_chart/bar_chart.rb', line 87

def bar_inner_width
  bar_outer_width - 2 * bar_margin
end

#bar_outer_widthObject



91
92
93
# File 'lib/charts/bar_chart/bar_chart.rb', line 91

def bar_outer_width
  all_bars_width.to_f / total_bar_count
end

#calc_base_lineObject



119
120
121
# File 'lib/charts/bar_chart/bar_chart.rb', line 119

def calc_base_line
  [[normalize(0), 0].max, 1].min # zero value normalized and clamped between 0 and 1
end

#calc_maxObject



107
108
109
110
111
# File 'lib/charts/bar_chart/bar_chart.rb', line 107

def calc_max
  max = data.map{ |d| d.reject(&:nil?).max }.max
  max = 0 if max < 0 && include_zero
  options[:max] || max
end

#calc_minObject



113
114
115
116
117
# File 'lib/charts/bar_chart/bar_chart.rb', line 113

def calc_min
  min = data.map{ |d| d.reject(&:nil?).min }.min
  min = 0 if min > 0 && include_zero
  options[:min] || min
end

#default_optionsObject



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/charts/bar_chart/bar_chart.rb', line 21

def default_options
  super.merge(
    width:        600,
    height:       400,
    include_zero: true,
    group_margin: 20,
    bar_margin:   3,
    label_height: 20,
    label_margin: 10,
    direction:    :vertical
  )
end

#drawObject



74
75
76
77
78
79
80
81
# File 'lib/charts/bar_chart/bar_chart.rb', line 74

def draw
  prepared_data.each_with_index do |set, set_nr|
    set.each_with_index do |data_value, bar_nr_in_set|
      bar_class = vertical? ? VerticalBar : HorizontalBar
      bar_class.new(self, data_value, set_nr, bar_nr_in_set).draw unless data_value.nil?
    end
  end
end

#draw_group_labelsObject

Raises:

  • (ArgumentError)


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/charts/bar_chart/bar_chart.rb', line 54

def draw_group_labels
  return if options[:group_labels].nil? || group_labels.empty?
  raise ArgumentError if group_labels.count != group_count
  group_label_style = {
    text_anchor:  'middle',
    writing_mode: (vertical? ? 'lr' : 'tb'),
    class:        'group_label'
  }
  group_labels.each_with_index do |group_label, i|
    if vertical?
      x = outer_margin + (i + 0.5) * all_bars_width / group_count + i * group_margin
      y = outer_margin + inner_height + renderer.font_size
    else
      x = outer_margin - renderer.font_size
      y = outer_margin + (i + 0.5) * all_bars_width / group_count + i * group_margin
    end
    renderer.text group_label, x, y, group_label_style
  end
end

#initialize_instance_variablesObject



12
13
14
15
16
17
18
19
# File 'lib/charts/bar_chart/bar_chart.rb', line 12

def initialize_instance_variables
  @set_count = data.count
  @group_count = data.map(&:count).max
  @total_bar_count = set_count * group_count
  @max_value = calc_max
  @min_value = calc_min
  @base_line = calc_base_line
end

#inner_heightObject



103
104
105
# File 'lib/charts/bar_chart/bar_chart.rb', line 103

def inner_height
  height - 2 * outer_margin - label_total_height
end

#inner_widthObject



83
84
85
# File 'lib/charts/bar_chart/bar_chart.rb', line 83

def inner_width
  width - 2 * outer_margin
end

#normalize(value) ⇒ Object



123
124
125
# File 'lib/charts/bar_chart/bar_chart.rb', line 123

def normalize(value)
  (value.to_f - min_value) / (max_value - min_value)
end

#pre_drawObject



47
48
49
50
51
52
# File 'lib/charts/bar_chart/bar_chart.rb', line 47

def pre_draw
  super
  draw_grid
  draw_group_labels
  draw_labels
end

#prepare_dataObject



39
40
41
42
43
44
45
# File 'lib/charts/bar_chart/bar_chart.rb', line 39

def prepare_data
  data.map do |set|
    set.map do |value|
      value.nil? ? nil : normalize(value)
    end
  end
end

#sum_of_group_marginsObject



99
100
101
# File 'lib/charts/bar_chart/bar_chart.rb', line 99

def sum_of_group_margins
  (group_count - 1) * group_margin
end

#validate_arguments(data, options) ⇒ Object

Raises:

  • (ArgumentError)


34
35
36
37
# File 'lib/charts/bar_chart/bar_chart.rb', line 34

def validate_arguments(data, options)
  super(data, options)
  raise ArgumentError unless data.is_a? Array
end

#vertical?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'lib/charts/bar_chart/bar_chart.rb', line 127

def vertical?
  direction == :vertical
end