gchart.lua

Tue, 01 Dec 2009 13:55:43 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Tue, 01 Dec 2009 13:55:43 +0000
changeset 12
96b91845c3a9
parent 10
8deebb43b0de
permissions
-rw-r--r--

Add example URL in README

0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 module(..., package.seeall);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local chart = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 chart.__index = chart;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
7
a6977f303c2c Export base chart to allow configuration of defaults
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
7 default = chart; -- Export defaults as the base chart object
a6977f303c2c Export base chart to allow configuration of defaults
Matthew Wild <mwild1@gmail.com>
parents: 6
diff changeset
8
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local writers = {}; -- Table of functions which build the URL
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 -- Defaults
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 chart.base_url = "http://chart.apis.google.com/chart";
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 chart.width, chart.height = 320, 200;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 chart.marker_color = "4D89F9";
5
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
15 chart.auto_scale_factor = 0.25;
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 -- Helpers
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local function urlencode(s) return s and (s:gsub("%W", function (c) return string.format("%%%02x", c:byte()); end)); end
4
e17867506327 Fix "bar" type to be vertical by default
Matthew Wild <mwild1@gmail.com>
parents: 3
diff changeset
19 local typemap = { line = "lc", sparkline = "ls", plot = "lxy", bar = "bvs" };
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
2
107b9d00e4d4 gchart.new_chart() => gchart.new()
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
21 function new(type)
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local chart_obj = {
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 type = typemap[type] or type or "lc";
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 series = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 axes = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 markers = {};
5
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
27 scale = { min = true, max = true };
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 };
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 return setmetatable(chart_obj, chart);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 -- Library methods --
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 function set_base_url(url)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 chart.base_url = url;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 function set_default_size(width, height)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 chart.width, chart.height = width or 320, height or 200;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 ----- Chart methods -----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 ---- Base URL ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 function chart:set_base_url(url)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 self.base_url = url;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 -- No writer for base URL
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 ---- Chart type ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 function chart:set_type(type)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 self.type = typemap[type] or type;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 -- No writer for type
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 ---- Data series ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 function chart:add_series(data)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 table.insert(self.series, data);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 local ee_string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.";
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 local ee_len = #ee_string;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 local function to_extended_encoding(value)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 value = tonumber(value);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 if not value or value < 0 then return "__"; end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 local div, rem = math.floor(value/ee_len)+1, math.floor(value % ee_len)+1;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 return ee_string:sub(div, div)..ee_string:sub(rem, rem);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 function writers:data()
5
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
74
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
75 if self.scale then
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
76 local autoscale_min, autoscale_max = (self.scale.min == true), (self.scale.max == true);
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
77 if autoscale_min or autoscale_max then
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
78 local min, max;
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
79 for n, series in ipairs(self.series) do
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
80 min, max = min or series[1], max or series[1];
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
81 for _, value in ipairs(series) do
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
82 if autoscale_min and value < min then min = value; end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
83 if autoscale_max and value > max then max = value; end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
84 end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
85 end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
86 if autoscale_min then
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
87 self.scale.min = min*(1-self.auto_scale_factor);
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
88 end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
89 if autoscale_max then
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
90 self.scale.max = max*(1+self.auto_scale_factor);
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
91 end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
92 end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
93 end
b4983e638117 Support for auto-scaling of data
Matthew Wild <mwild1@gmail.com>
parents: 4
diff changeset
94
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 local data = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 for n, series in ipairs(self.series) do
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 local encoded = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 for _, value in ipairs(series) do
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 if self.scale and value > 0 then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 --value = value - (self.scale.min or 0);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 --print(string.format("4096/(%d-%d)/(%d-%d) = %f", self.scale.max, self.scale.min, value, self.scale.min), value);
6
8d4be5429414 Maximum value in extended encoding is 4095, not 4096
Matthew Wild <mwild1@gmail.com>
parents: 5
diff changeset
102 value = 4095/((self.scale.max-self.scale.min)/(value-self.scale.min));
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 table.insert(encoded, to_extended_encoding(value));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 table.insert(data, table.concat(encoded));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 return "chd=e:"..table.concat(data, ",");
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 ---- Scale ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 function chart:set_scale(min, max)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 self.scale = { min = min, max = max };
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 ---- Size ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 function chart:set_size(width, height)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 self.width, self.height = width, height;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 function writers:size()
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 return "chs="..tostring(self.width).."x"..tostring(self.height);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 ---- Title ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 function chart:set_title(title)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 self.title = title;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 function writers:title()
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 if self.title then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 return "chtt="..urlencode(tostring(self.title):gsub("\n", "|"));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135
1
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
136 ---- Legend ----
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
137 function chart:set_legend(entries)
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
138 self.legend = entries;
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
139 end
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
140
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
141 function writers:legend()
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
142 if self.legend then
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
143 return "chdl="..table.concat(self.legend, "|");
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
144 end
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
145 end
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
146
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
147 ---- Legend position ----
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
148 local position_map = {
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
149 vertical = { bottom = "b", top = "t", left = "l", right = "r" };
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
150 horizontal = { bottom = "b", top = "t" };
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
151 };
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
152
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
153 function chart:set_legend_position(position, layout)
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
154 self.legend_position = positionmap[layout or "vertical"][position or "right"] or position;
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
155 end
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
156
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
157 function writers:legend_position()
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
158 if self.legend_position then
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
159 return "chdlp="..self.legend_position;
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
160 end
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
161 end
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 ---- Axes display ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 local axismap = { bottom = "x", left = "y", top = "t", right = "r" };
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 function chart:add_axis(which, options)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 table.insert(self.axes, { type = axismap[which], options = options });
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 function writers:axes()
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 local axes, ranges = {}, {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 local labels, positions = {}, {};
3
49a62f0f4a96 Fix traceback when writing axes
Matthew Wild <mwild1@gmail.com>
parents: 2
diff changeset
171 local styles, ticklengths = {}, {};
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 for index, axis in ipairs(self.axes) do
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 index = index - 1;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 table.insert(axes, axis.type);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 if axis.options.range then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 local range = axis.options.range;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 table.insert(ranges, index..","..(range.min or 0)..","..(range.max or 100)..(range.interval and (","..range.interval) or ""));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 if axis.options.labels then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 if axis.options.labels[1] then -- A list of strings
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 table.insert(labels, index..":|"..table.concat(axis.options.labels, "|"));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 else -- Specifying positions too
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 local label_list, position_list = {}, {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 for label, position in pairs(axis.options.labels) do
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 table.insert(label_list, label);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 table.insert(position_list, position);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 table.insert(labels, index..":|"..table.concat(label_list, "|"));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 table.insert(positions, index..","..table.concat(positions, ","));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 if axis.options.style then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 table.insert(styles, index..","..axis.options.style);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 if axis.options.ticklength then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 table.insert(ticklengths, index..","..axis.options.ticklength);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 local result = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 if next(axes) then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 table.insert(result, "chxt="..urlencode(table.concat(axes, ",")));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 if next(ranges) then
10
8deebb43b0de Use correct seperator between ranges
Matthew Wild <mwild1@gmail.com>
parents: 7
diff changeset
207 table.insert(result, "chxr="..urlencode(table.concat(ranges, "|")));
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 if next(labels) then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 table.insert(result, "chxl="..urlencode(table.concat(labels, "|")));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 if next(positions) then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 table.insert(result, "chxp="..urlencode(table.concat(positions, ",")));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 if next(styles) then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 table.insert(result, "chxs="..urlencode(table.concat(styles, "|")));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 end
1
f930ba6a8923 Support for legends, and legend positioning
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
218 if next(ticklengths) then
0
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 table.insert(result, "chxtc="..urlencode(table.concat(ticklengths, "|")));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 return table.concat(result, "&");
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 ---- Data points ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 function chart:add_marker(marker)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 table.insert(self.markers, marker);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 local marker_type_map = { flag = "f", text = "t", number = "N" };
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 function writers:markers()
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 local result = { };
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 for _, marker in ipairs(self.markers) do
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 table.insert(result, urlencode(
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 (marker_type_map[marker.type] or "f")
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 ..(marker.label or "Label")..","
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 ..(marker.color or self.marker_color)..","
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 ..(marker.series or 0)..","
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 ..(marker.index or 0)..","
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 ..(marker.size or 11)..","
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 ..(marker.priority or 0)));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 if next(result) then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 return "chm="..table.concat(result, "%7c");
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 ---- Colours and fill ----
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 function chart:set_color(color)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 self.color = color;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 function chart:set_fill(fill_color)
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 self.fill = fill_color;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 function writers:color()
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 if self.color then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 return "chco="..self.color;
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 function chart:url()
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 local url = self.base_url.."?cht="..self.type.."&";
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 local params = {};
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 for name, writer in pairs(writers) do
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 local ret = writer(self);
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 if ret then
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 table.insert(params, tostring(ret));
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 return url..table.concat(params, "&");
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 end
757c17d808a8 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276

mercurial