Class: Gruff::Line

Inherits:
Base
  • Object
show all
Defined in:
lib/gruff/line.rb

Overview

Here's how to make a Gruff::Line.

g = Gruff::Line.new
g.title = "A Line Graph"
g.data 'Fries', [20, 23, 19, 8]
g.data 'Hamburgers', [50, 19, 99, 29]
g.write("line.png")

There are also other options described below, such as #baseline_value, #baseline_color, #hide_dots=, and #hide_lines=.

Constant Summary

Constants inherited from Base

Base::DEFAULT_MARGIN, Base::DEFAULT_TARGET_WIDTH, Base::LABEL_MARGIN, Base::LEGEND_MARGIN

Instance Attribute Summary collapse

Attributes inherited from Base

#bottom_margin, #colors, #hide_legend, #hide_line_markers, #hide_line_numbers, #hide_title, #label_max_size, #label_stagger_height, #label_truncation_style, #labels, #left_margin, #legend_at_bottom, #legend_box_size, #legend_margin, #marker_color, #marker_shadow_color, #maximum_value, #minimum_value, #no_data_message, #right_margin, #sort, #sorted_drawing, #title, #title_margin, #top_margin, #x_axis_increment, #x_axis_label_format, #y_axis_increment, #y_axis_label_format

Instance Method Summary collapse

Methods inherited from Base

#add_color, #bold_title=, #data, #draw, #font=, #font_color=, #legend_font_size=, #margins=, #marker_font_size=, #replace_colors, #theme=, #theme_37signals, #theme_greyscale, #theme_keynote, #theme_odeo, #theme_pastel, #theme_rails_keynote, #title_font=, #title_font_size=, #to_blob, #to_image, #write

Constructor Details

#initialize(*args) ⇒ Line

Call with target pixel width of graph (800, 400, 300), and/or false to omit lines (points only).

g = Gruff::Line.new(400) # 400px wide with lines
g = Gruff::Line.new(400, false) # 400px wide, no lines (for backwards compatibility)
g = Gruff::Line.new(false) # Defaults to 800px wide, no lines (for backwards compatibility)

The preferred way is to call #hide_dots= or #hide_lines= instead.

Raises:

  • (ArgumentError)

50
51
52
53
54
55
56
57
58
# File 'lib/gruff/line.rb', line 50

def initialize(*args)
  raise ArgumentError, 'Wrong number of arguments' if args.length > 2

  if args.empty? || (!args.first.is_a?(Numeric) && !args.first.is_a?(String))
    super()
  else
    super args.shift
  end
end

Instance Attribute Details

#dot_radius=(value) ⇒ Object (writeonly)

Sets the attribute dot_radius

Parameters:

  • value

    the value to set the attribute dot_radius to.


26
27
28
# File 'lib/gruff/line.rb', line 26

def dot_radius=(value)
  @dot_radius = value
end

#dot_style=(value) ⇒ Object (writeonly)

default is 'circle', other options include square.


29
30
31
# File 'lib/gruff/line.rb', line 29

def dot_style=(value)
  @dot_style = value
end

#hide_dots=(value) ⇒ Object (writeonly)

Hide parts of the graph to fit more data points, or for a different appearance.


32
33
34
# File 'lib/gruff/line.rb', line 32

def hide_dots=(value)
  @hide_dots = value
end

#hide_lines=(value) ⇒ Object (writeonly)

Hide parts of the graph to fit more data points, or for a different appearance.


32
33
34
# File 'lib/gruff/line.rb', line 32

def hide_lines=(value)
  @hide_lines = value
end

#line_width=(value) ⇒ Object (writeonly)

Dimensions of lines and dots; calculated based on dataset size if left unspecified.


25
26
27
# File 'lib/gruff/line.rb', line 25

def line_width=(value)
  @line_width = value
end

#marker_x_count=(value) ⇒ Object (writeonly)

The number of vertical lines shown.


41
42
43
# File 'lib/gruff/line.rb', line 41

def marker_x_count=(value)
  @marker_x_count = value
end

#maximum_x_value=(value) ⇒ Object (writeonly)

accessors for support of xy data.


38
39
40
# File 'lib/gruff/line.rb', line 38

def maximum_x_value=(value)
  @maximum_x_value = value
end

#minimum_x_value=(value) ⇒ Object (writeonly)

accessors for support of xy data.


35
36
37
# File 'lib/gruff/line.rb', line 35

def minimum_x_value=(value)
  @minimum_x_value = value
end

#reference_line_default_color=(value) ⇒ Object (writeonly)

Sets the attribute reference_line_default_color

