Class: SVG::Graph::Graph

Inherits:
Object
  • Object
show all
Includes:
REXML
Defined in:
lib/SVG/Graph/Graph.rb

Overview

Base object for generating SVG Graphs

Synopsis

This class is only used as a superclass of specialized charts. Do not attempt to use this class directly, unless creating a new chart type.

For examples of how to subclass this class, see the existing specific subclasses, such as SVG::Graph::Pie.

Examples

For examples of how to use this package, see either the test files, or the documentation for the specific class you want to use.

  • file:test/plot.rb

  • file:test/single.rb

  • file:test/test.rb

  • file:test/timeseries.rb

Description

This package should be used as a base for creating SVG graphs.

Acknowledgements

Leo Lapworth for creating the SVG::TT::Graph package which this Ruby port is based on.

Stephen Morgan for creating the TT template and SVG.

See

  • SVG::Graph::BarHorizontal

  • SVG::Graph::Bar

  • SVG::Graph::Line

  • SVG::Graph::Pie

  • SVG::Graph::Plot

  • SVG::Graph::TimeSeries

Author

Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>

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

Direct Known Subclasses

BarBase, Line, Schedule

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Graph

Initialize the graph object with the graph settings. You won't instantiate this class directly; see the subclass for options.

width

500

height

300

show_x_guidelines

false

show_y_guidelines

true

show_data_values

true

min_scale_value

0

show_x_labels

true

stagger_x_labels

false

rotate_x_labels

false

step_x_labels

1

step_include_first_x_label

true

show_y_labels

true

rotate_y_labels

false

scale_integers

false

show_x_title

false

x_title

'X Field names'

show_y_title

false

y_title_text_direction

:bt

y_title

'Y Scale'

show_graph_title

false

graph_title

'Graph Title'

show_graph_subtitle

false

graph_subtitle

'Graph Sub Title'

key

true,

key_position

:right, # bottom or righ

font_size

12

title_font_size

16

subtitle_font_size

14

x_label_font_size

12

x_title_font_size

14

y_label_font_size

12

y_title_font_size

14

key_font_size

10

no_css

false

add_popups

false


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/SVG/Graph/Graph.rb', line 100

def initialize( config )
  @config = config

  self.top_align = self.top_font = self.right_align = self.right_font = 0

  init_with({
    :width                => 500,
    :height                => 300,
    :show_x_guidelines    => false,
    :show_y_guidelines    => true,
    :show_data_values     => true,

#          :min_scale_value      => 0,

    :show_x_labels        => true,
    :stagger_x_labels     => false,
    :rotate_x_labels      => false,
    :step_x_labels        => 1,
    :step_include_first_x_label => true,

    :show_y_labels        => true,
    :rotate_y_labels      => false,
    :stagger_y_labels     => false,
    :scale_integers       => false,

    :show_x_title         => false,
    :x_title              => 'X Field names',

    :show_y_title         => false,
    :y_title_text_direction => :bt,
    :y_title              => 'Y Scale',

    :show_graph_title      => false,
    :graph_title          => 'Graph Title',
    :show_graph_subtitle  => false,
    :graph_subtitle        => 'Graph Sub Title',
    :key                  => true, 
    :key_position          => :right, # bottom or right

    :font_size            =>12,
    :title_font_size      =>16,
    :subtitle_font_size   =>14,
    :x_label_font_size    =>12,
    :x_title_font_size    =>14,
    :y_label_font_size    =>12,
    :y_title_font_size    =>14,
    :key_font_size        =>10,
    
    :no_css               =>false,
    :add_popups           =>false,
  })

        set_defaults if respond_to? :set_defaults

  init_with config
end

Instance Attribute Details

#add_popupsObject

Add popups for the data points on some graphs


344
345
346
# File 'lib/SVG/Graph/Graph.rb', line 344

def add_popups
  @add_popups
end

#font_sizeObject

Set the font size (in points) of the data point labels


320
321
322
# File 'lib/SVG/Graph/Graph.rb', line 320

def font_size
  @font_size
end

#graph_subtitleObject

What the subtitle on the graph should be.


312
313
314
# File 'lib/SVG/Graph/Graph.rb', line 312

def graph_subtitle
  @graph_subtitle
end

#graph_titleObject

What the title on the graph should be.


307
308
309
# File 'lib/SVG/Graph/Graph.rb', line 307

def graph_title
  @graph_title
end

#heightObject

Set the height of the graph box, this is the total height

of the SVG box created - not the graph it self which auto
scales to fix the space.

231
232
233
# File 'lib/SVG/Graph/Graph.rb', line 231

def height
  @height
end

#keyObject

Whether to show a key, defaults to false, set to

true if you want to show it.

315
316
317
# File 'lib/SVG/Graph/Graph.rb', line 315

