Class: Charts::BarChart
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_line ⇒ Object
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_count ⇒ Object
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_value ⇒ Object
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_value ⇒ Object
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_count ⇒ Object
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_count ⇒ Object
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_width ⇒ Object
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_width ⇒ Object
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_width ⇒ Object
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_line ⇒ Object
119
120
121
|
# File 'lib/charts/bar_chart/bar_chart.rb', line 119
def calc_base_line
[[normalize(0), 0].max, 1].min end
|
#calc_max ⇒ Object
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_min ⇒ Object
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_options ⇒ Object
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
|
#draw ⇒ Object
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_labels ⇒ Object
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_variables ⇒ Object
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_height ⇒ Object
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_width ⇒ Object
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_draw ⇒ Object
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_data ⇒ Object
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_margins ⇒ Object
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
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
127
128
129
|
# File 'lib/charts/bar_chart/bar_chart.rb', line 127
def vertical?
direction == :vertical
end
|