Class: GoogleChart::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/dynamic_reports/vendor/google_chart/base.rb

Constant Summary collapse

BASE_URL =
"http://chart.apis.google.com/chart?"
SIMPLE_ENCODING =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split('')
COMPLEX_ENCODING_ALPHABET =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'.split('')
SHAPE_MARKERS =
{:arrow => "a",
  :cross => "c",
  :diamond => "d",
  :circle => "o",
  :square => "s",
  :vline_segment => "v",
  :vline_full => "V",
  :hline_full => "h",
  :x => "x"
}
DEFAULT_LINE_STYLE =
'1'
@@complex_encoding =
[]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(chart_size, chart_title) ⇒ Base

Returns a new instance of Base.



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 54

def initialize(chart_size, chart_title)
  # Declare instance variables to be a good citizen.
  @background_fill = nil, @chart_fill = nil, @grid_str = nil, @max_data = nil, @bar_width_spacing_options = nil, @background_fill = nil, @chart_fill = nil, @grid_str = nil, @max_data = nil, @bar_width_spacing_options = nil, @background_fill = nil, @chart_fill = nil, @grid_str = nil, @max_data = nil, @bar_width_spacing_options = nil, @background_fill = nil, @chart_fill = nil, @grid_str = nil, @max_data = nil, @bar_width_spacing_options = nil
  self.params = Hash.new
  @labels = []
  @data   = []
  @colors = []
  @axis   = []
  @markers = []
  @line_styles = []
  self.chart_size    = chart_size
  self.chart_title   = chart_title
  self.data_encoding = :simple
  self.show_legend   = true
end

Instance Attribute Details

#chart_sizeObject

Size of the chart in WIDTHxHEIGHT format



31
32
33
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 31

def chart_size
  @chart_size
end

#chart_titleObject

Chart title



37
38
39
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 37

def chart_title
  @chart_title
end

#chart_typeObject

Type of the chart. Usually, you do not need to set this yourself



34
35
36
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 34

def chart_type
  @chart_type
end

#data_encodingObject