def key
  @key
end

#key_font_sizeObject

Set the key font size


334
335
336
# File 'lib/SVG/Graph/Graph.rb', line 334

def key_font_size
  @key_font_size
end

#key_positionObject

Where the key should be positioned, defaults to

:right, set to :bottom if you want to move it.

318
319
320
# File 'lib/SVG/Graph/Graph.rb', line 318

def key_position
  @key_position
end

#min_scale_valueObject

The point at which the Y axis starts, defaults to '0',

if set to nil it will default to the minimum data value.

247
248
249
# File 'lib/SVG/Graph/Graph.rb', line 247

def min_scale_value
  @min_scale_value
end

#no_cssObject

Do not use CSS if set to true. Many SVG viewers do not support CSS, but not using CSS can result in larger SVGs as well as making it impossible to change colors after the chart is generated. Defaults to false.


342
343
344
# File 'lib/SVG/Graph/Graph.rb', line 342

def no_css
  @no_css
end

#rotate_x_labelsObject

This turns the X axis labels by 90 degrees.

Default it false, to turn on set to true.

261
262
263
# File 'lib/SVG/Graph/Graph.rb', line 261

def rotate_x_labels
  @rotate_x_labels
end

#rotate_y_labelsObject

This turns the Y axis labels by 90 degrees.

Default it false, to turn on set to true.

264
265
266
# File 'lib/SVG/Graph/Graph.rb', line 264

def rotate_y_labels
  @rotate_y_labels
end

#scale_divisionsObject

This defines the gap between markers on the Y axis,

default is a 10th of the max_value, e.g. you will have
10 markers on the Y axis. NOTE: do not set this too
low - you are limited to 999 markers, after that the
graph won't generate.

288
289
290
# File 'lib/SVG/Graph/Graph.rb', line 288

def scale_divisions
  @scale_divisions
end

#scale_integersObject

Ensures only whole numbers are used as the scale divisions.

Default it false, to turn on set to true. This has no effect if 
scale divisions are less than 1.

282
283
284
# File 'lib/SVG/Graph/Graph.rb', line 282

def scale_integers
  @scale_integers
end

#show_data_valuesObject

(Bool) Show the value of each element of data on the graph


244
245
246
# File 'lib/SVG/Graph/Graph.rb', line 244

def show_data_values
  @show_data_values
end

#show_graph_subtitleObject

Whether to show a subtitle on the graph, defaults

to false, set to true to show.

310
311
312
# File 'lib/SVG/Graph/Graph.rb', line 310

def show_graph_subtitle
  @show_graph_subtitle
end

#show_graph_titleObject

Whether to show a title on the graph, defaults

to false, set to true to show.

305
306
307
# File 'lib/SVG/Graph/Graph.rb', line 305

def show_graph_title
  @show_graph_title
end

#show_x_guidelinesObject

Show guidelines for the X axis


336
337
338
# File 'lib/SVG/Graph/Graph.rb', line 336

def show_x_guidelines
  @show_x_guidelines
end

#show_x_labelsObject

Whether to show labels on the X axis or not, defaults

to true, set to false if you want to turn them off.

250
251
252
# File 'lib/SVG/Graph/Graph.rb', line 250

def show_x_labels
  @show_x_labels
end

#show_x_titleObject

Whether to show the title under the X axis labels,

default is false, set to true to show.

291
292
293
# File 'lib/SVG/Graph/Graph.rb', line 291

def show_x_title
  @show_x_title
end

#show_y_guidelinesObject

Show guidelines for the Y axis


338
339
340
# File 'lib/SVG/Graph/Graph.rb', line 338

def show_y_guidelines
  @show_y_guidelines
end

#show_y_labelsObject

Whether to show labels on the Y axis or not, defaults

to true, set to false if you want to turn them off.

278
279
280
# File 'lib/SVG/Graph/Graph.rb', line 278

def show_y_labels
  @show_y_labels
end

#show_y_titleObject

Whether to show the title under the Y axis labels,

default is false, set to true to show.

296
297
298
# File 'lib/SVG/Graph/Graph.rb', line 296

def show_y_title
  @show_y_title
end

#stagger_x_labelsObject

This puts the X labels at alternative levels so if they

are long field names they will not overlap so easily.
Default it false, to turn on set to true.

254
255
256
# File 'lib/SVG/Graph/Graph.rb', line 254

def stagger_x_labels
  @stagger_x_labels
end

#stagger_y_labelsObject

This puts the Y labels at alternative levels so if they

are long field names they will not overlap so easily.
Default it false, to turn on set to true.

258
259
260
# File 'lib/SVG/Graph/Graph.rb', line 258

def stagger_y_labels
  @stagger_y_labels
end

#step_include_first_x_labelObject

