gchart 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.txt +12 -0
- data/Manifest.txt +20 -0
- data/README.txt +96 -3
- data/lib/gchart.rb +19 -4
- data/lib/gchart/axis.rb +139 -0
- data/lib/gchart/axis/bottom_axis.rb +10 -0
- data/lib/gchart/axis/horizontal_axis.rb +11 -0
- data/lib/gchart/axis/left_axis.rb +10 -0
- data/lib/gchart/axis/right_axis.rb +10 -0
- data/lib/gchart/axis/top_axis.rb +10 -0
- data/lib/gchart/axis/vertical_axis.rb +11 -0
- data/lib/gchart/base.rb +149 -18
- data/lib/gchart/colors.rb +690 -0
- data/lib/gchart/map.rb +71 -0
- data/lib/gchart/meter.rb +29 -0
- data/lib/gchart/sparkline.rb +15 -0
- data/lib/version.rb +1 -1
- data/spec/gchart/axis/bottom_axis_spec.rb +13 -0
- data/spec/gchart/axis/left_axis_spec.rb +13 -0
- data/spec/gchart/axis/right_axis_spec.rb +13 -0
- data/spec/gchart/axis/top_axis_spec.rb +13 -0
- data/spec/gchart/axis_spec.rb +216 -0
- data/spec/gchart/base_spec.rb +107 -0
- data/spec/gchart/colors_spec.rb +79 -0
- data/spec/gchart/map_spec.rb +56 -0
- data/spec/gchart/meter_spec.rb +48 -0
- data/spec/gchart/sparkline_spec.rb +12 -0
- metadata +26 -5
data/CHANGELOG.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 0.5.0 (2008-05-11)
|
2
|
+
|
3
|
+
* Support for Map charts [Mark Thomas]
|
4
|
+
* Support for Sparkline charts [Mark Thomas]
|
5
|
+
* Initial support for Google-o-meter [Mark Thomas]
|
6
|
+
* Implemented both background solid fill and chart area solid fill.
|
7
|
+
* Added color aliasing: 3-character colors and a COLORS table.
|
8
|
+
* Full support for axis labels.
|
9
|
+
* Implemented horizontal/vertical range markers.
|
10
|
+
* New committer, Jim Ludwig.
|
11
|
+
* Freeze GChart::VERSION.
|
12
|
+
|
1
13
|
== 0.4.2 (2008-01-09)
|
2
14
|
|
3
15
|
* Encoding a flatlined chart doesn't asplode [Jack Danger Canty]
|
data/Manifest.txt
CHANGED
@@ -3,21 +3,41 @@ Manifest.txt
|
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
5
|
lib/gchart.rb
|
6
|
+
lib/gchart/axis.rb
|
7
|
+
lib/gchart/axis/bottom_axis.rb
|
8
|
+
lib/gchart/axis/horizontal_axis.rb
|
9
|
+
lib/gchart/axis/left_axis.rb
|
10
|
+
lib/gchart/axis/right_axis.rb
|
11
|
+
lib/gchart/axis/top_axis.rb
|
12
|
+
lib/gchart/axis/vertical_axis.rb
|
6
13
|
lib/gchart/bar.rb
|
7
14
|
lib/gchart/base.rb
|
15
|
+
lib/gchart/colors.rb
|
8
16
|
lib/gchart/line.rb
|
17
|
+
lib/gchart/map.rb
|
18
|
+
lib/gchart/meter.rb
|
9
19
|
lib/gchart/pie.rb
|
10
20
|
lib/gchart/pie_3d.rb
|
11
21
|
lib/gchart/scatter.rb
|
22
|
+
lib/gchart/sparkline.rb
|
12
23
|
lib/gchart/venn.rb
|
13
24
|
lib/gchart/xy_line.rb
|
14
25
|
lib/version.rb
|
26
|
+
spec/gchart/axis/bottom_axis_spec.rb
|
27
|
+
spec/gchart/axis/left_axis_spec.rb
|
28
|
+
spec/gchart/axis/right_axis_spec.rb
|
29
|
+
spec/gchart/axis/top_axis_spec.rb
|
30
|
+
spec/gchart/axis_spec.rb
|
15
31
|
spec/gchart/bar_spec.rb
|
16
32
|
spec/gchart/base_spec.rb
|
33
|
+
spec/gchart/colors_spec.rb
|
17
34
|
spec/gchart/line_spec.rb
|
35
|
+
spec/gchart/map_spec.rb
|
36
|
+
spec/gchart/meter_spec.rb
|
18
37
|
spec/gchart/pie_3d_spec.rb
|
19
38
|
spec/gchart/pie_spec.rb
|
20
39
|
spec/gchart/scatter_spec.rb
|
40
|
+
spec/gchart/sparkline_spec.rb
|
21
41
|
spec/gchart/venn_spec.rb
|
22
42
|
spec/gchart/xy_line_spec.rb
|
23
43
|
spec/gchart_spec.rb
|
data/README.txt
CHANGED
@@ -8,9 +8,9 @@ a friendly Ruby interface. It can generate the URL for a given chart
|
|
8
8
|
|
9
9
|
== PROBLEMS/TODO
|
10
10
|
|
11
|
-
* Add
|
12
|
-
* Support shorthand colors and color names
|
11
|
+
* Add grid lines, linear stripes, shape markers, gradient fills
|
13
12
|
* Make venn data specification friendlier
|
13
|
+
* Make documentation more digestible
|
14
14
|
|
15
15
|
There are lots of missing features. Until they're implemented, you can directly specify
|
16
16
|
query parameters using the :extras key, e.g.,
|
@@ -34,6 +34,12 @@ query parameters using the :extras key, e.g.,
|
|
34
34
|
|
35
35
|
# scatter plot (x coords, y coords [, sizes])
|
36
36
|
g = GChart.scatter(:data => [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [1, 2, 3, 4, 5]])
|
37
|
+
|
38
|
+
# map chart
|
39
|
+
g = GChart.map(:area => 'usa', :data => {'NY'=>1,'VA'=>3,'CA'=>2})
|
40
|
+
|
41
|
+
# meter
|
42
|
+
g = GChart.meter(:data => 70, :label => "70%")
|
37
43
|
|
38
44
|
# chart title
|
39
45
|
g = GChart.line(:title => "Awesomeness over Time", :data => [0, 10, 100])
|
@@ -49,11 +55,98 @@ query parameters using the :extras key, e.g.,
|
|
49
55
|
g.write("foo.png") # write to a file (defaults to "chart.png")
|
50
56
|
g.write(stream) # write to anything that quacks like IO
|
51
57
|
|
58
|
+
== AXIS LABELING
|
59
|
+
|
60
|
+
Charts which support an axis concept can be labeled. Supported types
|
61
|
+
are line charts, bar charts, radar charts and scatter plots. See
|
62
|
+
+GChart::Axis+ for more information.
|
63
|
+
|
64
|
+
== EXAMPLES
|
65
|
+
|
66
|
+
=== Simple Line Chart with 2 data sets
|
67
|
+
|
68
|
+
require 'gchart'
|
69
|
+
chart = GChart.line do |g|
|
70
|
+
g.data = [[0, 1, 2, 3, 4, 5, 6], [3, 2, 4, 1, 5, 0, 6]]
|
71
|
+
g.colors = [:red, :yellow]
|
72
|
+
g.legend = ["Line", "Wonkiness"]
|
73
|
+
|
74
|
+
g.width = 600
|
75
|
+
g.height = 150
|
76
|
+
|
77
|
+
g.entire_background = "f4f4f4"
|
78
|
+
|
79
|
+
g.axis(:left) { |a| a.range = 0..6 }
|
80
|
+
|
81
|
+
g.axis(:bottom) do |a|
|
82
|
+
a.labels = ["Mon", "Tue", "Thu", "Sun"]
|
83
|
+
a.label_positions = [0, 16.67, 50, 100]
|
84
|
+
a.text_color = :black
|
85
|
+
end
|
86
|
+
|
87
|
+
g.axis(:bottom) do |a|
|
88
|
+
a.labels = ["Week 42"]
|
89
|
+
a.label_positions = [50]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
=== Complex Line Chart with multiple axes
|
94
|
+
|
95
|
+
require 'gchart'
|
96
|
+
chart = GChart.line do |g|
|
97
|
+
g.data = [data_array1, data_array2, data_array3]
|
98
|
+
g.colors = [:red, :green, :blue]
|
99
|
+
g.legend = ["Set 1", "Set 2", "Set 3"]
|
100
|
+
|
101
|
+
g.width = 950
|
102
|
+
g.height = 315
|
103
|
+
|
104
|
+
g.entire_background = "434"
|
105
|
+
g.chart_background = "aba"
|
106
|
+
|
107
|
+
g.axis(:left) do |a|
|
108
|
+
a.range = 0..100
|
109
|
+
a.text_color = :red
|
110
|
+
a.font_size = 9
|
111
|
+
end
|
112
|
+
|
113
|
+
g.axis(:right) do |a|
|
114
|
+
a.range = 0..1000
|
115
|
+
a.labels = %w(250 500 750)
|
116
|
+
a.label_positions = [250, 500, 750]
|
117
|
+
|
118
|
+
a.text_color = :green
|
119
|
+
a.font_size = 8
|
120
|
+
a.text_alignment = :right
|
121
|
+
end
|
122
|
+
|
123
|
+
g.axis(:top) do |a|
|
124
|
+
a.labels = %w(2008)
|
125
|
+
a.positions = [50]
|
126
|
+
end
|
127
|
+
|
128
|
+
bottom1 = g.axis(:bottom)
|
129
|
+
bottom1.labels = dates_array
|
130
|
+
bottom1.range_markers = [
|
131
|
+
[0..33.33, 'ff000044'], [33.33..66.67, '00ff0044'], [66.67..100, '0000ff44']
|
132
|
+
]
|
133
|
+
|
134
|
+
# We "manually" create our 2nd bottom axis...
|
135
|
+
bottom2 = GChart::Axis.create(:bottom)
|
136
|
+
bottom2.labels = %w(Dates)
|
137
|
+
bottom2.label_positions = [50]
|
138
|
+
|
139
|
+
# ...and therefore need to also add it to our axes "manually".
|
140
|
+
g.axes << bottom2
|
141
|
+
end
|
142
|
+
|
143
|
+
url = chart.to_url
|
144
|
+
|
52
145
|
== LICENSE
|
53
146
|
|
54
147
|
(The MIT License)
|
55
148
|
|
56
|
-
Copyright 2007-2008 John Barnette (jbarnette@rubyforge.org)
|
149
|
+
Copyright 2007-2008 John Barnette (jbarnette@rubyforge.org), Jim Ludwig (supplanter@rubyforge.org)
|
57
150
|
|
58
151
|
Permission is hereby granted, free of charge, to any person obtaining
|
59
152
|
a copy of this software and associated documentation files (the
|
data/lib/gchart.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/version")
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/gchart/colors")
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/gchart/axis")
|
2
4
|
|
3
|
-
%w(base bar line pie pie_3d scatter venn xy_line).each do |type|
|
5
|
+
%w(base bar line map meter pie pie_3d scatter sparkline venn xy_line).each do |type|
|
4
6
|
require File.expand_path(File.dirname(__FILE__) + "/gchart/#{type}")
|
5
7
|
end
|
6
8
|
|
9
|
+
%w(horizontal vertical top right bottom left).each do |type|
|
10
|
+
require File.expand_path(File.dirname(__FILE__) + "/gchart/axis/#{type}_axis")
|
11
|
+
end
|
12
|
+
|
7
13
|
module GChart
|
8
14
|
URL = "http://chart.apis.google.com/chart"
|
9
15
|
SIMPLE_CHARS = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a
|
@@ -20,18 +26,27 @@ module GChart
|
|
20
26
|
# Convenience constructor for GChart::Bar.
|
21
27
|
def bar(*args, &block); Bar.new(*args, &block) end
|
22
28
|
|
29
|
+
# Convenience constructor for GChart::Map.
|
30
|
+
def map(*args, &block); Map.new(*args, &block) end
|
31
|
+
|
32
|
+
# Convenience constructor for GChart::Meter.
|
33
|
+
def meter(*args, &block); Meter.new(*args, &block) end
|
34
|
+
|
23
35
|
# Convenience constructor for GChart::Pie.
|
24
36
|
def pie(*args, &block); Pie.new(*args, &block) end
|
25
37
|
|
26
38
|
# Convenience constructor for GChart::Pie3D.
|
27
39
|
def pie3d(*args, &block); Pie3D.new(*args, &block) end
|
28
40
|
|
29
|
-
# Convenience constructor for GChart::Venn.
|
30
|
-
def venn(*args, &block); Venn.new(*args, &block) end
|
31
|
-
|
32
41
|
# Convenience constructor for GChart::Scatter.
|
33
42
|
def scatter(*args, &block); Scatter.new(*args, &block) end
|
34
43
|
|
44
|
+
# Convenience constructor for GChart::Sparkline.
|
45
|
+
def sparkline(*args, &block); Sparkline.new(*args, &block) end
|
46
|
+
|
47
|
+
# Convenience constructor for GChart::Venn.
|
48
|
+
def venn(*args, &block); Venn.new(*args, &block) end
|
49
|
+
|
35
50
|
# Encode +n+ as a string. +n+ is normalized based on +max+.
|
36
51
|
# +encoding+ can currently only be :extended.
|
37
52
|
def encode(encoding, n, max)
|
data/lib/gchart/axis.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
module GChart
|
2
|
+
class Axis
|
3
|
+
|
4
|
+
# Array of axis labels. Can be exactly placed along the axis with
|
5
|
+
# +label_positions+, otherwise are evenly spaced.
|
6
|
+
attr_accessor :labels
|
7
|
+
|
8
|
+
# Array of float positions for +labels+. Without +labels+, the
|
9
|
+
# +label_positions+ are self-labeling.
|
10
|
+
attr_accessor :label_positions
|
11
|
+
|
12
|
+
# Takes a +Range+ of float values. With +labels+, defines +labels+
|
13
|
+
# context, meaning the +labels+ will be spaced at their proper
|
14
|
+
# location within the +range+. Without +labels+, smart-labeling
|
15
|
+
# occurs for +range+.
|
16
|
+
attr_accessor :range
|
17
|
+
|
18
|
+
# An rrggbb color for axis text.
|
19
|
+
attr_accessor :text_color
|
20
|
+
|
21
|
+
# Size of font in pixels. To set +font_size+, +text_color+ is also
|
22
|
+
# required.
|
23
|
+
attr_accessor :font_size
|
24
|
+
|
25
|
+
# +TEXT_ALIGNMENT+ property for axis labeling. To set
|
26
|
+
# +text_alignment+, both +text_color+ and +font_size+ must also be
|
27
|
+
# set.
|
28
|
+
attr_accessor :text_alignment
|
29
|
+
|
30
|
+
# Array of 2-element sub-arrays such that the 1st element in each
|
31
|
+
# sub-array is a +Range+ of float values which describe the start
|
32
|
+
# and end points of the range marker, and the 2nd element in each
|
33
|
+
# sub-array is an rrggbb color for the range marker. For +:top+
|
34
|
+
# and +:bottom+ +AXIS_TYPES+, markers are vertical. For +:right+
|
35
|
+
# and +:left+ +AXIS_TYPES+, markers are horizontal.
|
36
|
+
attr_accessor :range_markers
|
37
|
+
|
38
|
+
AXIS_TYPES = [ :top, :right, :bottom, :left ]
|
39
|
+
|
40
|
+
# Defaults: +:left+ for +RightAxis+, +:center+ for +TopAxis+ and
|
41
|
+
# for +BottomAxis+, and +:right+ for +LeftAxis+.
|
42
|
+
TEXT_ALIGNMENT = { :left => -1, :center => 0, :right => 1 }
|
43
|
+
|
44
|
+
class << self
|
45
|
+
# Instantiates the proper +GChart::Axis+ subclass based on the
|
46
|
+
# +axis_type+.
|
47
|
+
def create(axis_type, &block)
|
48
|
+
raise ArgumentError.new("Invalid axis type '#{axis_type}'") unless AXIS_TYPES.include?(axis_type)
|
49
|
+
|
50
|
+
axis = Object.module_eval("GChart::#{axis_type.to_s.capitalize}Axis").new
|
51
|
+
|
52
|
+
yield(axis) if block_given?
|
53
|
+
axis
|
54
|
+
end
|
55
|
+
|
56
|
+
private :new
|
57
|
+
end
|
58
|
+
|
59
|
+
def initialize
|
60
|
+
@labels = []
|
61
|
+
@label_positions = []
|
62
|
+
@range_markers = {}
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns a one-character label of the axis according to its type.
|
66
|
+
def axis_type_label
|
67
|
+
raise NotImplementedError.new("Method must be overridden in a subclass of this abstract base class.")
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns a one-character label to indicate whether
|
71
|
+
# +ranger_markers+ are vertical or horizontal.
|
72
|
+
def range_marker_type_label
|
73
|
+
raise NotImplementedError.new("Method must be overridden in a subclass of this abstract base class.")
|
74
|
+
end
|
75
|
+
|
76
|
+
# Ensures that all combinations of attributes which have been set
|
77
|
+
# will work with each other. Raises +ArgumentError+ otherwise.
|
78
|
+
def validate!
|
79
|
+
if labels.size > 0 and label_positions.size > 0 and labels.size != label_positions.size
|
80
|
+
raise ArgumentError.new(
|
81
|
+
"Both labels and label_positions have been specified, but their " +
|
82
|
+
"respective counts do not match (labels.size = '#{labels.size}' " +
|
83
|
+
"and label_positions.size = '#{label_positions.size}')"
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
unless label_positions.all? { |pos| pos.is_a?(Numeric) }
|
88
|
+
raise ArgumentError.new(
|
89
|
+
"The label_positions attribute requires numeric values for each position specified"
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
if range
|
94
|
+
unless range.is_a?(Range)
|
95
|
+
raise ArgumentError.new("The range attribute has been specified with a non-Range class")
|
96
|
+
end
|
97
|
+
|
98
|
+
unless range.first.is_a?(Numeric)
|
99
|
+
raise ArgumentError.new("The range attribute has been specified with non-numeric range values")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
if font_size and not text_color
|
104
|
+
raise ArgumentError.new("To specify a font_size, a text_color must also be specified")
|
105
|
+
end
|
106
|
+
|
107
|
+
if text_alignment and not (text_color and font_size)
|
108
|
+
raise ArgumentError.new(
|
109
|
+
"To specify a text_alignment, both text_color and font_size must also be specified"
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
113
|
+
if text_color and not GChart.valid_color?(text_color)
|
114
|
+
raise ArgumentError.new("The text_color attribute has been specified with an invalid color")
|
115
|
+
end
|
116
|
+
|
117
|
+
if font_size and not font_size.is_a?(Numeric)
|
118
|
+
raise ArgumentError.new("The font_size must have a numeric value")
|
119
|
+
end
|
120
|
+
|
121
|
+
if text_alignment and not TEXT_ALIGNMENT[text_alignment]
|
122
|
+
raise ArgumentError.new(
|
123
|
+
"The text_alignment attribute has been specified with a non-TEXT_ALIGNMENT"
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
127
|
+
if not range_markers.all? { |array| array.is_a?(Array) and array.size == 2 and
|
128
|
+
array[0].is_a?(Range) and array[0].first.is_a?(Numeric) and
|
129
|
+
GChart.valid_color?(array[1]) }
|
130
|
+
raise ArgumentError.new(
|
131
|
+
"The range_markers attribute must be an array of 2-element sub-arrays such that " +
|
132
|
+
"the first element in each sub-array is a Range of numeric values and the second " +
|
133
|
+
"element in each sub-array is a valid color"
|
134
|
+
)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
data/lib/gchart/base.rb
CHANGED
@@ -5,31 +5,44 @@ module GChart
|
|
5
5
|
class Base
|
6
6
|
# Array of chart data. See subclasses for specific usage.
|
7
7
|
attr_accessor :data
|
8
|
-
|
8
|
+
|
9
9
|
# Hash of additional HTTP query params.
|
10
10
|
attr_accessor :extras
|
11
|
-
|
11
|
+
|
12
12
|
# Chart title.
|
13
13
|
attr_accessor :title
|
14
|
-
|
14
|
+
|
15
15
|
# Array of rrggbb colors, one per data set.
|
16
16
|
attr_accessor :colors
|
17
|
-
|
17
|
+
|
18
18
|
# Array of legend text, one per data set.
|
19
19
|
attr_accessor :legend
|
20
|
-
|
20
|
+
|
21
21
|
# Max data value for quantization.
|
22
22
|
attr_accessor :max
|
23
23
|
|
24
24
|
# Chart width, in pixels.
|
25
|
-
attr_reader :width
|
26
|
-
|
25
|
+
attr_reader :width
|
26
|
+
|
27
27
|
# Chart height, in pixels.
|
28
28
|
attr_reader :height
|
29
29
|
|
30
|
+
# Background rrggbb color of entire chart image.
|
31
|
+
attr_accessor :entire_background
|
32
|
+
|
33
|
+
# Background rrggbb color of just chart area of chart image.
|
34
|
+
attr_accessor :chart_background
|
35
|
+
|
36
|
+
# Array of +GChart::Axis+ objects.
|
37
|
+
attr_accessor :axes
|
38
|
+
|
30
39
|
def initialize(options={}, &block)
|
31
|
-
@data
|
40
|
+
@data = []
|
41
|
+
@colors = []
|
42
|
+
@legend = []
|
43
|
+
@axes = []
|
32
44
|
@extras = {}
|
45
|
+
|
33
46
|
@width = 300
|
34
47
|
@height = 200
|
35
48
|
|
@@ -51,9 +64,9 @@ module GChart
|
|
51
64
|
# if +height+ is less than 1 or greater than 1,000.
|
52
65
|
def height=(height)
|
53
66
|
if height.nil? || height < 1 || height > 1_000
|
54
|
-
raise ArgumentError, "Invalid height: #{height.inspect}"
|
67
|
+
raise ArgumentError, "Invalid height: #{height.inspect}"
|
55
68
|
end
|
56
|
-
|
69
|
+
|
57
70
|
@height = height
|
58
71
|
end
|
59
72
|
|
@@ -66,7 +79,7 @@ module GChart
|
|
66
79
|
# if +width+ * +height+ is greater than 300,000 pixels.
|
67
80
|
def size=(size)
|
68
81
|
self.width, self.height = size.split("x").collect { |n| Integer(n) }
|
69
|
-
|
82
|
+
|
70
83
|
if (width * height) > 300_000
|
71
84
|
raise ArgumentError, "Invalid size: #{size.inspect} yields a graph with more than 300,000 pixels"
|
72
85
|
end
|
@@ -90,6 +103,14 @@ module GChart
|
|
90
103
|
open(io_or_file, "w+") { |io| io.write(fetch) }
|
91
104
|
end
|
92
105
|
|
106
|
+
# Adds an +axis_type+ +GChart::Axis+ to the chart's set of
|
107
|
+
# +axes+. See +GChart::Axis::AXIS_TYPES+.
|
108
|
+
def axis(axis_type, &block)
|
109
|
+
axis = GChart::Axis.create(axis_type, &block)
|
110
|
+
@axes.push(axis)
|
111
|
+
axis
|
112
|
+
end
|
113
|
+
|
93
114
|
protected
|
94
115
|
|
95
116
|
def query_params(raw_params={}) #:nodoc:
|
@@ -99,6 +120,13 @@ module GChart
|
|
99
120
|
render_title(params)
|
100
121
|
render_colors(params)
|
101
122
|
render_legend(params)
|
123
|
+
render_backgrounds(params)
|
124
|
+
|
125
|
+
unless @axes.empty?
|
126
|
+
if is_a?(GChart::Line) or is_a?(GChart::Bar) or is_a?(GChart::Scatter) # or is_a?(GChart::Radar)
|
127
|
+
render_axes(params)
|
128
|
+
end
|
129
|
+
end
|
102
130
|
|
103
131
|
params.merge(extras)
|
104
132
|
end
|
@@ -110,24 +138,127 @@ module GChart
|
|
110
138
|
def render_data(params) #:nodoc:
|
111
139
|
raw = data && data.first.is_a?(Array) ? data : [data]
|
112
140
|
max = self.max || raw.collect { |s| s.max }.max
|
113
|
-
|
141
|
+
|
114
142
|
sets = raw.collect do |set|
|
115
143
|
set.collect { |n| GChart.encode(:extended, n, max) }.join
|
116
144
|
end
|
117
|
-
|
118
145
|
params["chd"] = "e:#{sets.join(",")}"
|
119
146
|
end
|
120
147
|
|
121
148
|
def render_title(params) #:nodoc:
|
122
149
|
params["chtt"] = title.tr("\n ", "|+") if title
|
123
150
|
end
|
124
|
-
|
151
|
+
|
125
152
|
def render_colors(params) #:nodoc:
|
126
|
-
|
153
|
+
unless colors.empty?
|
154
|
+
params["chco"] = colors.collect{ |color| GChart.expand_color(color) }.join(",")
|
155
|
+
end
|
127
156
|
end
|
128
|
-
|
157
|
+
|
129
158
|
def render_legend(params) #:nodoc:
|
130
|
-
params["chdl"] = legend.join("|")
|
131
|
-
end
|
159
|
+
params["chdl"] = legend.join("|") unless legend.empty?
|
160
|
+
end
|
161
|
+
|
162
|
+
def render_backgrounds(params) #:nodoc:
|
163
|
+
if entire_background || chart_background
|
164
|
+
if entire_background and not GChart.valid_color?(entire_background)
|
165
|
+
raise ArgumentError.new("The entire_background attribute has an invalid color")
|
166
|
+
end
|
167
|
+
if chart_background and not GChart.valid_color?(chart_background)
|
168
|
+
raise ArgumentError.new("The chart_background attribute has an invalid color")
|
169
|
+
end
|
170
|
+
|
171
|
+
separator = entire_background && chart_background ? "|" : ""
|
172
|
+
params["chf"] = entire_background ? "bg,s,#{GChart.expand_color(entire_background)}" : ""
|
173
|
+
params["chf"] += "#{separator}c,s,#{GChart.expand_color(chart_background)}" if chart_background
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def render_axes(params) #:nodoc:
|
178
|
+
@axes.each do |axis|
|
179
|
+
axis.validate!
|
180
|
+
end
|
181
|
+
|
182
|
+
render_axis_type_labels(params)
|
183
|
+
render_axis_labels(params)
|
184
|
+
render_axis_label_positions(params)
|
185
|
+
render_axis_ranges(params)
|
186
|
+
render_axis_styles(params)
|
187
|
+
render_axis_range_markers(params)
|
188
|
+
end
|
189
|
+
|
190
|
+
def render_axis_type_labels(params) #:nodoc:
|
191
|
+
params["chxt"] = @axes.collect{ |axis| axis.axis_type_label }.join(',')
|
192
|
+
end
|
193
|
+
|
194
|
+
def render_axis_labels(params) #:nodoc:
|
195
|
+
if @axes.any?{ |axis| axis.labels.size > 0 }
|
196
|
+
chxl = []
|
197
|
+
|
198
|
+
@axes.each_with_index do |axis, index|
|
199
|
+
if axis.labels.size > 0
|
200
|
+
chxl.push("#{index}:")
|
201
|
+
chxl += axis.labels
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
params["chxl"] = chxl.join('|')
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def render_axis_label_positions(params) #:nodoc:
|
210
|
+
if @axes.any?{ |axis| axis.label_positions.size > 0 }
|
211
|
+
chxp = []
|
212
|
+
|
213
|
+
@axes.each_with_index do |axis, index|
|
214
|
+
chxp.push("#{index}," + axis.label_positions.join(',')) if axis.label_positions.size > 0
|
215
|
+
end
|
216
|
+
|
217
|
+
params["chxp"] = chxp.join('|')
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def render_axis_ranges(params) #:nodoc:
|
222
|
+
if @axes.any?{ |axis| axis.range }
|
223
|
+
chxr = []
|
224
|
+
|
225
|
+
@axes.each_with_index do |axis, index|
|
226
|
+
chxr.push("#{index},#{axis.range.first},#{axis.range.last}") if axis.range
|
227
|
+
end
|
228
|
+
|
229
|
+
params["chxr"] = chxr.join('|')
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def render_axis_styles(params) #:nodoc:
|
234
|
+
if @axes.any?{ |axis| axis.text_color }
|
235
|
+
chxs = []
|
236
|
+
|
237
|
+
@axes.each_with_index do |axis, index|
|
238
|
+
if axis.text_color
|
239
|
+
chxs.push(
|
240
|
+
"#{index}," +
|
241
|
+
[GChart.expand_color(axis.text_color), axis.font_size, axis.text_alignment].compact.join(',')
|
242
|
+
)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
params["chxs"] = chxs.join('|')
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def render_axis_range_markers(params) #:nodoc:
|
251
|
+
if @axes.any?{ |axis| axis.range_markers.size > 0 }
|
252
|
+
chmr = []
|
253
|
+
|
254
|
+
@axes.each do |axis|
|
255
|
+
axis.range_markers.each do |range, color|
|
256
|
+
chmr.push("#{axis.range_marker_type_label},#{color},0,#{range.first},#{range.last}")
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
params["chm"] = chmr.join('|')
|
261
|
+
end
|
262
|
+
end
|
132
263
|
end
|
133
264
|
end
|