annotate lib/SVG/Graph/.svn/text-base/BarHorizontal.rb.svn-base @ 711:60773bbfe050 feature_36_testing

This approach lead to a dead end.
author Luis Figueira <luis.figueira@eecs.qmul.ac.uk>
date Wed, 21 Sep 2011 15:52:05 +0100
parents 513646585e45
children
rev   line source
Chris@0 1 require 'rexml/document'
Chris@0 2 require 'SVG/Graph/BarBase'
Chris@0 3
Chris@0 4 module SVG
Chris@0 5 module Graph
Chris@0 6 # === Create presentation quality SVG horitonzal bar graphs easily
Chris@0 7 #
Chris@0 8 # = Synopsis
Chris@0 9 #
Chris@0 10 # require 'SVG/Graph/BarHorizontal'
Chris@0 11 #
Chris@0 12 # fields = %w(Jan Feb Mar)
Chris@0 13 # data_sales_02 = [12, 45, 21]
Chris@0 14 #
Chris@0 15 # graph = SVG::Graph::BarHorizontal.new({
Chris@0 16 # :height => 500,
Chris@0 17 # :width => 300,
Chris@0 18 # :fields => fields,
Chris@0 19 # })
Chris@0 20 #
Chris@0 21 # graph.add_data({
Chris@0 22 # :data => data_sales_02,
Chris@0 23 # :title => 'Sales 2002',
Chris@0 24 # })
Chris@0 25 #
Chris@0 26 # print "Content-type: image/svg+xml\r\n\r\n"
Chris@0 27 # print graph.burn
Chris@0 28 #
Chris@0 29 # = Description
Chris@0 30 #
Chris@0 31 # This object aims to allow you to easily create high quality
Chris@0 32 # SVG horitonzal bar graphs. You can either use the default style sheet
Chris@0 33 # or supply your own. Either way there are many options which can
Chris@0 34 # be configured to give you control over how the graph is
Chris@0 35 # generated - with or without a key, data elements at each point,
Chris@0 36 # title, subtitle etc.
Chris@0 37 #
Chris@0 38 # = Examples
Chris@0 39 #
Chris@0 40 # * http://germane-software.com/repositories/public/SVG/test/test.rb
Chris@0 41 #
Chris@0 42 # = See also
Chris@0 43 #
Chris@0 44 # * SVG::Graph::Graph
Chris@0 45 # * SVG::Graph::Bar
Chris@0 46 # * SVG::Graph::Line
Chris@0 47 # * SVG::Graph::Pie
Chris@0 48 # * SVG::Graph::Plot
Chris@0 49 # * SVG::Graph::TimeSeries
Chris@0 50 #
Chris@0 51 # == Author
Chris@0 52 #
Chris@0 53 # Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
Chris@0 54 #
Chris@0 55 # Copyright 2004 Sean E. Russell
Chris@0 56 # This software is available under the Ruby license[LICENSE.txt]
Chris@0 57 #
Chris@0 58 class BarHorizontal < BarBase
Chris@0 59 # In addition to the defaults set in BarBase::set_defaults, sets
Chris@0 60 # [rotate_y_labels] true
Chris@0 61 # [show_x_guidelines] true
Chris@0 62 # [show_y_guidelines] false
Chris@0 63 def set_defaults
Chris@0 64 super
Chris@0 65 init_with(
Chris@0 66 :rotate_y_labels => true,
Chris@0 67 :show_x_guidelines => true,
Chris@0 68 :show_y_guidelines => false
Chris@0 69 )
Chris@0 70 self.right_align = self.right_font = 1
Chris@0 71 end
Chris@0 72
Chris@0 73 protected
Chris@0 74
Chris@0 75 def get_x_labels
Chris@0 76 maxvalue = max_value
Chris@0 77 minvalue = min_value
Chris@0 78 range = maxvalue - minvalue
Chris@0 79 top_pad = range == 0 ? 10 : range / 20.0
Chris@0 80 scale_range = (maxvalue + top_pad) - minvalue
Chris@0 81
Chris@0 82 scale_division = scale_divisions || (scale_range / 10.0)
Chris@0 83
Chris@0 84 if scale_integers
Chris@0 85 scale_division = scale_division < 1 ? 1 : scale_division.round
Chris@0 86 end
Chris@0 87
Chris@0 88 rv = []
Chris@0 89 maxvalue = maxvalue%scale_division == 0 ?
Chris@0 90 maxvalue : maxvalue + scale_division
Chris@0 91 minvalue.step( maxvalue, scale_division ) {|v| rv << v}
Chris@0 92 return rv
Chris@0 93 end
Chris@0 94
Chris@0 95 def get_y_labels
Chris@0 96 @config[:fields]
Chris@0 97 end
Chris@0 98
Chris@0 99 def y_label_offset( height )
Chris@0 100 height / -2.0
Chris@0 101 end
Chris@0 102
Chris@0 103 def draw_data
Chris@0 104 minvalue = min_value
Chris@0 105 fieldheight = field_height
Chris@0 106
Chris@0 107 unit_size = (@graph_width.to_f - font_size*2*right_font ) /
Chris@0 108 (get_x_labels.max - get_x_labels.min )
Chris@0 109 bargap = bar_gap ? (fieldheight < 10 ? fieldheight / 2 : 10) : 0
Chris@0 110
Chris@0 111 bar_height = fieldheight - bargap
Chris@0 112 bar_height /= @data.length if stack == :side
Chris@0 113 y_mod = (bar_height / 2) + (font_size / 2)
Chris@0 114
Chris@0 115 field_count = 1
Chris@0 116 @config[:fields].each_index { |i|
Chris@0 117 dataset_count = 0
Chris@0 118 for dataset in @data
Chris@0 119 value = dataset[:data][i]
Chris@0 120
Chris@0 121 top = @graph_height - (fieldheight * field_count)
Chris@0 122 top += (bar_height * dataset_count) if stack == :side
Chris@0 123 # cases (assume 0 = +ve):
Chris@0 124 # value min length left
Chris@0 125 # +ve +ve value.abs - min minvalue.abs
Chris@0 126 # +ve -ve value.abs - 0 minvalue.abs
Chris@0 127 # -ve -ve value.abs - 0 minvalue.abs + value
Chris@0 128 length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
Chris@0 129 left = (minvalue.abs + (value < 0 ? value : 0)) * unit_size
Chris@0 130
Chris@0 131 @graph.add_element( "rect", {
Chris@0 132 "x" => left.to_s,
Chris@0 133 "y" => top.to_s,
Chris@0 134 "width" => length.to_s,
Chris@0 135 "height" => bar_height.to_s,
Chris@0 136 "class" => "fill#{dataset_count+1}"
Chris@0 137 })
Chris@0 138
Chris@0 139 make_datapoint_text(
Chris@0 140 left+length+5, top+y_mod, value, "text-anchor: start; "
Chris@0 141 )
Chris@0 142 dataset_count += 1
Chris@0 143 end
Chris@0 144 field_count += 1
Chris@0 145 }
Chris@0 146 end
Chris@0 147 end
Chris@0 148 end
Chris@0 149 end