Whether to (when taking “steps” between X axis labels) step from

the first label (i.e. always include the first label) or step from
the X axis origin (i.e. start with a gap if step_x_labels is greater
than one).

275
276
277
# File 'lib/SVG/Graph/Graph.rb', line 275

def step_include_first_x_label
  @step_include_first_x_label
end

#step_x_labelsObject

How many “steps” to use between displayed X axis labels,

a step of one means display every label, a step of two results
in every other label being displayed (label <gap> label <gap> label),
a step of three results in every third label being displayed
(label <gap> <gap> label <gap> <gap> label) and so on.

270
271
272
# File 'lib/SVG/Graph/Graph.rb', line 270

def step_x_labels
  @step_x_labels
end

#style_sheetObject

Set the path to an external stylesheet, set to '' if

you want to revert back to using the defaut internal version.

To create an external stylesheet create a graph using the
default internal version and copy the stylesheet section to
an external file and edit from there.

242
243
244
# File 'lib/SVG/Graph/Graph.rb', line 242

def style_sheet
  @style_sheet
end

#subtitle_font_sizeObject

Set the subtitle font size


332
333
334
# File 'lib/SVG/Graph/Graph.rb', line 332

def subtitle_font_size
  @subtitle_font_size
end

#title_font_sizeObject

Set the title font size


330
331
332
# File 'lib/SVG/Graph/Graph.rb', line 330

def title_font_size
  @title_font_size
end

#widthObject

Set the width of the graph box, this is the total width

of the SVG box created - not the graph it self which auto
scales to fix the space.

235
236
237
# File 'lib/SVG/Graph/Graph.rb', line 235

def width
  @width
end

#x_label_font_sizeObject

Set the font size of the X axis labels


322
323
324
# File 'lib/SVG/Graph/Graph.rb', line 322

def x_label_font_size
  @x_label_font_size
end

#x_titleObject

What the title under X axis should be, e.g. 'Months'.


293
294
295
# File 'lib/SVG/Graph/Graph.rb', line 293

def x_title
  @x_title
end

#x_title_font_sizeObject

Set the font size of the X axis title


324
325
326
# File 'lib/SVG/Graph/Graph.rb', line 324

def x_title_font_size
  @x_title_font_size
end

#y_label_font_sizeObject

Set the font size of the Y axis labels


326
327
328
# File 'lib/SVG/Graph/Graph.rb', line 326

def y_label_font_size
  @y_label_font_size
end

#y_titleObject

What the title under Y axis should be, e.g. 'Sales in thousands'.


302
303
304
# File 'lib/SVG/Graph/Graph.rb', line 302

def y_title
  @y_title
end

#y_title_font_sizeObject

Set the font size of the Y axis title


328
329
330
# File 'lib/SVG/Graph/Graph.rb', line 328

def y_title_font_size
  @y_title_font_size
end

#y_title_text_directionObject

Aligns writing mode for Y axis label.

Defaults to :bt (Bottom to Top).
Change to :tb (Top to Bottom) to reverse.

300
301
302
# File 'lib/SVG/Graph/Graph.rb', line 300

def y_title_text_direction
  @y_title_text_direction
end

Instance Method Details

#add_data(conf) ⇒ Object

This method allows you do add data to the graph object. It can be called several times to add more data sets in.

data_sales_02 = [12, 45, 21];

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

167
168
169
170
171
172
173
174
175
# File 'lib/SVG/Graph/Graph.rb', line 167

def add_data conf
  @data = [] unless defined? @data

  if conf[:data] and conf[:data].kind_of? Array
    @data << conf
  else
    raise "No data provided by #{conf.inspect}"
  end
end

#burnObject

This method processes the template with the data and config which has been set and returns the resulting SVG.

This method will croak unless at least one data set has been added to the graph object.

print graph.burn

194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/SVG/Graph/Graph.rb', line 194

def burn
  raise "No data available" unless @data.size > 0
  
  calculations if respond_to? :calculations

  start_svg
  calculate_graph_dimensions
  @foreground = Element.new( "g" )
  draw_graph
  draw_titles
  draw_legend
  draw_data
  @graph.add_element( @foreground )
  style

  data = ""
  @doc.write( data, 0 )

  if @config[:compress]
    if Object.const_defined?(:Zlib)
      inp, out = IO.pipe
      gz = Zlib::GzipWriter.new( out )
      gz.write data
      gz.close
      data = inp.read
    else
      data << "<!-- Ruby Zlib not available for SVGZ -->";
    end
  end
  
  return data
end

#clear_dataObject

This method removes all data from the object so that you can reuse it to create a new graph but with the same config options.

graph.clear_data

182
183
184
# File 'lib/SVG/Graph/Graph.rb', line 182

def clear_data 
  @data = []
end