class Scruffy::Layers::Base
Scruffy::Layers::Base
¶ ↑
- Author
-
Brasten Sager
- Extended By
-
A.J. Ostman
- Created
-
August 5th, 2006
- Last Modified
-
August 27, 2006
Scruffy::Layers::Base
contains the basic functionality needed by the various types of graphs. The Base
class is responsible holding layer information such as the title and data points.
When the graph is rendered, the graph renderer calls Base#render
. Base#render
sets up some standard information, and calculates the x,y coordinates of each data point. The draw() method, which should have been overridden by the current instance, is then called. The actual rendering of the graph takes place there.
Create New Graph
Types¶ ↑
Assuming the information generated by Scruffy::Layers::Base
is sufficient, you can create a new graph type simply by overriding the draw() method. See Base#draw
for arguments.
Attributes
The following attributes are user-definable at any time. title, points, relevant_data
, preferred_color
, options
Public Class Methods
Returns a new Base
object.
Any options other that those specified below are stored in the @options variable for possible later use. This would be a good place to store options needed for a custom graph.
Options:
- title
-
Name/title of data group
- points
-
Array of data points
preferred_color
-
Color used to render this graph, overrides theme color.
preferred_outline
-
Color used to render this graph outline, overrides theme outline.
relevant_data
-
Rarely used - indicates the data on this graph should not included in any graph data aggregations, such as averaging data points.
- style
-
SVG polyline style. (default: ‘fill-opacity: 0; stroke-opacity: 0.35’)
- stroke_width
-
numeric value for width of line (0.1 - 10, default: 1)
- relativestroke
-
stroke-width relative to image size? true or false (default)
- shadow
-
Display line shadow? true or false (default)
- dots
-
Display co-ord dots? true or false (default)
# File lib/scruffy/layers/base.rb, line 60 def initialize(options = {}) @title = options.delete(:title) || '' @preferred_color = options.delete(:color) @preferred_outline = options.delete(:outline) @relevant_data = options.delete(:relevant_data) || true @points = options.delete(:points) || [] @points.extend Scruffy::Helpers::PointContainer unless @points.kind_of? Scruffy::Helpers::PointContainer options[:stroke_width] ||= 1 options[:dots] ||= false options[:shadow] ||= false options[:style] ||= false options[:relativestroke] ||= false @options = options end
Public Instance Methods
The highest data point on this layer, or nil if relevant_data
== false
# File lib/scruffy/layers/base.rb, line 133 def bottom_key @relevant_data ? points.minimum_key : nil end
The lowest data point on this layer, or nil if relevant_data
== false
# File lib/scruffy/layers/base.rb, line 128 def bottom_value @relevant_data ? points.minimum_value : nil end
The method called by Base#draw
to render the graph.
- svg
-
a Builder object to use for creating SVG code.
- coords
-
An array of coordinates relating to the graph’s data points. ie: [[100, 120], [200, 140], [300, 40]]
- options
-
Optional arguments.
# File lib/scruffy/layers/base.rb, line 95 def draw(svg, coords, options={}) raise RenderError, "You must override the Base#draw method." end
Returns a hash with information to be used by the legend.
Alternatively, returns nil if you don’t want this layer to be in the legend, or an array of hashes if this layer should have multiple legend entries (stacked?)
By default, legend_data
returns nil automatically if relevant_data
is set to false or the @color attribute is nil. @color is set when the layer is rendered, so legends must be rendered AFTER layers.
# File lib/scruffy/layers/base.rb, line 107 def legend_data if relevant_data? && @color {:title => title, :color => @color, :priority => :normal} else nil end end
Returns the value of relevant_data
# File lib/scruffy/layers/base.rb, line 118 def relevant_data? @relevant_data end
Builds SVG code for this graph using the provided Builder object. This method actually generates data needed by this graph, then passes the rendering responsibilities to Base#draw
.
- svg
-
a Builder object used to create SVG code.
# File lib/scruffy/layers/base.rb, line 83 def render(svg, options) setup_variables(options) coords = generate_coordinates(options) draw(svg, coords, options) end
The sum of all values
# File lib/scruffy/layers/base.rb, line 143 def sum_values points.sum end
The lowest data point on this layer, or nil if relevant_data
== false
# File lib/scruffy/layers/base.rb, line 138 def top_key @relevant_data ? points.maximum_key : nil end
The highest data point on this layer, or nil if relevant_data
== false
# File lib/scruffy/layers/base.rb, line 123 def top_value @relevant_data ? points.maximum_value : nil end
Protected Instance Methods
Updated : Assuming n number of points, the graph is divided into n rectangles and the points are plotted in the middle of each rectangle. This allows bars to play nice with lines.
# File lib/scruffy/layers/base.rb, line 166 def generate_coordinates(options = {}) dy = height.to_f / (options[:max_value] - options[:min_value]) dx = width.to_f / (options[:max_key] - options[:min_key] + 1) ret = [] points.each_point do |x, y| if y x_coord = dx * (x - options[:min_key]) + dx/2 y_coord = dy * (y - options[:min_value]) ret << [x_coord, height - y_coord] end end return ret end
Converts a percentage into a pixel value, relative to the height.
Example:
relative(5) # On a 100px high layer, this returns 5. 200px high layer, this returns 10, etc.
# File lib/scruffy/layers/base.rb, line 186 def relative(pct) # Default to Relative Height relative_height(pct) end
# File lib/scruffy/layers/base.rb, line 197 def relative_height(pct) if pct # Added to handle nils @height * (pct / 100.to_f) end end
# File lib/scruffy/layers/base.rb, line 191 def relative_width(pct) if pct # Added to handle nils @width * (pct / 100.to_f) end end
Sets up several variables that almost every graph layer will need to render itself.
# File lib/scruffy/layers/base.rb, line 150 def setup_variables(options = {}) @color = (preferred_color || options.delete(:color)) @outline = (preferred_outline || options.delete(:outline)) @width, @height = options.delete(:size) @min_value, @max_value = options[:min_value], options[:max_value] @opacity = options[:opacity] || 1.0 @complexity = options[:complexity] end