Parameters:

  • value

    the value to set the attribute reference_line_default_color to.


18
19
20
# File 'lib/gruff/line.rb', line 18

def reference_line_default_color=(value)
  @reference_line_default_color = value
end

#reference_line_default_width=(value) ⇒ Object (writeonly)

Sets the attribute reference_line_default_width

Parameters:

  • value

    the value to set the attribute reference_line_default_width to.


19
20
21
# File 'lib/gruff/line.rb', line 19

def reference_line_default_width=(value)
  @reference_line_default_width = value
end

#reference_linesObject

Allow for reference lines ( which are like baseline … just allowing for more & on both axes ).


17
18
19
# File 'lib/gruff/line.rb', line 17

def reference_lines
  @reference_lines
end

#show_vertical_markers=(value) ⇒ Object (writeonly)

Allow for vertical marker lines.


22
23
24
# File 'lib/gruff/line.rb', line 22

def show_vertical_markers=(value)
  @show_vertical_markers = value
end

Instance Method Details

#baseline_colorObject


73
74
75
76
77
# File 'lib/gruff/line.rb', line 73

def baseline_color
  if @reference_lines.key?(:baseline)
    @reference_lines[:baseline][:color]
  end
end

#baseline_color=(new_value) ⇒ Object


79
80
81
82
# File 'lib/gruff/line.rb', line 79

def baseline_color=(new_value)
  @reference_lines[:baseline] ||= {}
  @reference_lines[:baseline][:color] = new_value
end

#baseline_valueObject

Get the value if somebody has defined it.


61
62
63
64
65
# File 'lib/gruff/line.rb', line 61

def baseline_value
  if @reference_lines.key?(:baseline)
    @reference_lines[:baseline][:value]
  end
end

#baseline_value=(new_value) ⇒ Object

Set a value for a baseline reference line..


68
69
70
71
# File 'lib/gruff/line.rb', line 68

def baseline_value=(new_value)
  @reference_lines[:baseline] ||= {}
  @reference_lines[:baseline][:value] = new_value
end

#dataxy(name, x_data_points = [], y_data_points = [], color = nil) ⇒ Object #dataxy(name, xy_data_points = [], color = nil) ⇒ Object

Note:
  • if (x_data_points.length != y_data_points.length) an error is returned.

  • if the color argument is nil, the next color from the default theme will be used.

  • if you want to use a preset theme, you must set it before calling #dataxy.

This method allows one to plot a dataset with both X and Y data.

Examples:

g = Gruff::Line.new
g.title = "X/Y Dataset"
g.dataxy("Apples", [1,3,4,5,6,10], [1, 2, 3, 4, 4, 3])
g.dataxy("Bapples", [1,3,4,5,7,9], [1, 1, 2, 2, 3, 3])
g.dataxy("Capples", [[1,1],[2,3],[3,4],[4,5],[5,7],[6,9]])

# you can still use the old data method too if you want:
g.data("Capples", [1, 1, 2, 2, 3, 3])

# labels will be drawn at the x locations of the keys passed in.
In this example the labels are drawn at x positions 2, 4, and 6:
g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006'}
# The 0 => '2003' label will be ignored since it is outside the chart range.

Overloads:

  • #dataxy(name, x_data_points = [], y_data_points = [], color = nil) ⇒ Object

    Parameters:

    • name (String)

      the title of the dataset.

    • x_data_points (Array) (defaults to: [])

      an array containing the x data points for the graph.

    • y_data_points (Array) (defaults to: [])

      an array containing the y data points for the graph.

    • color (String) (defaults to: nil)

      hex number indicating the line color as an RGB triplet.

  • #dataxy(name, xy_data_points = [], color = nil) ⇒ Object

    Parameters:

    • name (String)

      the title of the dataset.

    • xy_data_points (Array) (defaults to: [])

      an array containing both x and y data points for the graph.

    • color (String) (defaults to: nil)

      hex number indicating the line color as an RGB triplet.

Raises:

  • (ArgumentError)

118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/gruff/line.rb', line 118

def dataxy(name, x_data_points = [], y_data_points = [], color = nil)
  # make sure it's an array
  x_data_points = Array(x_data_points)

  raise ArgumentError, 'x_data_points is nil!' if x_data_points.empty?

  if x_data_points.all? { |p| p.is_a?(Array) && p.size == 2 }
    color = y_data_points if y_data_points.is_a?(String)
    x_data_points, y_data_points = x_data_points.transpose
  else
    y_data_points = Array(y_data_points)
  end

  raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length

  # call the existing data routine for the x/y data.
  store.add(name, y_data_points, color, x_data_points)
end