class SVG::Graph::BarHorizontal

Create presentation quality SVG horitonzal bar graphs easily

Synopsis

require 'SVG/Graph/BarHorizontal'

fields = %w(Jan Feb Mar)
data_sales_02 = [12, 45, 21]

graph = SVG::Graph::BarHorizontal.new({
  :height => 500,
  :width => 300,
  :fields => fields,
})

graph.add_data({
  :data => data_sales_02,
  :title => 'Sales 2002',
})

print "Content-type: image/svg+xml\r\n\r\n"
print graph.burn

Description

This object aims to allow you to easily create high quality SVG horitonzal bar graphs. You can either use the default style sheet or supply your own. Either way there are many options which can be configured to give you control over how the graph is generated - with or without a key, data elements at each point, title, subtitle etc.

Examples

See also

Author

Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>

Copyright 2004 Sean E. Russell This software is available under the Ruby license

Public Instance Methods

set_defaults() click to toggle source

In addition to the defaults set in BarBase::set_defaults, sets

rotate_y_labels

true

show_x_guidelines

true

show_y_guidelines

false

Calls superclass method SVG::Graph::BarBase#set_defaults
   # File lib/SVG/Graph/BarHorizontal.rb
63 def set_defaults
64   super
65   init_with( 
66     :rotate_y_labels    => true,
67     :show_x_guidelines  => true,
68     :show_y_guidelines  => false
69   )
70   self.right_align = self.right_font = 1
71 end

Protected Instance Methods

draw_data() click to toggle source
    # File lib/SVG/Graph/BarHorizontal.rb
103 def draw_data
104   minvalue = min_value
105   fieldheight = field_height
106 
107   unit_size = (@graph_width.to_f - font_size*2*right_font ) /
108                   (get_x_labels.max - get_x_labels.min )
109   bargap = bar_gap ? (fieldheight < 10 ? fieldheight / 2 : 10) : 0
110 
111   bar_height = fieldheight - bargap
112   bar_height /= @data.length if stack == :side
113   y_mod = (bar_height / 2) + (font_size / 2)
114   
115   field_count = 1
116   @config[:fields].each_index { |i|
117     dataset_count = 0
118     for dataset in @data
119       value = dataset[:data][i]
120       
121       top = @graph_height - (fieldheight * field_count)
122       top += (bar_height * dataset_count) if stack == :side
123       # cases (assume 0 = +ve):
124       #   value  min  length          left
125       #    +ve   +ve  value.abs - min minvalue.abs
126       #    +ve   -ve  value.abs - 0   minvalue.abs
127       #    -ve   -ve  value.abs - 0   minvalue.abs + value
128       length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
129       left = (minvalue.abs + (value < 0 ? value : 0)) * unit_size
130 
131       @graph.add_element( "rect", {
132         "x" => left.to_s,
133         "y" => top.to_s,
134         "width" => length.to_s,
135         "height" => bar_height.to_s,
136         "class" => "fill#{dataset_count+1}"
137       })
138 
139       make_datapoint_text( 
140         left+length+5, top+y_mod, value, "text-anchor: start; "
141         )
142       dataset_count += 1
143     end
144     field_count += 1
145   }
146 end
get_x_labels() click to toggle source
   # File lib/SVG/Graph/BarHorizontal.rb
75 def get_x_labels
76   maxvalue = max_value
77   minvalue = min_value
78   range = maxvalue - minvalue
79   top_pad = range == 0 ? 10 : range / 20.0
80   scale_range = (maxvalue + top_pad) - minvalue
81 
82   scale_division = scale_divisions || (scale_range / 10.0)
83 
84   if scale_integers
85     scale_division = scale_division < 1 ? 1 : scale_division.round
86   end
87 
88   rv = []
89   maxvalue = maxvalue%scale_division == 0 ? 
90     maxvalue : maxvalue + scale_division
91   minvalue.step( maxvalue, scale_division ) {|v| rv << v}
92   return rv
93 end
get_y_labels() click to toggle source
   # File lib/SVG/Graph/BarHorizontal.rb
95 def get_y_labels
96   @config[:fields]
97 end
y_label_offset( height ) click to toggle source
    # File lib/SVG/Graph/BarHorizontal.rb
 99 def y_label_offset( height )
100   height / -2.0
101 end