Chris@909: require 'rexml/document' Chris@909: require 'SVG/Graph/Graph' Chris@909: Chris@909: module SVG Chris@909: module Graph Chris@909: # = Synopsis Chris@909: # Chris@909: # A superclass for bar-style graphs. Do not attempt to instantiate Chris@909: # directly; use one of the subclasses instead. Chris@909: # Chris@909: # = Author Chris@909: # Chris@909: # Sean E. Russell Chris@909: # Chris@909: # Copyright 2004 Sean E. Russell Chris@909: # This software is available under the Ruby license[LICENSE.txt] Chris@909: # Chris@909: class BarBase < SVG::Graph::Graph Chris@909: # Ensures that :fields are provided in the configuration. Chris@909: def initialize config Chris@909: raise "fields was not supplied or is empty" unless config[:fields] && Chris@909: config[:fields].kind_of?(Array) && Chris@909: config[:fields].length > 0 Chris@909: super Chris@909: end Chris@909: Chris@909: # In addition to the defaults set in Graph::initialize, sets Chris@909: # [bar_gap] true Chris@909: # [stack] :overlap Chris@909: def set_defaults Chris@909: init_with( :bar_gap => true, :stack => :overlap ) Chris@909: end Chris@909: Chris@909: # Whether to have a gap between the bars or not, default Chris@909: # is true, set to false if you don't want gaps. Chris@909: attr_accessor :bar_gap Chris@909: # How to stack data sets. :overlap overlaps bars with Chris@909: # transparent colors, :top stacks bars on top of one another, Chris@909: # :side stacks the bars side-by-side. Defaults to :overlap. Chris@909: attr_accessor :stack Chris@909: Chris@909: Chris@909: protected Chris@909: Chris@909: def max_value Chris@909: @data.collect{|x| x[:data].max}.max Chris@909: end Chris@909: Chris@909: def min_value Chris@909: min = 0 Chris@909: if min_scale_value.nil? Chris@909: min = @data.collect{|x| x[:data].min}.min Chris@909: min = min > 0 ? 0 : min Chris@909: else Chris@909: min = min_scale_value Chris@909: end Chris@909: return min Chris@909: end Chris@909: Chris@909: def get_css Chris@909: return <