class SVG::Graph::Bar
Create presentation quality SVG bar graphs easily¶ ↑
Synopsis¶ ↑
require 'SVG/Graph/Bar' fields = %w(Jan Feb Mar); data_sales_02 = [12, 45, 21] graph = SVG::Graph::Bar.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[www.w3c.org/tr/svg 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.
Notes¶ ↑
The default stylesheet handles upto 12 data sets, if you use more you must create your own stylesheet and add the additional settings for the extra data sets. You will know if you go over 12 data sets as they will have no style and be in black.
Examples¶ ↑
See also¶ ↑
Public Instance Methods
set_defaults()
click to toggle source
See Graph::initialize and BarBase::set_defaults
Calls superclass method
# File lib/SVG/Graph/Bar.rb, line 62 def set_defaults super self.top_align = self.top_font = 1 end
Protected Instance Methods
draw_data()
click to toggle source
# File lib/SVG/Graph/Bar.rb, line 98 def draw_data minvalue = min_value fieldwidth = field_width unit_size = (@graph_height.to_f - font_size*2*top_font) / (get_y_labels.max - get_y_labels.min) bargap = bar_gap ? (fieldwidth < 10 ? fieldwidth / 2 : 10) : 0 bar_width = fieldwidth - bargap bar_width /= @data.length if stack == :side #x_mod = (@graph_width-bargap)/2 - (stack==:side ? bar_width/2 : 0) bottom = @graph_height field_count = 0 @config[:fields].each_index { |i| dataset_count = 0 for dataset in @data # cases (assume 0 = +ve): # value min length # +ve +ve value - min # +ve -ve value - 0 # -ve -ve value.abs - 0 value = dataset[:data][i] left = (fieldwidth * field_count) length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size # top is 0 if value is negative top = bottom - (((value < 0 ? 0 : value) - minvalue) * unit_size) left += bar_width * dataset_count if stack == :side @graph.add_element( "rect", { "x" => left.to_s, "y" => top.to_s, "width" => bar_width.to_s, "height" => length.to_s, "class" => "fill#{dataset_count+1}" }) make_datapoint_text(left + bar_width/2.0, top - 6, value.to_s) dataset_count += 1 end field_count += 1 } end
get_x_labels()
click to toggle source
# File lib/SVG/Graph/Bar.rb, line 69 def get_x_labels @config[:fields] end
get_y_labels()
click to toggle source
# File lib/SVG/Graph/Bar.rb, line 73 def get_y_labels maxvalue = max_value minvalue = min_value range = maxvalue - minvalue top_pad = range == 0 ? 10 : range / 20.0 scale_range = (maxvalue + top_pad) - minvalue scale_division = scale_divisions || (scale_range / 10.0) if scale_integers scale_division = scale_division < 1 ? 1 : scale_division.round end rv = [] maxvalue = maxvalue%scale_division == 0 ? maxvalue : maxvalue + scale_division minvalue.step( maxvalue, scale_division ) {|v| rv << v} return rv end
x_label_offset( width )
click to toggle source
# File lib/SVG/Graph/Bar.rb, line 94 def x_label_offset( width ) width / 2.0 end