gchartrb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +1 -0
- data/History.txt +5 -0
- data/Manifest.txt +13 -0
- data/README.txt +138 -0
- data/Rakefile +18 -0
- data/TODO +23 -0
- data/lib/google_chart.rb +9 -0
- data/lib/google_chart/bar_chart.rb +62 -0
- data/lib/google_chart/base.rb +304 -0
- data/lib/google_chart/line_chart.rb +73 -0
- data/lib/google_chart/pie_chart.rb +26 -0
- data/lib/google_chart/venn_diagram.rb +35 -0
- data/lib/test.rb +72 -0
- metadata +69 -0
data/CREDITS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Will Fitzgerald - http://www.entish.org/willwhim
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
CREDITS
|
2
|
+
History.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
TODO
|
7
|
+
lib/google_chart.rb
|
8
|
+
lib/google_chart/bar_chart.rb
|
9
|
+
lib/google_chart/base.rb
|
10
|
+
lib/google_chart/line_chart.rb
|
11
|
+
lib/google_chart/pie_chart.rb
|
12
|
+
lib/google_chart/venn_diagram.rb
|
13
|
+
lib/test.rb
|
data/README.txt
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
gchartrb
|
2
|
+
by Deepak Jois
|
3
|
+
http://code.google.com/p/gchartrb
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
gchartrb is a Ruby wrapper around the Google Chart API, located at http://code.google.com/apis/chart/
|
8
|
+
|
9
|
+
Visit http://code.google.com/p/gchartrb to track development regarding gchartrb.
|
10
|
+
|
11
|
+
== FEATURES:
|
12
|
+
|
13
|
+
* Provides an object oriented interface in Ruby to create Google Chart URLs for charts.
|
14
|
+
|
15
|
+
== INSTALL:
|
16
|
+
|
17
|
+
=== Ruby Gem:
|
18
|
+
|
19
|
+
sudo gem install gchartrb
|
20
|
+
|
21
|
+
=== Source Code:
|
22
|
+
|
23
|
+
Download the latest release from http://code.google.com/p/gchartrb/downloads/list
|
24
|
+
|
25
|
+
=== Subversion
|
26
|
+
|
27
|
+
svn checkout http://gchartrb.googlecode.com/svn/trunk/ gchartrb-read-only
|
28
|
+
|
29
|
+
== Problems/TODO
|
30
|
+
The following features are pending :
|
31
|
+
|
32
|
+
* Scatter Charts
|
33
|
+
* Horizontal and Vertical range Markers
|
34
|
+
* Line Styles
|
35
|
+
* Shape Markers
|
36
|
+
* Fill Area
|
37
|
+
|
38
|
+
However, you can still make use of the API to insert arbitrary parameters
|
39
|
+
|
40
|
+
# Adding Extra params
|
41
|
+
lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
|
42
|
+
lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
|
43
|
+
lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
|
44
|
+
lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
|
45
|
+
puts lc.to_url({:chm => "r,000000,0,0.1,0.5"}) # Single black line as a horizontal marker by inserting arbitrary param
|
46
|
+
|
47
|
+
== SYNOPSIS:
|
48
|
+
|
49
|
+
require 'rubygems'
|
50
|
+
require 'google_chart'
|
51
|
+
|
52
|
+
# Pie Chart
|
53
|
+
pc = GoogleChart::PieChart.new('320x200', "Pie Chart",false)
|
54
|
+
pc.data "Apples", 40
|
55
|
+
pc.data "Banana", 20
|
56
|
+
pc.data "Peach", 30
|
57
|
+
pc.data "Orange", 60
|
58
|
+
puts pc.to_url
|
59
|
+
|
60
|
+
# Line Chart
|
61
|
+
lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
|
62
|
+
lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
|
63
|
+
lc.show_legend = true
|
64
|
+
lc.show_labels = false
|
65
|
+
lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
|
66
|
+
lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
|
67
|
+
lc.axis :y, :range => [0,6], :color => 'ff00ff', :font_size => 16, :alignment => :center
|
68
|
+
lc.axis :x, :range => [0,6], :color => '00ffff', :font_size => 16, :alignment => :center
|
69
|
+
lc.grid :x_step => 100.0/6.0, :y_step => 100.0/6.0, :length_segment => 1, :length_blank => 0
|
70
|
+
puts lc.to_url
|
71
|
+
|
72
|
+
# Bar Chart
|
73
|
+
bc = GoogleChart::BarChart.new('800x200', "Bar Chart", :vertical, false)
|
74
|
+
bc.data "Trend 1", [5,4,3,1,3,5], '0000ff'
|
75
|
+
bc.data "Trend 2", [1,2,3,4,5,6], 'ff0000'
|
76
|
+
bc.data "Trend 3", [6,5,4,4,5,6], '00ff00'
|
77
|
+
puts bc.to_url
|
78
|
+
|
79
|
+
# Line XY Chart
|
80
|
+
lcxy = GoogleChart::LineChart.new('320x200', "Line XY Chart", true)
|
81
|
+
lcxy.data "Trend 1", [[1,1], [2,2], [3,3], [4,4]], '0000ff'
|
82
|
+
lcxy.data "Trend 2", [[4,5], [2,2], [1,1], [3,4]], '00ff00'
|
83
|
+
puts lcxy.to_url
|
84
|
+
|
85
|
+
# Venn Diagram
|
86
|
+
# Supply three vd.data statements of label, size, color for circles A, B, C
|
87
|
+
# Then, an :intersections with four values:
|
88
|
+
# the first value specifies the area of A intersecting B
|
89
|
+
# the second value specifies the area of B intersecting C
|
90
|
+
# the third value specifies the area of C intersecting A
|
91
|
+
# the fourth value specifies the area of A intersecting B intersecting C
|
92
|
+
vd = GoogleChart::VennDiagram.new("320x200", 'Venn Diagram')
|
93
|
+
vd.data "Blue", 100, '0000ff'
|
94
|
+
vd.data "Green", 80, '00ff00'
|
95
|
+
vd.data "Red", 60, 'ff0000'
|
96
|
+
vd.intersections 30,30,30,10
|
97
|
+
puts vd.to_url
|
98
|
+
|
99
|
+
# Solid fill
|
100
|
+
lc.fill(:background, :solid, {:color => 'fff2cc'})
|
101
|
+
lc.fill(:chart, :solid, {:color => 'ffcccc'})
|
102
|
+
puts lc.to_url
|
103
|
+
|
104
|
+
# Gradient fill
|
105
|
+
lc.fill :background, :gradient, :angle => 0, :color => [['76A4FB',1],['ffffff',0]]
|
106
|
+
lc.fill :chart, :gradient, :angle => 0, :color => [['76A4FB',1],
|
107
|
+
['ffffff',0]]
|
108
|
+
puts lc.to_url
|
109
|
+
|
110
|
+
# Stripes Fill
|
111
|
+
lc.fill :chart, :stripes, :angle => 90, :color => [['76A4FB',0.2],
|
112
|
+
['ffffff',0.2]]
|
113
|
+
puts lc.to_url
|
114
|
+
|
115
|
+
== LICENSE:
|
116
|
+
|
117
|
+
(The MIT License)
|
118
|
+
|
119
|
+
Copyright (c) 2007 Deepak Jois
|
120
|
+
|
121
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
122
|
+
a copy of this software and associated documentation files (the
|
123
|
+
'Software'), to deal in the Software without restriction, including
|
124
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
125
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
126
|
+
permit persons to whom the Software is furnished to do so, subject to
|
127
|
+
the following conditions:
|
128
|
+
|
129
|
+
The above copyright notice and this permission notice shall be
|
130
|
+
included in all copies or substantial portions of the Software.
|
131
|
+
|
132
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
133
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
134
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
135
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
136
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
137
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
138
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require './lib/google_chart.rb'
|
6
|
+
|
7
|
+
Hoe.new('gchartrb', "0.1.0") do |p|
|
8
|
+
p.rubyforge_name = 'gchartrb'
|
9
|
+
p.author = 'Deepak Jois'
|
10
|
+
p.email = 'deepak.jois@gmail.com'
|
11
|
+
p.summary = 'Ruby Wrapper for the Google Chart API'
|
12
|
+
p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
|
13
|
+
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
14
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
15
|
+
p.remote_rdoc_dir = ''
|
16
|
+
end
|
17
|
+
|
18
|
+
# vim: syntax=Ruby
|
data/TODO
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
TODO List (Features)
|
2
|
+
====================
|
3
|
+
* Axis labels
|
4
|
+
* Grid lines
|
5
|
+
* Markers
|
6
|
+
* Line Styles
|
7
|
+
* Fill Area
|
8
|
+
* Handle Missing Values (?)
|
9
|
+
* Other charts (Scatter)
|
10
|
+
* Download image
|
11
|
+
|
12
|
+
TODO List (Other)
|
13
|
+
=================
|
14
|
+
* Create an alternate git repository
|
15
|
+
|
16
|
+
Code Level Improvements
|
17
|
+
=======================
|
18
|
+
* Write tests that render different kinds of graphs
|
19
|
+
* Remove the need for core_ext.rb file (stupid idea I was trying out earlier)
|
20
|
+
* Use splats instead of attribute accessors to provide a neater API (?)
|
21
|
+
* Improved error handling and reporting for things
|
22
|
+
* Number of labels and number of postions in axis must be the same
|
23
|
+
* Axis styles need to be specified in a certain way
|
data/lib/google_chart.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
module GoogleChart
|
3
|
+
# Generates a Bar Chart. You can specify the alignment(horizontal or vertical) and whether you want the bars to be grouped or stacked
|
4
|
+
# ==== Examples
|
5
|
+
# bc = GoogleChart::BarChart.new('800x200', "Bar Chart", :vertical, false)
|
6
|
+
# bc.data "Trend 1", [5,4,3,1,3,5], '0000ff'
|
7
|
+
class BarChart < Base
|
8
|
+
|
9
|
+
attr_accessor :alignment, :stacked
|
10
|
+
|
11
|
+
# Specify the
|
12
|
+
# * +chart_size+ in WIDTHxHEIGHT format
|
13
|
+
# * +chart_title+ as a string
|
14
|
+
# * +alignment+ as either <tt>:vertical</tt> or <tt>:horizontal</tt>
|
15
|
+
# * +stacked+ should be +true+ if you want the bars to be stacked, false otherwise
|
16
|
+
def initialize(chart_size='300x200', chart_title=nil, alignment=:vertical, stacked=false)
|
17
|
+
super(chart_size, chart_title)
|
18
|
+
@alignment = alignment
|
19
|
+
@stacked = stacked
|
20
|
+
set_chart_type
|
21
|
+
self.show_labels = false
|
22
|
+
self.show_legend = true
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set the alignment to either <tt>:vertical</tt> or <tt>:horizontal</tt>
|
26
|
+
def alignment=(value)
|
27
|
+
@alignment = value
|
28
|
+
set_chart_type
|
29
|
+
end
|
30
|
+
|
31
|
+
# If you want the bar chart to be stacked, set the value to <tt>true</tt>, otherwise set the value to <tt>false</tt> to group it.
|
32
|
+
def stacked=(stacked)
|
33
|
+
@stacked = value
|
34
|
+
set_chart_type
|
35
|
+
end
|
36
|
+
|
37
|
+
def process_data
|
38
|
+
if @data.size > 1
|
39
|
+
max_value = @data.flatten.max
|
40
|
+
join_encoded_data(@data.collect { |series|
|
41
|
+
encode_data(series, max_value)
|
42
|
+
})
|
43
|
+
else
|
44
|
+
encode_data(@data.flatten)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def set_chart_type
|
50
|
+
# Set chart type
|
51
|
+
if alignment == :vertical and stacked == false
|
52
|
+
self.chart_type = :bvg
|
53
|
+
elsif alignment == :vertical and stacked == true
|
54
|
+
self.chart_type = :bvs
|
55
|
+
elsif alignment == :horizontal and stacked == false
|
56
|
+
self.chart_type = :bhg
|
57
|
+
elsif alignment == :horizontal and stacked == true
|
58
|
+
self.chart_type = :bhs
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module GoogleChart
|
4
|
+
class Base
|
5
|
+
BASE_URL = "http://chart.apis.google.com/chart?"
|
6
|
+
|
7
|
+
SIMPLE_ENCODING = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split('');
|
8
|
+
COMPLEX_ENCODING_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'.split('');
|
9
|
+
@@complex_encoding = []
|
10
|
+
COMPLEX_ENCODING_ALPHABET.each_with_index do |outer,index_outer|
|
11
|
+
COMPLEX_ENCODING_ALPHABET.each_with_index do |inner, index_inner|
|
12
|
+
@@complex_encoding[index_outer * 64 + index_inner] = outer + inner
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :chart_size, :chart_type, :chart_title, :data_encoding, :params, :show_legend, :show_labels
|
17
|
+
|
18
|
+
def initialize(chart_size, chart_title)
|
19
|
+
self.params = Hash.new
|
20
|
+
@labels = []
|
21
|
+
@data = []
|
22
|
+
@colors = []
|
23
|
+
@axis = []
|
24
|
+
self.chart_size = chart_size
|
25
|
+
self.chart_title = chart_title
|
26
|
+
self.data_encoding = :simple
|
27
|
+
self.show_legend = true
|
28
|
+
self.show_labels = false
|
29
|
+
end
|
30
|
+
|
31
|
+
# Generates the URL string that can be used to retrieve the graph image in PNG format.
|
32
|
+
# Use this after assigning all the properties to the graph
|
33
|
+
# You can pass in additional params as a hash for features that may not have been implemented
|
34
|
+
# For e.g
|
35
|
+
# lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
|
36
|
+
# lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
|
37
|
+
# lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
|
38
|
+
# lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
|
39
|
+
# puts lc.to_url({:chm => "000000,0,0.1,0.11"}) # Single black line as a horizontal marker
|
40
|
+
def to_url(extras={})
|
41
|
+
params.clear
|
42
|
+
set_size
|
43
|
+
set_type
|
44
|
+
set_colors
|
45
|
+
set_fill_options
|
46
|
+
add_axis
|
47
|
+
add_grid
|
48
|
+
add_data
|
49
|
+
add_labels(@labels) if show_labels
|
50
|
+
add_legend(@labels) if show_legend
|
51
|
+
add_title if chart_title.to_s.length > 0
|
52
|
+
|
53
|
+
params.merge!(extras)
|
54
|
+
query_string = params.map { |k,v| "#{k}=#{URI.escape(v.to_s)}" }.join('&')
|
55
|
+
BASE_URL + query_string
|
56
|
+
end
|
57
|
+
|
58
|
+
# Adds the data to the chart, according to the type of the graph being generated.
|
59
|
+
#
|
60
|
+
# [+name+] is a string containing a label for the data.
|
61
|
+
# [+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
|
62
|
+
# [+color+ (optional)] is a hexadecimal RGB value for the color to represent the data
|
63
|
+
#
|
64
|
+
# ==== Examples
|
65
|
+
#
|
66
|
+
# for GoogleChart::LineChart (normal)
|
67
|
+
# lc.data "Trend 1", [1,2,3,4,5], 'ff00ff'
|
68
|
+
#
|
69
|
+
# for GoogleChart::LineChart (XY chart)
|
70
|
+
# lc.data "Trend 2", [[4,5], [2,2], [1,1], [3,4]], 'ff00ff'
|
71
|
+
#
|
72
|
+
# for GoogleChart::PieChart
|
73
|
+
# lc.data "Apples", 5, 'ff00ff'
|
74
|
+
# lc.data "Oranges", 7, '00ffff'
|
75
|
+
def data(name, value, color=nil)
|
76
|
+
@data << value
|
77
|
+
@labels << name
|
78
|
+
@colors << color if color
|
79
|
+
end
|
80
|
+
|
81
|
+
def fill(bg_or_c, type, options = {})
|
82
|
+
case bg_or_c
|
83
|
+
when :background
|
84
|
+
@background_fill = "bg," + process_fill_options(type, options)
|
85
|
+
when :chart
|
86
|
+
@chart_fill = "c," + process_fill_options(type, options)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Adds an axis to the graph. Not applicable for Pie Chart (GoogleChart::PieChart) or Venn Diagram (GoogleChart::VennDiagram)
|
91
|
+
#
|
92
|
+
# [+type+] is a symbol which can be one of <tt>:x</tt>, <tt>:y</tt>, <tt>:right</tt>, <tt>:top</tt>
|
93
|
+
# [+options+] is a hash containing the options (see below)
|
94
|
+
#
|
95
|
+
# ==== Options
|
96
|
+
# Not all the options are mandatory.
|
97
|
+
# [<tt>:labels</tt>] An array containing the labels for the axis
|
98
|
+
# [<tt>:position</tt>] An Array containing the positions for the labels
|
99
|
+
# [<tt>:range</tt>] An array containing 2 elements, the start value and end value
|
100
|
+
#
|
101
|
+
# axis styling options have to be specified as follows
|
102
|
+
# [<tt>:color</tt>] Hexadecimal RGB value for the color to represent the data for the axis labels
|
103
|
+
# [<tt>:font_size</tt>] Font size of the labels in pixels
|
104
|
+
# [<tt>:alignment</tt>] can be one of <tt>:left</tt>, <tt>:center</tt> or <tt>:right</tt>
|
105
|
+
#
|
106
|
+
# ==== Examples
|
107
|
+
# lc.axis :y, :range => [0,6], :color => 'ff00ff', :font_size => 16, :alignment => :center
|
108
|
+
#
|
109
|
+
def axis(type, options = {})
|
110
|
+
raise "Illegal axis type" unless [:x, :y, :right, :top].member?(type)
|
111
|
+
@axis << [type, options]
|
112
|
+
end
|
113
|
+
|
114
|
+
# Adds a grid to the graph. Applicable only for Line Chart (GoogleChart::LineChart) and Scatter Chart (available soon)
|
115
|
+
#
|
116
|
+
# [+options+] is a hash containing the options (see below)
|
117
|
+
#
|
118
|
+
# === Options
|
119
|
+
# [<tt>:xstep</tt>] X axis step size
|
120
|
+
# [<tt>:ystep</tt>] Y axis step size
|
121
|
+
# [<tt>:length_segment</tt> (optional)] Length of the line segement. Useful with the :length_blank value to have dashed lines
|
122
|
+
# [<tt>:length_blank</tt> (optional)] Length of the blank segment. use 0 if you want a solid grid
|
123
|
+
#
|
124
|
+
# === Examples
|
125
|
+
# lc.grid :x_step => 5, :y_step => 5, :length_segment => 1, :length_blank => 0
|
126
|
+
#
|
127
|
+
|
128
|
+
def grid(options={})
|
129
|
+
@grid_str = "#{options[:x_step].to_f},#{options[:y_step].to_f}"
|
130
|
+
if options[:length_segment] or options[:length_blank]
|
131
|
+
@grid_str += ",#{options[:length_segment].to_f},#{options[:length_blank].to_f}"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
protected
|
136
|
+
|
137
|
+
def process_fill_options(type, options)
|
138
|
+
case type
|
139
|
+
when :solid
|
140
|
+
"s,#{options[:color]}"
|
141
|
+
when :gradient
|
142
|
+
"lg,#{options[:angle]}," + options[:color].collect { |o| "#{o.first},#{o.last}" }.join(",")
|
143
|
+
when :stripes
|
144
|
+
"ls,#{options[:angle]}," + options[:color].collect { |o| "#{o.first},#{o.last}" }.join(",")
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
def set_type
|
150
|
+
params.merge!({:cht => chart_type})
|
151
|
+
end
|
152
|
+
|
153
|
+
def set_size
|
154
|
+
params.merge!({:chs => chart_size})
|
155
|
+
end
|
156
|
+
|
157
|
+
def set_colors
|
158
|
+
params.merge!({:chco => @colors.collect{|c| c.downcase}.join(",") }) if @colors.size > 0
|
159
|
+
end
|
160
|
+
|
161
|
+
def set_fill_options
|
162
|
+
fill_opt = [@background_fill, @chart_fill].compact.join("|")
|
163
|
+
params.merge!({:chf => fill_opt}) if fill_opt.length > 0
|
164
|
+
end
|
165
|
+
|
166
|
+
def add_labels(labels)
|
167
|
+
params.merge!({:chl => labels.collect{|l| l.to_s}.join("|") })
|
168
|
+
end
|
169
|
+
|
170
|
+
def add_legend(labels)
|
171
|
+
params.merge!({:chdl => labels.collect{ |l| l.to_s}.join("|")})
|
172
|
+
end
|
173
|
+
|
174
|
+
def add_title
|
175
|
+
params.merge!({:chtt => chart_title})
|
176
|
+
end
|
177
|
+
|
178
|
+
def add_axis
|
179
|
+
chxt = []
|
180
|
+
chxl = []
|
181
|
+
chxp = []
|
182
|
+
chxr = []
|
183
|
+
chxs = []
|
184
|
+
# Process params
|
185
|
+
@axis.each_with_index do |axis, idx|
|
186
|
+
# Find axis type
|
187
|
+
case axis.first
|
188
|
+
when :x
|
189
|
+
chxt << "x"
|
190
|
+
when :y
|
191
|
+
chxt << "y"
|
192
|
+
when :top
|
193
|
+
chxt << "r"
|
194
|
+
when :right
|
195
|
+
chxt << "t"
|
196
|
+
end
|
197
|
+
|
198
|
+
# Axis labels
|
199
|
+
axis_opts = axis.last
|
200
|
+
|
201
|
+
if axis_opts[:labels]
|
202
|
+
chxl[idx] = "#{idx}:|" + axis_opts[:labels].join("|")
|
203
|
+
end
|
204
|
+
|
205
|
+
# Axis positions
|
206
|
+
if axis_opts[:positions]
|
207
|
+
chxp[idx] = "#{idx}," + axis_opts[:positions].join(",")
|
208
|
+
end
|
209
|
+
|
210
|
+
# Axis range
|
211
|
+
if axis_opts[:range]
|
212
|
+
chxr[idx] = "#{idx},#{axis_opts[:range].first},#{axis_opts[:range].last}"
|
213
|
+
end
|
214
|
+
|
215
|
+
# Axis Styles
|
216
|
+
if axis_opts[:color] or axis_opts[:font_size] or axis_opts[:alignment]
|
217
|
+
if axis_opts[:alignment]
|
218
|
+
alignment = case axis_opts[:alignment]
|
219
|
+
when :center
|
220
|
+
0
|
221
|
+
when :left
|
222
|
+
-1
|
223
|
+
when :right
|
224
|
+
1
|
225
|
+
else
|
226
|
+
nil
|
227
|
+
end
|
228
|
+
end
|
229
|
+
chxs[idx] = "#{idx}," + [axis_opts[:color], axis_opts[:font_size], alignment].compact.join(",")
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
# Add to params hash
|
234
|
+
params.merge!({ :chxt => chxt.join(",") }) unless chxt.empty?
|
235
|
+
params.merge!({ :chxl => chxl.compact.join("|") }) unless chxl.compact.empty?
|
236
|
+
params.merge!({ :chxp => chxp.compact.join("|") }) unless chxp.compact.empty?
|
237
|
+
params.merge!({ :chxr => chxr.compact.join("|") }) unless chxr.compact.empty?
|
238
|
+
params.merge!({ :chxs => chxs.compact.join("|") }) unless chxs.compact.empty?
|
239
|
+
end
|
240
|
+
|
241
|
+
def add_grid
|
242
|
+
params.merge!({ :chg => @grid_str }) if @grid_str
|
243
|
+
end
|
244
|
+
|
245
|
+
def add_data
|
246
|
+
converted_data = process_data
|
247
|
+
case data_encoding
|
248
|
+
when :simple
|
249
|
+
converted_data = "s:" + converted_data
|
250
|
+
when :text
|
251
|
+
converted_data = "t:" + converted_data
|
252
|
+
when :extended
|
253
|
+
converted_data = "e:" + converted_data
|
254
|
+
else
|
255
|
+
raise "Illegal Encoding Specified"
|
256
|
+
end
|
257
|
+
params.merge!({:chd => converted_data})
|
258
|
+
end
|
259
|
+
|
260
|
+
def encode_data(values, max_value=nil)
|
261
|
+
case data_encoding
|
262
|
+
when :simple
|
263
|
+
simple_encode(values)
|
264
|
+
when :text
|
265
|
+
text_encode(values)
|
266
|
+
when :extended
|
267
|
+
extended_encode(values)
|
268
|
+
else
|
269
|
+
raise "Illegal Encoding Specified"
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
def simple_encode(values, max_value=nil)
|
274
|
+
alphabet_length = 61
|
275
|
+
max_value = values.max unless max_value
|
276
|
+
|
277
|
+
chart_data = values.collect do |val|
|
278
|
+
if val.to_i >=0
|
279
|
+
SIMPLE_ENCODING[(alphabet_length * val / max_value).to_i]
|
280
|
+
else
|
281
|
+
"_"
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
return chart_data.join('')
|
286
|
+
end
|
287
|
+
|
288
|
+
def text_encode(values, max_value=nil)
|
289
|
+
max_value = values.max unless max_value
|
290
|
+
values.inject("") { |sum, v|
|
291
|
+
sum += ( "%.1f" % (v*100/max_value) ) + ","
|
292
|
+
}.chomp(",")
|
293
|
+
end
|
294
|
+
|
295
|
+
def extended_encode(values, max_value)
|
296
|
+
max_value = values.max unless max_value
|
297
|
+
values.collect { |v| @@complex_encoding[(v * 4095/max_value).to_i]}.join('')
|
298
|
+
end
|
299
|
+
|
300
|
+
def join_encoded_data(encoded_data)
|
301
|
+
encoded_data.join((self.data_encoding == :simple) ? "," : "|")
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
module GoogleChart
|
3
|
+
# Generates a Line Chart. You can specify whether it is a standard line chart or an XY Line chart
|
4
|
+
#
|
5
|
+
# ==== Examples
|
6
|
+
#
|
7
|
+
# # Line Chart
|
8
|
+
# lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
|
9
|
+
# lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
|
10
|
+
# lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
|
11
|
+
# lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
|
12
|
+
# puts lc.to_url
|
13
|
+
#
|
14
|
+
# # Line XY Chart
|
15
|
+
# lcxy = GoogleChart::LineChart.new('320x200', "Line XY Chart", true)
|
16
|
+
# lcxy.data "Trend 1", [[1,1], [2,2], [3,3], [4,4]], '0000ff'
|
17
|
+
# lcxy.data "Trend 2", [[4,5], [2,2], [1,1], [3,4]], '00ff00'
|
18
|
+
# puts lcxy.to_url
|
19
|
+
class LineChart < Base
|
20
|
+
attr_accessor :is_xy
|
21
|
+
|
22
|
+
# Initializes a Line Chart object with a +chart_size+ and +chart_title+. Specify +is_xy+ as +true+ to generate a Line XY chart
|
23
|
+
def initialize(chart_size='300x200', chart_title=nil, is_xy=false)
|
24
|
+
super(chart_size, chart_title)
|
25
|
+
self.is_xy = is_xy
|
26
|
+
end
|
27
|
+
|
28
|
+
# If you want the Line Chart to be an XY chart, set the value to <tt>true</tt>, otherwise <tt>false</tt>.
|
29
|
+
#
|
30
|
+
# ==== Examples
|
31
|
+
# A line chart takes data in the following format (both X and Y coordinates need to be specified)
|
32
|
+
# lcxy = GoogleChart::LineChart.new('320x200', "Line XY Chart", true)
|
33
|
+
# lcxy.data "Trend 1", [[1,1], [2,2], [3,3], [4,4]], '0000ff'
|
34
|
+
# puts lcxy.to_url
|
35
|
+
def is_xy=(value)
|
36
|
+
@is_xy = value
|
37
|
+
if value
|
38
|
+
self.chart_type = :lxy
|
39
|
+
else
|
40
|
+
self.chart_type = :lc
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def process_data
|
45
|
+
if self.is_xy or @data.size > 1
|
46
|
+
if self.is_xy # XY Line graph data series
|
47
|
+
max_value = @data.flatten.max
|
48
|
+
x_data = @data.collect do |series|
|
49
|
+
series.collect { |val| val.first }
|
50
|
+
end
|
51
|
+
|
52
|
+
y_data = @data.collect do |series|
|
53
|
+
series.collect { |val| val.last }
|
54
|
+
end
|
55
|
+
|
56
|
+
encoded_data = []
|
57
|
+
@data.size.times { |i|
|
58
|
+
# Interleave X and Y co-ordinate data
|
59
|
+
encoded_data << join_encoded_data([encode_data(x_data[i],max_value), encode_data(y_data[i],max_value)])
|
60
|
+
}
|
61
|
+
join_encoded_data(encoded_data)
|
62
|
+
else # Line graph multiple data series
|
63
|
+
max_value = @data.flatten.max
|
64
|
+
join_encoded_data(@data.collect { |series|
|
65
|
+
encode_data(series, max_value)
|
66
|
+
})
|
67
|
+
end
|
68
|
+
else
|
69
|
+
encode_data(@data.flatten)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
module GoogleChart
|
3
|
+
class PieChart < Base
|
4
|
+
|
5
|
+
attr_accessor :is_3d
|
6
|
+
|
7
|
+
# Initializes a Pie Chart object with a +chart_size+ and +chart_title+. Specify <tt>is_3d</tt> as +true+ to generate a 3D Pie chart
|
8
|
+
def initialize(chart_size='300x200', chart_title=nil, is_3d = false)
|
9
|
+
super(chart_size, chart_title)
|
10
|
+
self.is_3d = is_3d
|
11
|
+
end
|
12
|
+
|
13
|
+
# Set this value to <tt>true</tt> if you want the Pie Chart to be rendered as a 3D image
|
14
|
+
def is_3d=(value)
|
15
|
+
if value
|
16
|
+
self.chart_type = :p3
|
17
|
+
else
|
18
|
+
self.chart_type = :p
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def process_data
|
23
|
+
encode_data(@data)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
module GoogleChart
|
3
|
+
# Generates a Venn Diagram.
|
4
|
+
#
|
5
|
+
# Supply three vd.data statements of label, size, color for circles A, B, C. Then, intersections with four values:
|
6
|
+
# * the first value specifies the area of A intersecting B
|
7
|
+
# * the second value specifies the area of B intersecting C
|
8
|
+
# * the third value specifies the area of C intersecting A
|
9
|
+
# * the fourth value specifies the area of A intersecting B intersecting C
|
10
|
+
#
|
11
|
+
# vd = GoogleChart::VennDiagram.new("320x200", 'Venn Diagram')
|
12
|
+
# vd.data "Blue", 100, '0000ff'
|
13
|
+
# vd.data "Green", 80, '00ff00'
|
14
|
+
# vd.data "Red", 60, 'ff0000'
|
15
|
+
# vd.intersections 30,30,30,10
|
16
|
+
# puts vd.to_url
|
17
|
+
class VennDiagram < Base
|
18
|
+
|
19
|
+
# Initializes the Venn Diagram with a +chart_size+ and a +chart_title+
|
20
|
+
def initialize(chart_size='300x200', chart_title=nil)
|
21
|
+
super(chart_size, chart_title)
|
22
|
+
self.chart_type = :v
|
23
|
+
@intersections = []
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_data
|
27
|
+
encode_data(@data + @intersections)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Specify the intersections of the circles in the Venn Diagram. See the Rdoc for class for sample
|
31
|
+
def intersections(*values)
|
32
|
+
@intersections = values
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/test.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'google_chart'
|
2
|
+
|
3
|
+
# Pie Chart
|
4
|
+
pc = GoogleChart::PieChart.new('320x200', "Pie Chart",false)
|
5
|
+
pc.data "Apples", 40
|
6
|
+
pc.data "Banana", 20
|
7
|
+
pc.data "Peach", 30
|
8
|
+
pc.data "Orange", 60
|
9
|
+
puts pc.to_url
|
10
|
+
|
11
|
+
# Line Chart
|
12
|
+
lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
|
13
|
+
lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
|
14
|
+
lc.show_legend = true
|
15
|
+
lc.show_labels = false
|
16
|
+
lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
|
17
|
+
lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
|
18
|
+
lc.axis :y, :range => [0,6], :color => 'ff00ff', :font_size => 16, :alignment => :center
|
19
|
+
lc.axis :x, :range => [0,6], :color => '00ffff', :font_size => 16, :alignment => :center
|
20
|
+
lc.grid :x_step => 100.0/6.0, :y_step => 100.0/6.0, :length_segment => 1, :length_blank => 0
|
21
|
+
puts lc.to_url
|
22
|
+
|
23
|
+
# Bar Chart
|
24
|
+
bc = GoogleChart::BarChart.new('800x200', "Bar Chart", :vertical, false)
|
25
|
+
bc.data "Trend 1", [5,4,3,1,3,5], '0000ff'
|
26
|
+
bc.data "Trend 2", [1,2,3,4,5,6], 'ff0000'
|
27
|
+
bc.data "Trend 3", [6,5,4,4,5,6], '00ff00'
|
28
|
+
puts bc.to_url
|
29
|
+
|
30
|
+
# Line XY Chart
|
31
|
+
lcxy = GoogleChart::LineChart.new('320x200', "Line XY Chart", true)
|
32
|
+
lcxy.data "Trend 1", [[1,1], [2,2], [3,3], [4,4]], '0000ff'
|
33
|
+
lcxy.data "Trend 2", [[4,5], [2,2], [1,1], [3,4]], '00ff00'
|
34
|
+
puts lcxy.to_url
|
35
|
+
|
36
|
+
# Venn Diagram
|
37
|
+
# Supply three vd.data statements of label, size, color for circles A, B, C
|
38
|
+
# Then, an :intersections with four values:
|
39
|
+
# the first value specifies the area of A intersecting B
|
40
|
+
# the second value specifies the area of B intersecting C
|
41
|
+
# the third value specifies the area of C intersecting A
|
42
|
+
# the fourth value specifies the area of A intersecting B intersecting C
|
43
|
+
vd = GoogleChart::VennDiagram.new("320x200", 'Venn Diagram')
|
44
|
+
vd.data "Blue", 100, '0000ff'
|
45
|
+
vd.data "Green", 80, '00ff00'
|
46
|
+
vd.data "Red", 60, 'ff0000'
|
47
|
+
vd.intersections 30,30,30,10
|
48
|
+
puts vd.to_url
|
49
|
+
|
50
|
+
# Solid fill
|
51
|
+
lc.fill(:background, :solid, {:color => 'fff2cc'})
|
52
|
+
lc.fill(:chart, :solid, {:color => 'ffcccc'})
|
53
|
+
puts lc.to_url
|
54
|
+
|
55
|
+
# Gradient fill
|
56
|
+
lc.fill :background, :gradient, :angle => 0, :color => [['76A4FB',1],['ffffff',0]]
|
57
|
+
lc.fill :chart, :gradient, :angle => 0, :color => [['76A4FB',1],
|
58
|
+
['ffffff',0]]
|
59
|
+
puts lc.to_url
|
60
|
+
|
61
|
+
# Stripes Fill
|
62
|
+
lc.fill :chart, :stripes, :angle => 90, :color => [['76A4FB',0.2],
|
63
|
+
['ffffff',0.2]]
|
64
|
+
puts lc.to_url
|
65
|
+
|
66
|
+
# Adding Extra params
|
67
|
+
lc = GoogleChart::LineChart.new('320x200', "Line Chart", false)
|
68
|
+
lc.data "Trend 1", [5,4,3,1,3,5,6], '0000ff'
|
69
|
+
lc.data "Trend 2", [1,2,3,4,5,6], '00ff00'
|
70
|
+
lc.data "Trend 3", [6,5,4,3,2,1], 'ff0000'
|
71
|
+
puts lc.to_url({:chm => "r,000000,0,0.1,0.5"}) # Single black line as a horizontal marker
|
72
|
+
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: gchartrb
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2007-12-11 00:00:00 +08:00
|
8
|
+
summary: Ruby Wrapper for the Google Chart API
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: deepak.jois@gmail.com
|
12
|
+
homepage: " by Deepak Jois"
|
13
|
+
rubyforge_project: gchartrb
|
14
|
+
description: "Visit http://code.google.com/p/gchartrb to track development regarding gchartrb. == FEATURES: * Provides an object oriented interface in Ruby to create Google Chart URLs for charts. == INSTALL: === Ruby Gem:"
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Deepak Jois
|
31
|
+
files:
|
32
|
+
- CREDITS
|
33
|
+
- History.txt
|
34
|
+
- Manifest.txt
|
35
|
+
- README.txt
|
36
|
+
- Rakefile
|
37
|
+
- TODO
|
38
|
+
- lib/google_chart.rb
|
39
|
+
- lib/google_chart/bar_chart.rb
|
40
|
+
- lib/google_chart/base.rb
|
41
|
+
- lib/google_chart/line_chart.rb
|
42
|
+
- lib/google_chart/pie_chart.rb
|
43
|
+
- lib/google_chart/venn_diagram.rb
|
44
|
+
- lib/test.rb
|
45
|
+
test_files: []
|
46
|
+
|
47
|
+
rdoc_options:
|
48
|
+
- --main
|
49
|
+
- README.txt
|
50
|
+
extra_rdoc_files:
|
51
|
+
- History.txt
|
52
|
+
- Manifest.txt
|
53
|
+
- README.txt
|
54
|
+
executables: []
|
55
|
+
|
56
|
+
extensions: []
|
57
|
+
|
58
|
+
requirements: []
|
59
|
+
|
60
|
+
dependencies:
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: hoe
|
63
|
+
version_requirement:
|
64
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.0
|
69
|
+
version:
|