Data encoding to use. Can be one of :simple, :text or :extended (see code.google.com/apis/chart/#chart_data)



46
47
48
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 46

def data_encoding
  @data_encoding
end

#paramsObject

A hash of the params used to construct the URL



49
50
51
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 49

def params
  @params
end

#show_legendObject

Set to true or false to show or hide the chart legend. Not applicable for Scatter Chart.



52
53
54
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 52

def show_legend
  @show_legend
end

#title_colorObject

RRGGBB hex value for the color of the title



40
41
42
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 40

def title_color
  @title_color
end

#title_font_sizeObject

Font size of the title



43
44
45
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 43

def title_font_size
  @title_font_size
end

Instance Method Details

#axis(type, options = {}) ⇒ Object

Adds an axis to the graph. Not applicable for Pie Chart (GoogleChart::PieChart) or Venn Diagram (GoogleChart::VennDiagram)

type

is a symbol which can be one of :x, :y, :right, :top

options

is a hash containing the options (see below)

Options

Not all the options are mandatory.

:labels

An array containing the labels for the axis

:positions

An Array containing the positions for the labels

:range

An array containing 2 elements, the start value and end value

axis styling options have to be specified as follows

:color

Hexadecimal RGB value for the color to represent the data for the axis labels

:font_size

Font size of the labels in pixels

:alignment

can be one of :left, :center or :right

Examples

lc.axis :y, :range => [0,6], :color => 'ff00ff', :font_size => 16, :alignment => :center


195
196
197
198
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 195

def axis(type, options = {})
  raise "Illegal axis type" unless [:x, :y, :right, :top].member?(type)          
  @axis << [type, options]
end

#data(name, value, color = nil) ⇒ Object

Adds the data to the chart, according to the type of the graph being generated.

name

is a string containing a label for the data.

value

is either a number or an array of numbers containing the data. Pie Charts and Venn Diagrams take a single number, but other graphs require an array of numbers

color (optional)

is a hexadecimal RGB value for the color to represent the data

Examples

for GoogleChart::LineChart (normal)

lc.data "Trend 1", [1,2,3,4,5], 'ff00ff'

for GoogleChart::LineChart (XY chart)

lc.data "Trend 2", [[4,5], [2,2], [1,1], [3,4]], 'ff00ff'

for GoogleChart::PieChart

lc.data "Apples", 5, 'ff00ff'
lc.data "Oranges", 7, '00ffff'


122
123
124
125
126
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 122

def data(name, value, color=nil)
  @data << value
  @labels << name
  @colors << color if color
end

#fill(bg_or_c, type, options = {}) ⇒ Object

Adds a background or chart fill. Call this option twice if you want both a background and a chart fill

bg_or_c

Can be one of :background or :chart depending on the kind of fill requested

type

Can be one of :solid, :gradient or :stripes

options

: Options depend on the type of fill selected above

Options

For :solid type

  • A :color option which specifies the RGB hex value of the color to be used as a fill. For e.g lc.fill(:chart, :solid, {:color => 'ffcccc'})

For :gradient type

  • An :angle, which is the angle of the gradient between 0(horizontal) and 90(vertical)

  • A :color option which is a 2D array containing the colors and an offset each, which specifies at what point the color is pure where: 0 specifies the right-most chart position and 1 the left-most. e,g lc.fill :background, :gradient, :angle => 0, :color => [['76A4FB',1],['ffffff',0]]

For :stripes type

  • An :angle, which is the angle of the stripe between 0(horizontal) and 90(vertical)

  • A :color option which is a 2D array containing the colors and width value each, which must be between 0 and 1 where 1 is the full width of the chart. for e.g lc.fill :chart, :stripes, :angle => 90, :color => [ ['76A4FB',0.2], ['ffffff',0.2] ]



167
168
169
170
171
172
173
174
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 167

def fill(bg_or_c, type, options = {})
  case bg_or_c
  when :background
    @background_fill = "bg," + process_fill_options(type, options)
  when :chart
    @chart_fill = "c," + process_fill_options(type, options)
  end
end

#fill_area(color, start_index, end_index) ⇒ Object

Defines a Fill area. Applicable for line charts only

color

is the color of the fill area

start_index

is the index of the line at which the fill starts. This is 0 for the first data set, 1 for the second and so on.

end_index

is the index of the line at which the fill ends.

Examples

# Fill Area (Multiple Datasets)
  lc = GoogleChart::LineChart.new('320x200', "Line Chart", false) do |lc|
  lc.show_legend = false
  lc.data "Trend 1", [5,5,6,5,5], 'ff0000'
  lc.data "Trend 2", [3,3,4,3,3], '00ff00'
  lc.data "Trend 3", [1,1,2,1,1], '0000ff'
  lc.data "Trend 4", [0,0,0,0,0], 'ffffff'
  lc.fill_area '0000ff',2,3
  lc.fill_area '00ff00',1,2
  lc.fill_area 'ff0000',0,1
end
puts "\nFill Area (Multiple Datasets)"
 puts lc.to_url

# Fill Area (Single Dataset)
lc = GoogleChart::LineChart.new('320x200', "Line Chart", false) do |lc|
  lc.show_legend = false
  lc.data "Trend 1", [5,5,6,5,5], 'ff0000'
  lc.fill_area 'cc6633', 0, 0
end
puts "\nFill Area (Single Dataset)"
puts lc.to_url


290
291
292
293
294
295
296
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 290

def fill_area(color, start_index, end_index)
  if (start_index == 0 and end_index == 0)
    @markers << "B,#{color},0,0,0"
  else
    @markers << "b,#{color},#{start_index},#{end_index},0"
  end
end

#grid(options = {}) ⇒ Object

Adds a grid to the graph. Applicable only for Line Chart (GoogleChart::LineChart) and Scatter Chart (GoogleChart::ScatterChart)

options

is a hash containing the options (see below)

Options

:xstep

X axis step size

:ystep

Y axis step size

:length_segment (optional)

Length of the line segement. Useful with the :length_blank value to have dashed lines

:length_blank (optional)

Length of the blank segment. use 0 if you want a solid grid

Examples

lc.grid :x_step => 5, :y_step => 5, :length_segment => 1, :length_blank => 0


213
214
215
216
217
218
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 213

def grid(options={})
  @grid_str = "#{options[:x_step].to_f},#{options[:y_step].to_f}"
  if options[:length_segment] or options[:length_blank]
    @grid_str += ",#{options[:length_segment].to_f},#{options[:length_blank].to_f}"
  end
end

#max_value(value) ⇒ Object

Allows (optional) setting of a max value for the chart, which will be used for data encoding and axis plotting. The value to pass depends on the type of chart

  • For Line Chart and Bar Charts it should be a single integer or float value

  • For Scatter Charts and Line XY Charts, you MUST pass an array containing the maximum values for X and Y

Examples

For bar charts

bc.max_value 5 # 5 will be used to calculate the relative encoding values

For scatter chart

sc.max_value [5,6] # 5 is the max x value and 6 is the max y value

Note : MAKE SURE you are passing the right values otherwise an exception will be raised



140
141
142
143
144
145
146
147
148
149
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 140

def max_value(value)
  if [:lxy, :s].member?(self.chart_type) and value.is_a?(Array)
    @max_x = value.first
    @max_y = value.last
  elsif [:lc,:bhg,:bhs,:bvg,:bvs] and (value.is_a?(Integer) or value.is_a?(Float))
    @max_data = value
  else
    raise "Invalid max value for this chart type"
  end
end

#range_marker(alignment, options = {}) ⇒ Object

Defines a horizontal or vertical range marker. Applicable for line charts and vertical charts

alignment

can be :horizontal or :vertical

options

specifies the color, start point and end point

Options

:color

RRGGBB hex value for the color of the range marker

:start_point

position on the x-axis/y-axis at which the range starts where 0.00 is the left/bottom and 1.00 is the right/top

:end_point

position on the x-axis/y-axis at which the range ends where 0.00 is the left/bottom and 1.00 is the right/top

Examples

lc.range_marker :horizontal, :color => 'E5ECF9', :start_point => 0.1, :end_point => 0.5
lc.range_marker :vertical, :color => 'a0bae9', :start_point => 0.1, :end_point => 0.5


233
234
235
236
237
238
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 233

def range_marker(alignment, options={}) 
  raise "Invalid alignment specified" unless [:horizontal, :vertical].member?(alignment)
  str = (alignment == :horizontal ) ? "r" : "R"
  str += ",#{options[:color]},0,#{options[:start_point]},#{options[:end_point]}"
  @markers << str 
end

#shape_marker(type, options = {}) ⇒ Object

Defines a shape marker. Applicable for line charts and scatter plots

type

can be :arrow, :cross, :diamond, :circle, :square, :vline_segment, :vline_full, :hline_full, :x

options

specifies the color, data set index, data point index and size in pixels

Options

:color

RRGGBB hex value for the color of the range marker

:data_set_index

the index of the line on which to draw the marker. This is 0 for the first data set, 1 for the second and so on.

:data_point_index

is a floating point value that specifies on which data point of the data set the marker will be drawn. This is 0 for the first data point, 1 for the second and so on. Specify a fraction to interpolate a marker between two points.

:size

is the size of the marker in pixels.

Examples

lcxy.shape_marker :circle, :color => "000000", :data_set_index => 1, :data_point_index => 2, :pixel_size => 10
lcxy.shape_marker :cross, :color => "E5ECF9", :data_set_index => 0, :data_point_index => 0.5, :pixel_size => 10


254
255
256
257
258
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 254

def shape_marker(type, options={})
  raise "Invalid shape marker type specified" unless SHAPE_MARKERS.has_key?(type)
  shape_marker_str = "#{SHAPE_MARKERS[type]},#{options[:color]},#{options[:data_set_index]},#{options[:data_point_index]},#{options[:pixel_size]}"
  @markers << shape_marker_str
end

#to_escaped_url(extras = {}) ⇒ Object

Generates a fully encoded URL string that can be used to retrieve the graph image in PNG format. For less verbose URLs, use the to_url method. Use this only if you are doing further processing with the URLs, like passing the URL to a method for downloading the images

Use this after assigning all the properties to the graph You can pass in additional params as a hash for features that may not have been implemented For e.g

lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
puts lc.to_escaped_url({:chm => "000000,0,0.1,0.11"}) # Single black line as a horizontal marker


98
99
100
101
102
103
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 98

def to_escaped_url(extras={})
  prepare_params
  params.merge!(extras)
  query_string = params.map { |k,v| "#{k}=#{URI.escape(v.to_s)}" }.join('&')
  BASE_URL + query_string
end

#to_url(extras = {}) ⇒ Object

Generates the URL string that can be used to retrieve the graph image in PNG format. Use this after assigning all the properties to the graph You can pass in additional params as a hash for features that may not have been implemented For e.g

lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
puts lc.to_url({:chm => "000000,0,0.1,0.11"}) # Single black line as a horizontal marker


79
80
81
82
83
84
# File 'lib/dynamic_reports/vendor/google_chart/base.rb', line 79

def to_url(extras={})
  prepare_params
  params.merge!(extras)
  query_string = params.map { |k,v| "#{k}=#{URI.escape(v.to_s).gsub(/%20/,'+').gsub(/%7C/,'|')}" }.join('&')
  BASE_URL + query_string
end