Chris@0
|
1 require 'rexml/document'
|
Chris@0
|
2 require 'SVG/Graph/Graph'
|
Chris@0
|
3
|
Chris@0
|
4 module SVG
|
Chris@0
|
5 module Graph
|
Chris@0
|
6 # = Synopsis
|
Chris@0
|
7 #
|
Chris@0
|
8 # A superclass for bar-style graphs. Do not attempt to instantiate
|
Chris@0
|
9 # directly; use one of the subclasses instead.
|
Chris@0
|
10 #
|
Chris@0
|
11 # = Author
|
Chris@0
|
12 #
|
Chris@0
|
13 # Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
Chris@0
|
14 #
|
Chris@0
|
15 # Copyright 2004 Sean E. Russell
|
Chris@0
|
16 # This software is available under the Ruby license[LICENSE.txt]
|
Chris@0
|
17 #
|
Chris@0
|
18 class BarBase < SVG::Graph::Graph
|
Chris@0
|
19 # Ensures that :fields are provided in the configuration.
|
Chris@0
|
20 def initialize config
|
Chris@0
|
21 raise "fields was not supplied or is empty" unless config[:fields] &&
|
Chris@0
|
22 config[:fields].kind_of?(Array) &&
|
Chris@0
|
23 config[:fields].length > 0
|
Chris@0
|
24 super
|
Chris@0
|
25 end
|
Chris@0
|
26
|
Chris@0
|
27 # In addition to the defaults set in Graph::initialize, sets
|
Chris@0
|
28 # [bar_gap] true
|
Chris@0
|
29 # [stack] :overlap
|
Chris@0
|
30 def set_defaults
|
Chris@0
|
31 init_with( :bar_gap => true, :stack => :overlap )
|
Chris@0
|
32 end
|
Chris@0
|
33
|
Chris@0
|
34 # Whether to have a gap between the bars or not, default
|
Chris@0
|
35 # is true, set to false if you don't want gaps.
|
Chris@0
|
36 attr_accessor :bar_gap
|
Chris@0
|
37 # How to stack data sets. :overlap overlaps bars with
|
Chris@0
|
38 # transparent colors, :top stacks bars on top of one another,
|
Chris@0
|
39 # :side stacks the bars side-by-side. Defaults to :overlap.
|
Chris@0
|
40 attr_accessor :stack
|
Chris@0
|
41
|
Chris@0
|
42
|
Chris@0
|
43 protected
|
Chris@0
|
44
|
Chris@0
|
45 def max_value
|
Chris@0
|
46 @data.collect{|x| x[:data].max}.max
|
Chris@0
|
47 end
|
Chris@0
|
48
|
Chris@0
|
49 def min_value
|
Chris@0
|
50 min = 0
|
Chris@0
|
51 if min_scale_value.nil?
|
Chris@0
|
52 min = @data.collect{|x| x[:data].min}.min
|
Chris@0
|
53 min = min > 0 ? 0 : min
|
Chris@0
|
54 else
|
Chris@0
|
55 min = min_scale_value
|
Chris@0
|
56 end
|
Chris@0
|
57 return min
|
Chris@0
|
58 end
|
Chris@0
|
59
|
Chris@0
|
60 def get_css
|
Chris@0
|
61 return <<EOL
|
Chris@0
|
62 /* default fill styles for multiple datasets (probably only use a single dataset on this graph though) */
|
Chris@0
|
63 .key1,.fill1{
|
Chris@0
|
64 fill: #ff0000;
|
Chris@0
|
65 fill-opacity: 0.5;
|
Chris@0
|
66 stroke: none;
|
Chris@0
|
67 stroke-width: 0.5px;
|
Chris@0
|
68 }
|
Chris@0
|
69 .key2,.fill2{
|
Chris@0
|
70 fill: #0000ff;
|
Chris@0
|
71 fill-opacity: 0.5;
|
Chris@0
|
72 stroke: none;
|
Chris@0
|
73 stroke-width: 1px;
|
Chris@0
|
74 }
|
Chris@0
|
75 .key3,.fill3{
|
Chris@0
|
76 fill: #00ff00;
|
Chris@0
|
77 fill-opacity: 0.5;
|
Chris@0
|
78 stroke: none;
|
Chris@0
|
79 stroke-width: 1px;
|
Chris@0
|
80 }
|
Chris@0
|
81 .key4,.fill4{
|
Chris@0
|
82 fill: #ffcc00;
|
Chris@0
|
83 fill-opacity: 0.5;
|
Chris@0
|
84 stroke: none;
|
Chris@0
|
85 stroke-width: 1px;
|
Chris@0
|
86 }
|
Chris@0
|
87 .key5,.fill5{
|
Chris@0
|
88 fill: #00ccff;
|
Chris@0
|
89 fill-opacity: 0.5;
|
Chris@0
|
90 stroke: none;
|
Chris@0
|
91 stroke-width: 1px;
|
Chris@0
|
92 }
|
Chris@0
|
93 .key6,.fill6{
|
Chris@0
|
94 fill: #ff00ff;
|
Chris@0
|
95 fill-opacity: 0.5;
|
Chris@0
|
96 stroke: none;
|
Chris@0
|
97 stroke-width: 1px;
|
Chris@0
|
98 }
|
Chris@0
|
99 .key7,.fill7{
|
Chris@0
|
100 fill: #00ffff;
|
Chris@0
|
101 fill-opacity: 0.5;
|
Chris@0
|
102 stroke: none;
|
Chris@0
|
103 stroke-width: 1px;
|
Chris@0
|
104 }
|
Chris@0
|
105 .key8,.fill8{
|
Chris@0
|
106 fill: #ffff00;
|
Chris@0
|
107 fill-opacity: 0.5;
|
Chris@0
|
108 stroke: none;
|
Chris@0
|
109 stroke-width: 1px;
|
Chris@0
|
110 }
|
Chris@0
|
111 .key9,.fill9{
|
Chris@0
|
112 fill: #cc6666;
|
Chris@0
|
113 fill-opacity: 0.5;
|
Chris@0
|
114 stroke: none;
|
Chris@0
|
115 stroke-width: 1px;
|
Chris@0
|
116 }
|
Chris@0
|
117 .key10,.fill10{
|
Chris@0
|
118 fill: #663399;
|
Chris@0
|
119 fill-opacity: 0.5;
|
Chris@0
|
120 stroke: none;
|
Chris@0
|
121 stroke-width: 1px;
|
Chris@0
|
122 }
|
Chris@0
|
123 .key11,.fill11{
|
Chris@0
|
124 fill: #339900;
|
Chris@0
|
125 fill-opacity: 0.5;
|
Chris@0
|
126 stroke: none;
|
Chris@0
|
127 stroke-width: 1px;
|
Chris@0
|
128 }
|
Chris@0
|
129 .key12,.fill12{
|
Chris@0
|
130 fill: #9966FF;
|
Chris@0
|
131 fill-opacity: 0.5;
|
Chris@0
|
132 stroke: none;
|
Chris@0
|
133 stroke-width: 1px;
|
Chris@0
|
134 }
|
Chris@0
|
135 EOL
|
Chris@0
|
136 end
|
Chris@0
|
137 end
|
Chris@0
|
138 end
|
Chris@0
|
139 end
|