Kelsin-lilygraph 0.2.5 → 0.3.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/Rakefile +1 -0
- data/VERSION +1 -1
- data/doc/classes/Lilygraph.html +347 -0
- data/doc/classes/Lilygraph.src/M000001.html +24 -0
- data/doc/classes/Lilygraph.src/M000002.html +18 -0
- data/doc/classes/Lilygraph.src/M000003.html +133 -0
- data/doc/created.rid +1 -0
- data/doc/files/lib/lilygraph_rb.html +119 -0
- data/doc/fr_class_index.html +27 -0
- data/doc/fr_file_index.html +27 -0
- data/doc/fr_method_index.html +29 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/lilygraph.rb +72 -16
- data/lilygraph.gemspec +13 -2
- metadata +13 -2
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,347 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Class: Lilygraph</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Class</strong></td>
|
53
|
+
<td class="class-name-in-header">Lilygraph</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../files/lib/lilygraph_rb.html">
|
59
|
+
lib/lilygraph.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
</td>
|
63
|
+
</tr>
|
64
|
+
|
65
|
+
<tr class="top-aligned-row">
|
66
|
+
<td><strong>Parent:</strong></td>
|
67
|
+
<td>
|
68
|
+
Object
|
69
|
+
</td>
|
70
|
+
</tr>
|
71
|
+
</table>
|
72
|
+
</div>
|
73
|
+
<!-- banner header -->
|
74
|
+
|
75
|
+
<div id="bodyContent">
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
<div id="contextContent">
|
80
|
+
|
81
|
+
<div id="description">
|
82
|
+
<p>
|
83
|
+
This is the main class to use if you want to create a graph!
|
84
|
+
</p>
|
85
|
+
<pre>
|
86
|
+
graph = Lilygraph.new(:title => "My Awesome Graph")
|
87
|
+
graph.data = [1,2,3]
|
88
|
+
graph.labels = ['One','Two','Three']
|
89
|
+
graph.render
|
90
|
+
</pre>
|
91
|
+
<p>
|
92
|
+
This class outputs svg as a string once you call <a
|
93
|
+
href="Lilygraph.html#M000003">render</a>.
|
94
|
+
</p>
|
95
|
+
|
96
|
+
</div>
|
97
|
+
|
98
|
+
|
99
|
+
</div>
|
100
|
+
|
101
|
+
<div id="method-list">
|
102
|
+
<h3 class="section-bar">Methods</h3>
|
103
|
+
|
104
|
+
<div class="name-list">
|
105
|
+
<a href="#M000001">new</a>
|
106
|
+
<a href="#M000003">render</a>
|
107
|
+
<a href="#M000002">update_options</a>
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
|
111
|
+
</div>
|
112
|
+
|
113
|
+
|
114
|
+
<!-- if includes -->
|
115
|
+
|
116
|
+
<div id="section">
|
117
|
+
|
118
|
+
|
119
|
+
<div id="constants-list">
|
120
|
+
<h3 class="section-bar">Constants</h3>
|
121
|
+
|
122
|
+
<div class="name-list">
|
123
|
+
<table summary="Constants">
|
124
|
+
<tr class="top-aligned-row context-row">
|
125
|
+
<td class="context-item-name">DEFAULT_OPTIONS</td>
|
126
|
+
<td>=</td>
|
127
|
+
<td class="context-item-value">{ :height => '100%', :width => '100%', :indent => 2, :padding => 14, :bar_text => true, :viewbox => { :width => 800, :height => 600</td>
|
128
|
+
<td width="3em"> </td>
|
129
|
+
<td class="context-item-desc">
|
130
|
+
Default options for the initializer
|
131
|
+
|
132
|
+
</td>
|
133
|
+
</tr>
|
134
|
+
</table>
|
135
|
+
</div>
|
136
|
+
</div>
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
<div id="attribute-list">
|
141
|
+
<h3 class="section-bar">Attributes</h3>
|
142
|
+
|
143
|
+
<div class="name-list">
|
144
|
+
<table>
|
145
|
+
<tr class="top-aligned-row context-row">
|
146
|
+
<td class="context-item-name">colors</td>
|
147
|
+
<td class="context-item-value"> [RW] </td>
|
148
|
+
<td class="context-item-desc">
|
149
|
+
This allows you to set colors for the bars.
|
150
|
+
|
151
|
+
<p>
|
152
|
+
If you just want a single color:
|
153
|
+
</p>
|
154
|
+
<pre>
|
155
|
+
graph.colors='#0000aa'
|
156
|
+
</pre>
|
157
|
+
<p>
|
158
|
+
If you want to make each bar (or bar group) different colors:
|
159
|
+
</p>
|
160
|
+
<pre>
|
161
|
+
graph.colors=['#aa0000','#00aa00','#0000aa']
|
162
|
+
</pre>
|
163
|
+
<p>
|
164
|
+
If you want every bar group to be the same, but each bar in the groups to
|
165
|
+
have a different color
|
166
|
+
</p>
|
167
|
+
<pre>
|
168
|
+
graph.colors=[['#aa0000','#00aa00','#0000aa']]
|
169
|
+
</pre>
|
170
|
+
<p>
|
171
|
+
If you want to set every bar group color:
|
172
|
+
</p>
|
173
|
+
<pre>
|
174
|
+
graph.colors=[['#aa0000','#00aa00','#0000aa'],['#bb0000','#00bb00','#0000bb']]
|
175
|
+
</pre>
|
176
|
+
<p>
|
177
|
+
Last but not least you can set the color value to any object that responds
|
178
|
+
to call (like a Proc). The proc takes four arguments. data_index: The index
|
179
|
+
of the current bar (or group) number_index: The index of the current bar
|
180
|
+
INSIDE of the current bar group (always 0 if you don‘t have grouped
|
181
|
+
bars) data_size: total number of bar or groups. number_size: total number
|
182
|
+
of bars in the current group (always 1 if you don‘t have bar groups)
|
183
|
+
</p>
|
184
|
+
<p>
|
185
|
+
The default proc looks like:
|
186
|
+
</p>
|
187
|
+
<pre>
|
188
|
+
graph.colors=Proc.new do |data_index, number_index, data_size, number_size|
|
189
|
+
Color::HSL.from_fraction(Float(data_index) / Float(data_size), 1.0, 0.4 + (Float(number_index) / Float(number_size) * 0.4)).to_rgb.html
|
190
|
+
end
|
191
|
+
</pre>
|
192
|
+
</td>
|
193
|
+
</tr>
|
194
|
+
<tr class="top-aligned-row context-row">
|
195
|
+
<td class="context-item-name">data</td>
|
196
|
+
<td class="context-item-value"> [RW] </td>
|
197
|
+
<td class="context-item-desc">
|
198
|
+
This is the data for the graph. It should be an array where every item is
|
199
|
+
either a number or an array of numbers.
|
200
|
+
|
201
|
+
<p>
|
202
|
+
For a simple bar graph:
|
203
|
+
</p>
|
204
|
+
<pre>
|
205
|
+
graph.data=[1,2,3]
|
206
|
+
</pre>
|
207
|
+
<p>
|
208
|
+
For a grouped bar graph:
|
209
|
+
</p>
|
210
|
+
<pre>
|
211
|
+
graph.data=[[1,10],[2,20],[3,30]]
|
212
|
+
</pre>
|
213
|
+
</td>
|
214
|
+
</tr>
|
215
|
+
<tr class="top-aligned-row context-row">
|
216
|
+
<td class="context-item-name">labels</td>
|
217
|
+
<td class="context-item-value"> [RW] </td>
|
218
|
+
<td class="context-item-desc">
|
219
|
+
An array of labels to use on the y axis. Make sure you have the right
|
220
|
+
number of labels. The size of this array should = the size of the data
|
221
|
+
array.
|
222
|
+
|
223
|
+
</td>
|
224
|
+
</tr>
|
225
|
+
</table>
|
226
|
+
</div>
|
227
|
+
</div>
|
228
|
+
|
229
|
+
|
230
|
+
|
231
|
+
<!-- if method_list -->
|
232
|
+
<div id="methods">
|
233
|
+
<h3 class="section-bar">Public Class methods</h3>
|
234
|
+
|
235
|
+
<div id="method-M000001" class="method-detail">
|
236
|
+
<a name="M000001"></a>
|
237
|
+
|
238
|
+
<div class="method-heading">
|
239
|
+
<a href="Lilygraph.src/M000001.html" target="Code" class="method-signature"
|
240
|
+
onclick="popupCode('Lilygraph.src/M000001.html');return false;">
|
241
|
+
<span class="method-name">new</span><span class="method-args">(options = {})</span>
|
242
|
+
</a>
|
243
|
+
</div>
|
244
|
+
|
245
|
+
<div class="method-description">
|
246
|
+
<p>
|
247
|
+
Returns a <a href="Lilygraph.html#M000001">new</a> graph creator with some
|
248
|
+
default options specified via a hash:
|
249
|
+
</p>
|
250
|
+
<table>
|
251
|
+
<tr><td valign="top">height:</td><td>String to use as height parameter on the svg tag. Default is
|
252
|
+
<tt>‘100%’</tt>.
|
253
|
+
|
254
|
+
</td></tr>
|
255
|
+
<tr><td valign="top">width:</td><td>String to use as width parameter on the svg tag. Default is
|
256
|
+
<tt>‘100%’</tt>.
|
257
|
+
|
258
|
+
</td></tr>
|
259
|
+
<tr><td valign="top">indent:</td><td>Indent option to the XmlMarkup object. Defaults to <tt>2</tt>.
|
260
|
+
|
261
|
+
</td></tr>
|
262
|
+
<tr><td valign="top">padding:</td><td>Number of svg units in between two bars. Defaults to <tt>14</tt>.
|
263
|
+
|
264
|
+
</td></tr>
|
265
|
+
<tr><td valign="top">bar_text:</td><td>(Boolean) Whether or not to include the text labels above every bar.
|
266
|
+
Defaults to <tt>true</tt>.
|
267
|
+
|
268
|
+
</td></tr>
|
269
|
+
<tr><td valign="top">viewbox:</td><td>Hash of <tt>:height</tt> and <tt>:width</tt> keys to use for the viewbox
|
270
|
+
parameter of the svg tag. Defaults to <tt>{:height => 600, :width =>
|
271
|
+
800}</tt>.
|
272
|
+
|
273
|
+
</td></tr>
|
274
|
+
<tr><td valign="top">margin:</td><td>Hash of margins to use for graph (in svg units). Defaults to <tt>{:top
|
275
|
+
=> 50, :left => 50, :right => 50, :bottom => 100}</tt>.
|
276
|
+
|
277
|
+
</td></tr>
|
278
|
+
</table>
|
279
|
+
<p>
|
280
|
+
For example, this creates a graph with a title and different indent
|
281
|
+
setting:
|
282
|
+
</p>
|
283
|
+
<pre>
|
284
|
+
graph = Lilygraph.new(:title => 'Testing a title', :indent => 4)
|
285
|
+
</pre>
|
286
|
+
</div>
|
287
|
+
</div>
|
288
|
+
|
289
|
+
<h3 class="section-bar">Public Instance methods</h3>
|
290
|
+
|
291
|
+
<div id="method-M000003" class="method-detail">
|
292
|
+
<a name="M000003"></a>
|
293
|
+
|
294
|
+
<div class="method-heading">
|
295
|
+
<a href="Lilygraph.src/M000003.html" target="Code" class="method-signature"
|
296
|
+
onclick="popupCode('Lilygraph.src/M000003.html');return false;">
|
297
|
+
<span class="method-name">render</span><span class="method-args">() {|xml, @options| ...}</span>
|
298
|
+
</a>
|
299
|
+
</div>
|
300
|
+
|
301
|
+
<div class="method-description">
|
302
|
+
<p>
|
303
|
+
This returns a string of the graph as an svg. You can pass in a block in
|
304
|
+
order to add your own items to the graph. Your block is passed the
|
305
|
+
XmlMarkup object to use as well as the options hash in case you need to use
|
306
|
+
some of that data.
|
307
|
+
</p>
|
308
|
+
<pre>
|
309
|
+
graph.render do |xml|
|
310
|
+
xml.text "Hello", :x => 5, :y => 25
|
311
|
+
end
|
312
|
+
</pre>
|
313
|
+
</div>
|
314
|
+
</div>
|
315
|
+
|
316
|
+
<div id="method-M000002" class="method-detail">
|
317
|
+
<a name="M000002"></a>
|
318
|
+
|
319
|
+
<div class="method-heading">
|
320
|
+
<a href="Lilygraph.src/M000002.html" target="Code" class="method-signature"
|
321
|
+
onclick="popupCode('Lilygraph.src/M000002.html');return false;">
|
322
|
+
<span class="method-name">update_options</span><span class="method-args">(options = {})</span>
|
323
|
+
</a>
|
324
|
+
</div>
|
325
|
+
|
326
|
+
<div class="method-description">
|
327
|
+
<p>
|
328
|
+
Updates the graph options with items from the passed in hash. Please refer
|
329
|
+
to <a href="Lilygraph.html#M000001">new</a> for a description of available
|
330
|
+
options.
|
331
|
+
</p>
|
332
|
+
</div>
|
333
|
+
</div>
|
334
|
+
|
335
|
+
|
336
|
+
</div>
|
337
|
+
|
338
|
+
|
339
|
+
</div>
|
340
|
+
|
341
|
+
|
342
|
+
<div id="validator-badges">
|
343
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
344
|
+
</div>
|
345
|
+
|
346
|
+
</body>
|
347
|
+
</html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>new (Lilygraph)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/lilygraph.rb, line 77</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span> = {})
|
15
|
+
<span class="ruby-ivar">@options</span> = <span class="ruby-constant">DEFAULT_OPTIONS</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">options</span>)
|
16
|
+
<span class="ruby-ivar">@data</span> = []
|
17
|
+
<span class="ruby-ivar">@labels</span> = []
|
18
|
+
|
19
|
+
<span class="ruby-ivar">@colors</span> = <span class="ruby-constant">Proc</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">data_index</span>, <span class="ruby-identifier">number_index</span>, <span class="ruby-identifier">data_size</span>, <span class="ruby-identifier">number_size</span><span class="ruby-operator">|</span>
|
20
|
+
<span class="ruby-constant">Color</span><span class="ruby-operator">::</span><span class="ruby-constant">HSL</span>.<span class="ruby-identifier">from_fraction</span>(<span class="ruby-constant">Float</span>(<span class="ruby-identifier">data_index</span>) <span class="ruby-operator">/</span> <span class="ruby-constant">Float</span>(<span class="ruby-identifier">data_size</span>), <span class="ruby-value">1.0</span>, <span class="ruby-value">0</span><span class="ruby-value">.4</span> <span class="ruby-operator">+</span> (<span class="ruby-constant">Float</span>(<span class="ruby-identifier">number_index</span>) <span class="ruby-operator">/</span> <span class="ruby-constant">Float</span>(<span class="ruby-identifier">number_size</span>) <span class="ruby-operator">*</span> <span class="ruby-value">0</span><span class="ruby-value">.4</span>)).<span class="ruby-identifier">to_rgb</span>.<span class="ruby-identifier">html</span>
|
21
|
+
<span class="ruby-keyword kw">end</span>
|
22
|
+
<span class="ruby-keyword kw">end</span></pre>
|
23
|
+
</body>
|
24
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>update_options (Lilygraph)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/lilygraph.rb, line 89</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">update_options</span>(<span class="ruby-identifier">options</span> = {})
|
15
|
+
<span class="ruby-ivar">@options</span> = <span class="ruby-ivar">@options</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">options</span>)
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
17
|
+
</body>
|
18
|
+
</html>
|
@@ -0,0 +1,133 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>render (Lilygraph)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/lilygraph.rb, line 101</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">render</span>
|
15
|
+
<span class="ruby-identifier">output</span> = <span class="ruby-value str">""</span>
|
16
|
+
<span class="ruby-identifier">xml</span> = <span class="ruby-constant">Builder</span><span class="ruby-operator">::</span><span class="ruby-constant">XmlMarkup</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">:target</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">output</span>, <span class="ruby-identifier">:indent</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:indent</span>])
|
17
|
+
|
18
|
+
<span class="ruby-comment cmt"># Output headers unless we specified otherwise</span>
|
19
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">instruct!</span>
|
20
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">declare!</span> <span class="ruby-identifier">:DOCTYPE</span>, <span class="ruby-identifier">:svg</span>, <span class="ruby-identifier">:PUBLIC</span>, <span class="ruby-value str">"-//W3C//DTD SVG 1.1//EN"</span>, <span class="ruby-value str">"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"</span>
|
21
|
+
|
22
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">svg</span>(<span class="ruby-identifier">:viewBox</span> =<span class="ruby-operator">></span> <span class="ruby-node">"0 0 #{@options[:viewbox][:width]} #{@options[:viewbox][:height]}"</span>,
|
23
|
+
<span class="ruby-identifier">:width</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:width</span>], <span class="ruby-identifier">:height</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:height</span>],
|
24
|
+
<span class="ruby-identifier">:xmlns</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'http://www.w3.org/2000/svg'</span>, <span class="ruby-identifier">:version</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'1.1'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">xml</span><span class="ruby-operator">|</span>
|
25
|
+
|
26
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">g</span>(<span class="ruby-identifier">:fill</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'black'</span>, <span class="ruby-identifier">:stroke</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'black'</span>, <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'2'</span>,
|
27
|
+
<span class="ruby-value str">'font-family'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'Helvetica, Arial, sans-serif'</span>, <span class="ruby-value str">'font-size'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'10px'</span>, <span class="ruby-value str">'font-weight'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'medium'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">xml</span><span class="ruby-operator">|</span>
|
28
|
+
|
29
|
+
<span class="ruby-comment cmt"># Outline</span>
|
30
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">rect</span>(<span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:left</span>], <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:top</span>],
|
31
|
+
<span class="ruby-identifier">:width</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">graph_width</span>,
|
32
|
+
<span class="ruby-identifier">:height</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">graph_height</span>,
|
33
|
+
<span class="ruby-identifier">:fill</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'lightgray'</span>)
|
34
|
+
|
35
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">g</span> <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'1'</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">xml</span><span class="ruby-operator">|</span>
|
36
|
+
|
37
|
+
<span class="ruby-comment cmt"># Title</span>
|
38
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span>(<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:title</span>], <span class="ruby-value str">'font-size'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'24px'</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:width</span>] <span class="ruby-operator">/</span> <span class="ruby-value">2.0</span>).<span class="ruby-identifier">round</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:subtitle</span>] <span class="ruby-operator">?</span> <span class="ruby-value">24</span> <span class="ruby-operator">:</span> <span class="ruby-value">32</span>), <span class="ruby-value str">'text-anchor'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'middle'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:title</span>]
|
39
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span>(<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:subtitle</span>], <span class="ruby-value str">'font-size'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'18px'</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:width</span>] <span class="ruby-operator">/</span> <span class="ruby-value">2.0</span>).<span class="ruby-identifier">round</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-value">34</span>, <span class="ruby-value str">'text-anchor'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'middle'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:subtitle</span>]
|
40
|
+
|
41
|
+
<span class="ruby-comment cmt"># Lines</span>
|
42
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">g</span> <span class="ruby-value str">'font-size'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'10px'</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">xml</span><span class="ruby-operator">|</span>
|
43
|
+
<span class="ruby-identifier">line_x1</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:left</span>] <span class="ruby-operator">+</span> <span class="ruby-value">1</span>
|
44
|
+
<span class="ruby-identifier">line_x2</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:width</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:right</span>] <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
|
45
|
+
|
46
|
+
<span class="ruby-identifier">text_x</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:left</span>] <span class="ruby-operator">-</span> <span class="ruby-value">25</span>
|
47
|
+
|
48
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span> <span class="ruby-value">0</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">text_x</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:height</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:bottom</span>] <span class="ruby-operator">+</span> <span class="ruby-value">4</span>), <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span><span class="ruby-value">.5</span>
|
49
|
+
|
50
|
+
<span class="ruby-value">1</span>.<span class="ruby-identifier">upto</span>((<span class="ruby-identifier">max</span> <span class="ruby-operator">/</span> <span class="ruby-value">10</span>) <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">line_number</span><span class="ruby-operator">|</span>
|
51
|
+
<span class="ruby-identifier">y</span> = (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:top</span>] <span class="ruby-operator">+</span> (<span class="ruby-identifier">line_number</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">dy</span>)).<span class="ruby-identifier">round</span>
|
52
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">line</span> <span class="ruby-identifier">:x1</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">line_x1</span>, <span class="ruby-identifier">:y1</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">y</span>, <span class="ruby-identifier">:x2</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">line_x2</span>, <span class="ruby-identifier">:y2</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">y</span>, <span class="ruby-identifier">:stroke</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'#666666'</span>
|
53
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span> <span class="ruby-identifier">max</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">line_number</span> <span class="ruby-operator">*</span> <span class="ruby-value">10</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">text_x</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">y</span> <span class="ruby-operator">+</span> <span class="ruby-value">4</span>, <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span><span class="ruby-value">.5</span>
|
54
|
+
|
55
|
+
<span class="ruby-comment cmt"># Smaller Line</span>
|
56
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">line</span>(<span class="ruby-identifier">:x1</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">line_x1</span>, <span class="ruby-identifier">:y1</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">y</span> <span class="ruby-operator">+</span> (<span class="ruby-value">0</span><span class="ruby-value">.5</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">dy</span>), <span class="ruby-identifier">:x2</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">line_x2</span>, <span class="ruby-identifier">:y2</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">y</span> <span class="ruby-operator">+</span> (<span class="ruby-value">0</span><span class="ruby-value">.5</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">dy</span>), <span class="ruby-identifier">:stroke</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'#999999'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">max</span> <span class="ruby-operator"><</span> <span class="ruby-value">55</span>
|
57
|
+
<span class="ruby-keyword kw">end</span>
|
58
|
+
|
59
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span> <span class="ruby-identifier">max</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">text_x</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:top</span>] <span class="ruby-operator">+</span> <span class="ruby-value">4</span>, <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span><span class="ruby-value">.5</span>
|
60
|
+
<span class="ruby-comment cmt"># Smaller Line</span>
|
61
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">line</span>(<span class="ruby-identifier">:x1</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">line_x1</span>, <span class="ruby-identifier">:y1</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:top</span>] <span class="ruby-operator">+</span> (<span class="ruby-value">0</span><span class="ruby-value">.5</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">dy</span>), <span class="ruby-identifier">:x2</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">line_x2</span>, <span class="ruby-identifier">:y2</span> =<span class="ruby-operator">></span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:top</span>] <span class="ruby-operator">+</span> (<span class="ruby-value">0</span><span class="ruby-value">.5</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">dy</span>), <span class="ruby-identifier">:stroke</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'#999999'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">max</span> <span class="ruby-operator"><</span> <span class="ruby-value">55</span>
|
62
|
+
<span class="ruby-keyword kw">end</span>
|
63
|
+
|
64
|
+
<span class="ruby-comment cmt"># Labels</span>
|
65
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">g</span> <span class="ruby-value str">'text-anchor'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'end'</span>, <span class="ruby-value str">'font-size'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'12px'</span>, <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span><span class="ruby-value">.3</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">xml</span><span class="ruby-operator">|</span>
|
66
|
+
<span class="ruby-ivar">@labels</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">label</span>, <span class="ruby-identifier">index</span><span class="ruby-operator">|</span>
|
67
|
+
<span class="ruby-identifier">x</span> = (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:left</span>] <span class="ruby-operator">+</span> (<span class="ruby-identifier">dx</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">index</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">dx</span> <span class="ruby-operator">/</span> <span class="ruby-value">2.0</span>)).<span class="ruby-identifier">round</span>
|
68
|
+
<span class="ruby-identifier">y</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:height</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:bottom</span>] <span class="ruby-operator">+</span> <span class="ruby-value">15</span>
|
69
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span> <span class="ruby-identifier">label</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">x</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">y</span>, <span class="ruby-identifier">:transform</span> =<span class="ruby-operator">></span> <span class="ruby-node">"rotate(-45 #{x} #{y})"</span>
|
70
|
+
<span class="ruby-keyword kw">end</span>
|
71
|
+
<span class="ruby-keyword kw">end</span>
|
72
|
+
|
73
|
+
<span class="ruby-comment cmt"># Bars</span>
|
74
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">g</span> <span class="ruby-value str">'font-size'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'8px'</span>, <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span><span class="ruby-value">.3</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">xml</span><span class="ruby-operator">|</span>
|
75
|
+
<span class="ruby-ivar">@data</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">data</span>, <span class="ruby-identifier">data_index</span><span class="ruby-operator">|</span>
|
76
|
+
<span class="ruby-identifier">data</span> = <span class="ruby-constant">Array</span>(<span class="ruby-identifier">data</span>)
|
77
|
+
<span class="ruby-identifier">width</span> = <span class="ruby-identifier">dx</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:padding</span>]
|
78
|
+
<span class="ruby-identifier">bar_width</span> = (<span class="ruby-identifier">width</span> <span class="ruby-operator">/</span> <span class="ruby-constant">Float</span>(<span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span>)).<span class="ruby-identifier">round</span>
|
79
|
+
|
80
|
+
<span class="ruby-identifier">x</span> = (<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:left</span>] <span class="ruby-operator">+</span> (<span class="ruby-identifier">dx</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">data_index</span>)).<span class="ruby-identifier">round</span>
|
81
|
+
|
82
|
+
<span class="ruby-comment cmt"># Rectangles</span>
|
83
|
+
<span class="ruby-identifier">data</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">number</span>, <span class="ruby-identifier">number_index</span><span class="ruby-operator">|</span>
|
84
|
+
<span class="ruby-identifier">color</span> = <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@colors</span>.<span class="ruby-identifier">respond_to?</span> <span class="ruby-identifier">:call</span>
|
85
|
+
<span class="ruby-ivar">@colors</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">data_index</span>, <span class="ruby-identifier">number_index</span>, <span class="ruby-ivar">@data</span>.<span class="ruby-identifier">size</span>, <span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span>)
|
86
|
+
<span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@colors</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Array</span>
|
87
|
+
<span class="ruby-identifier">first</span> = <span class="ruby-ivar">@colors</span>[<span class="ruby-identifier">data_index</span> <span class="ruby-operator">%</span> (<span class="ruby-ivar">@colors</span>.<span class="ruby-identifier">size</span>)]
|
88
|
+
|
89
|
+
<span class="ruby-keyword kw">if</span> <span class="ruby-identifier">first</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Array</span>
|
90
|
+
<span class="ruby-identifier">first</span>[<span class="ruby-identifier">number_index</span> <span class="ruby-operator">%</span> (<span class="ruby-identifier">first</span>.<span class="ruby-identifier">size</span>)]
|
91
|
+
<span class="ruby-keyword kw">else</span>
|
92
|
+
<span class="ruby-identifier">first</span>
|
93
|
+
<span class="ruby-keyword kw">end</span>
|
94
|
+
<span class="ruby-keyword kw">else</span>
|
95
|
+
<span class="ruby-ivar">@colors</span>
|
96
|
+
<span class="ruby-keyword kw">end</span>
|
97
|
+
|
98
|
+
<span class="ruby-identifier">height</span> = ((<span class="ruby-identifier">dy</span> <span class="ruby-operator">/</span> <span class="ruby-value">10.0</span>) <span class="ruby-operator">*</span> <span class="ruby-identifier">number</span>).<span class="ruby-identifier">round</span>
|
99
|
+
|
100
|
+
<span class="ruby-identifier">bar_x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">+</span> ((<span class="ruby-identifier">dx</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">width</span>) <span class="ruby-operator">/</span> <span class="ruby-value">2.0</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">number_index</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">bar_width</span>)).<span class="ruby-identifier">round</span>
|
101
|
+
<span class="ruby-identifier">bar_y</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:height</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:bottom</span>] <span class="ruby-operator">-</span> <span class="ruby-identifier">height</span>
|
102
|
+
|
103
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">rect</span> <span class="ruby-identifier">:fill</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">color</span>, <span class="ruby-identifier">:stroke</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">color</span>, <span class="ruby-value str">'stroke-width'</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">bar_x</span>, <span class="ruby-identifier">:width</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">bar_width</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">bar_y</span>, <span class="ruby-identifier">:height</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">height</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
|
104
|
+
<span class="ruby-keyword kw">end</span>
|
105
|
+
|
106
|
+
<span class="ruby-comment cmt"># Text</span>
|
107
|
+
<span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:bar_text</span>]
|
108
|
+
<span class="ruby-identifier">data</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">number</span>, <span class="ruby-identifier">number_index</span><span class="ruby-operator">|</span>
|
109
|
+
<span class="ruby-identifier">height</span> = ((<span class="ruby-identifier">dy</span> <span class="ruby-operator">/</span> <span class="ruby-value">10.0</span>) <span class="ruby-operator">*</span> <span class="ruby-identifier">number</span>).<span class="ruby-identifier">round</span>
|
110
|
+
|
111
|
+
<span class="ruby-identifier">bar_x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">+</span> ((<span class="ruby-identifier">dx</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">width</span>) <span class="ruby-operator">/</span> <span class="ruby-value">2.0</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">number_index</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">bar_width</span>)).<span class="ruby-identifier">round</span>
|
112
|
+
<span class="ruby-identifier">text_x</span> = (<span class="ruby-identifier">bar_x</span> <span class="ruby-operator">+</span> (<span class="ruby-identifier">bar_width</span> <span class="ruby-operator">/</span> <span class="ruby-value">2.0</span>)).<span class="ruby-identifier">round</span>
|
113
|
+
|
114
|
+
<span class="ruby-identifier">bar_y</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:viewbox</span>][<span class="ruby-identifier">:height</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:margin</span>][<span class="ruby-identifier">:bottom</span>] <span class="ruby-operator">-</span> <span class="ruby-identifier">height</span>
|
115
|
+
<span class="ruby-identifier">text_y</span> = <span class="ruby-identifier">bar_y</span> <span class="ruby-operator">-</span> <span class="ruby-value">3</span>
|
116
|
+
|
117
|
+
<span class="ruby-identifier">xml</span>.<span class="ruby-identifier">text</span> <span class="ruby-identifier">number</span>, <span class="ruby-identifier">:x</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">text_x</span>, <span class="ruby-identifier">:y</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">text_y</span>, <span class="ruby-value str">'text-anchor'</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'middle'</span>
|
118
|
+
<span class="ruby-keyword kw">end</span>
|
119
|
+
<span class="ruby-keyword kw">end</span>
|
120
|
+
<span class="ruby-keyword kw">end</span>
|
121
|
+
<span class="ruby-keyword kw">end</span>
|
122
|
+
|
123
|
+
<span class="ruby-comment cmt"># Yield in case they want to do some custom drawing and have a block ready</span>
|
124
|
+
<span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">xml</span>, <span class="ruby-ivar">@options</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
|
125
|
+
|
126
|
+
<span class="ruby-keyword kw">end</span>
|
127
|
+
<span class="ruby-keyword kw">end</span>
|
128
|
+
<span class="ruby-keyword kw">end</span>
|
129
|
+
|
130
|
+
<span class="ruby-identifier">output</span>
|
131
|
+
<span class="ruby-keyword kw">end</span></pre>
|
132
|
+
</body>
|
133
|
+
</html>
|
data/doc/created.rid
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Thu, 20 Aug 2009 16:27:09 -0400
|
@@ -0,0 +1,119 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>File: lilygraph.rb</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="fileHeader">
|
50
|
+
<h1>lilygraph.rb</h1>
|
51
|
+
<table class="header-table">
|
52
|
+
<tr class="top-aligned-row">
|
53
|
+
<td><strong>Path:</strong></td>
|
54
|
+
<td>lib/lilygraph.rb
|
55
|
+
</td>
|
56
|
+
</tr>
|
57
|
+
<tr class="top-aligned-row">
|
58
|
+
<td><strong>Last Update:</strong></td>
|
59
|
+
<td>Thu Aug 20 16:27:03 -0400 2009</td>
|
60
|
+
</tr>
|
61
|
+
</table>
|
62
|
+
</div>
|
63
|
+
<!-- banner header -->
|
64
|
+
|
65
|
+
<div id="bodyContent">
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
<div id="contextContent">
|
70
|
+
|
71
|
+
<div id="description">
|
72
|
+
<p>
|
73
|
+
This is the main graphing class used for generating svg graphs.
|
74
|
+
</p>
|
75
|
+
<table>
|
76
|
+
<tr><td valign="top">Author:</td><td>Christopher Giroir <kelsin@valefor.com>
|
77
|
+
|
78
|
+
</td></tr>
|
79
|
+
</table>
|
80
|
+
|
81
|
+
</div>
|
82
|
+
|
83
|
+
<div id="requires-list">
|
84
|
+
<h3 class="section-bar">Required files</h3>
|
85
|
+
|
86
|
+
<div class="name-list">
|
87
|
+
color
|
88
|
+
</div>
|
89
|
+
</div>
|
90
|
+
|
91
|
+
</div>
|
92
|
+
|
93
|
+
|
94
|
+
</div>
|
95
|
+
|
96
|
+
|
97
|
+
<!-- if includes -->
|
98
|
+
|
99
|
+
<div id="section">
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
<!-- if method_list -->
|
109
|
+
|
110
|
+
|
111
|
+
</div>
|
112
|
+
|
113
|
+
|
114
|
+
<div id="validator-badges">
|
115
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
116
|
+
</div>
|
117
|
+
|
118
|
+
</body>
|
119
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Classes
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Classes</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Classes</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="classes/Lilygraph.html">Lilygraph</a><br />
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Files
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Files</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Files</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="files/lib/lilygraph_rb.html">lib/lilygraph.rb</a><br />
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Methods
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Methods</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Methods</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="classes/Lilygraph.html#M000001">new (Lilygraph)</a><br />
|
24
|
+
<a href="classes/Lilygraph.html#M000003">render (Lilygraph)</a><br />
|
25
|
+
<a href="classes/Lilygraph.html#M000002">update_options (Lilygraph)</a><br />
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
</body>
|
29
|
+
</html>
|
data/doc/index.html
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
5
|
+
|
6
|
+
<!--
|
7
|
+
|
8
|
+
RDoc Documentation
|
9
|
+
|
10
|
+
-->
|
11
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
12
|
+
<head>
|
13
|
+
<title>RDoc Documentation</title>
|
14
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
15
|
+
</head>
|
16
|
+
<frameset rows="20%, 80%">
|
17
|
+
<frameset cols="25%,35%,45%">
|
18
|
+
<frame src="fr_file_index.html" title="Files" name="Files" />
|
19
|
+
<frame src="fr_class_index.html" name="Classes" />
|
20
|
+
<frame src="fr_method_index.html" name="Methods" />
|
21
|
+
</frameset>
|
22
|
+
<frame src="files/lib/lilygraph_rb.html" name="docwin" />
|
23
|
+
</frameset>
|
24
|
+
</html>
|
data/doc/rdoc-style.css
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
|
2
|
+
body {
|
3
|
+
font-family: Verdana,Arial,Helvetica,sans-serif;
|
4
|
+
font-size: 90%;
|
5
|
+
margin: 0;
|
6
|
+
margin-left: 40px;
|
7
|
+
padding: 0;
|
8
|
+
background: white;
|
9
|
+
}
|
10
|
+
|
11
|
+
h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
|
12
|
+
h1 { font-size: 150%; }
|
13
|
+
h2,h3,h4 { margin-top: 1em; }
|
14
|
+
|
15
|
+
a { background: #eef; color: #039; text-decoration: none; }
|
16
|
+
a:hover { background: #039; color: #eef; }
|
17
|
+
|
18
|
+
/* Override the base stylesheet's Anchor inside a table cell */
|
19
|
+
td > a {
|
20
|
+
background: transparent;
|
21
|
+
color: #039;
|
22
|
+
text-decoration: none;
|
23
|
+
}
|
24
|
+
|
25
|
+
/* and inside a section title */
|
26
|
+
.section-title > a {
|
27
|
+
background: transparent;
|
28
|
+
color: #eee;
|
29
|
+
text-decoration: none;
|
30
|
+
}
|
31
|
+
|
32
|
+
/* === Structural elements =================================== */
|
33
|
+
|
34
|
+
div#index {
|
35
|
+
margin: 0;
|
36
|
+
margin-left: -40px;
|
37
|
+
padding: 0;
|
38
|
+
font-size: 90%;
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
div#index a {
|
43
|
+
margin-left: 0.7em;
|
44
|
+
}
|
45
|
+
|
46
|
+
div#index .section-bar {
|
47
|
+
margin-left: 0px;
|
48
|
+
padding-left: 0.7em;
|
49
|
+
background: #ccc;
|
50
|
+
font-size: small;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
div#classHeader, div#fileHeader {
|
55
|
+
width: auto;
|
56
|
+
color: white;
|
57
|
+
padding: 0.5em 1.5em 0.5em 1.5em;
|
58
|
+
margin: 0;
|
59
|
+
margin-left: -40px;
|
60
|
+
border-bottom: 3px solid #006;
|
61
|
+
}
|
62
|
+
|
63
|
+
div#classHeader a, div#fileHeader a {
|
64
|
+
background: inherit;
|
65
|
+
color: white;
|
66
|
+
}
|
67
|
+
|
68
|
+
div#classHeader td, div#fileHeader td {
|
69
|
+
background: inherit;
|
70
|
+
color: white;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
div#fileHeader {
|
75
|
+
background: #057;
|
76
|
+
}
|
77
|
+
|
78
|
+
div#classHeader {
|
79
|
+
background: #048;
|
80
|
+
}
|
81
|
+
|
82
|
+
|
83
|
+
.class-name-in-header {
|
84
|
+
font-size: 180%;
|
85
|
+
font-weight: bold;
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
div#bodyContent {
|
90
|
+
padding: 0 1.5em 0 1.5em;
|
91
|
+
}
|
92
|
+
|
93
|
+
div#description {
|
94
|
+
padding: 0.5em 1.5em;
|
95
|
+
background: #efefef;
|
96
|
+
border: 1px dotted #999;
|
97
|
+
}
|
98
|
+
|
99
|
+
div#description h1,h2,h3,h4,h5,h6 {
|
100
|
+
color: #125;;
|
101
|
+
background: transparent;
|
102
|
+
}
|
103
|
+
|
104
|
+
div#validator-badges {
|
105
|
+
text-align: center;
|
106
|
+
}
|
107
|
+
div#validator-badges img { border: 0; }
|
108
|
+
|
109
|
+
div#copyright {
|
110
|
+
color: #333;
|
111
|
+
background: #efefef;
|
112
|
+
font: 0.75em sans-serif;
|
113
|
+
margin-top: 5em;
|
114
|
+
margin-bottom: 0;
|
115
|
+
padding: 0.5em 2em;
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
/* === Classes =================================== */
|
120
|
+
|
121
|
+
table.header-table {
|
122
|
+
color: white;
|
123
|
+
font-size: small;
|
124
|
+
}
|
125
|
+
|
126
|
+
.type-note {
|
127
|
+
font-size: small;
|
128
|
+
color: #DEDEDE;
|
129
|
+
}
|
130
|
+
|
131
|
+
.xxsection-bar {
|
132
|
+
background: #eee;
|
133
|
+
color: #333;
|
134
|
+
padding: 3px;
|
135
|
+
}
|
136
|
+
|
137
|
+
.section-bar {
|
138
|
+
color: #333;
|
139
|
+
border-bottom: 1px solid #999;
|
140
|
+
margin-left: -20px;
|
141
|
+
}
|
142
|
+
|
143
|
+
|
144
|
+
.section-title {
|
145
|
+
background: #79a;
|
146
|
+
color: #eee;
|
147
|
+
padding: 3px;
|
148
|
+
margin-top: 2em;
|
149
|
+
margin-left: -30px;
|
150
|
+
border: 1px solid #999;
|
151
|
+
}
|
152
|
+
|
153
|
+
.top-aligned-row { vertical-align: top }
|
154
|
+
.bottom-aligned-row { vertical-align: bottom }
|
155
|
+
|
156
|
+
/* --- Context section classes ----------------------- */
|
157
|
+
|
158
|
+
.context-row { }
|
159
|
+
.context-item-name { font-family: monospace; font-weight: bold; color: black; }
|
160
|
+
.context-item-value { font-size: small; color: #448; }
|
161
|
+
.context-item-desc { color: #333; padding-left: 2em; }
|
162
|
+
|
163
|
+
/* --- Method classes -------------------------- */
|
164
|
+
.method-detail {
|
165
|
+
background: #efefef;
|
166
|
+
padding: 0;
|
167
|
+
margin-top: 0.5em;
|
168
|
+
margin-bottom: 1em;
|
169
|
+
border: 1px dotted #ccc;
|
170
|
+
}
|
171
|
+
.method-heading {
|
172
|
+
color: black;
|
173
|
+
background: #ccc;
|
174
|
+
border-bottom: 1px solid #666;
|
175
|
+
padding: 0.2em 0.5em 0 0.5em;
|
176
|
+
}
|
177
|
+
.method-signature { color: black; background: inherit; }
|
178
|
+
.method-name { font-weight: bold; }
|
179
|
+
.method-args { font-style: italic; }
|
180
|
+
.method-description { padding: 0 0.5em 0 0.5em; }
|
181
|
+
|
182
|
+
/* --- Source code sections -------------------- */
|
183
|
+
|
184
|
+
a.source-toggle { font-size: 90%; }
|
185
|
+
div.method-source-code {
|
186
|
+
background: #262626;
|
187
|
+
color: #ffdead;
|
188
|
+
margin: 1em;
|
189
|
+
padding: 0.5em;
|
190
|
+
border: 1px dashed #999;
|
191
|
+
overflow: hidden;
|
192
|
+
}
|
193
|
+
|
194
|
+
div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
195
|
+
|
196
|
+
/* --- Ruby keyword styles --------------------- */
|
197
|
+
|
198
|
+
.standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
|
199
|
+
|
200
|
+
.ruby-constant { color: #7fffd4; background: transparent; }
|
201
|
+
.ruby-keyword { color: #00ffff; background: transparent; }
|
202
|
+
.ruby-ivar { color: #eedd82; background: transparent; }
|
203
|
+
.ruby-operator { color: #00ffee; background: transparent; }
|
204
|
+
.ruby-identifier { color: #ffdead; background: transparent; }
|
205
|
+
.ruby-node { color: #ffa07a; background: transparent; }
|
206
|
+
.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
|
207
|
+
.ruby-regexp { color: #ffa07a; background: transparent; }
|
208
|
+
.ruby-value { color: #7fffd4; background: transparent; }
|
data/lib/lilygraph.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
# This is the main graphing class used for generating svg graphs.
|
2
2
|
#
|
3
|
-
#
|
3
|
+
# Author:: Christopher Giroir <kelsin@valefor.com>
|
4
4
|
|
5
5
|
require 'color'
|
6
6
|
|
7
|
+
# This is the main class to use if you want to create a graph!
|
8
|
+
#
|
9
|
+
# graph = Lilygraph.new(:title => "My Awesome Graph")
|
10
|
+
# graph.data = [1,2,3]
|
11
|
+
# graph.labels = ['One','Two','Three']
|
12
|
+
# graph.render
|
13
|
+
#
|
14
|
+
# This class outputs svg as a string once you call render.
|
7
15
|
class Lilygraph
|
8
16
|
# Default options for the initializer
|
9
17
|
DEFAULT_OPTIONS = {
|
@@ -26,27 +34,58 @@ class Lilygraph
|
|
26
34
|
# This is the data for the graph. It should be an array where every item is
|
27
35
|
# either a number or an array of numbers.
|
28
36
|
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
# For a grouped bar graph:
|
37
|
+
# For a simple bar graph:
|
38
|
+
# graph.data=[1,2,3]
|
39
|
+
# For a grouped bar graph:
|
40
|
+
# graph.data=[[1,10],[2,20],[3,30]]
|
32
41
|
attr_accessor :data
|
42
|
+
|
43
|
+
# This allows you to set colors for the bars.
|
44
|
+
#
|
45
|
+
# If you just want a single color:
|
46
|
+
# graph.colors='#0000aa'
|
47
|
+
# If you want to make each bar (or bar group) different colors:
|
48
|
+
# graph.colors=['#aa0000','#00aa00','#0000aa']
|
49
|
+
# If you want every bar group to be the same, but each bar in the groups to have a different color
|
50
|
+
# graph.colors=[['#aa0000','#00aa00','#0000aa']]
|
51
|
+
# If you want to set every bar group color:
|
52
|
+
# graph.colors=[['#aa0000','#00aa00','#0000aa'],['#bb0000','#00bb00','#0000bb']]
|
53
|
+
# Last but not least you can set the color value to any object that responds to call (like a Proc). The proc takes four arguments.
|
54
|
+
# data_index: The index of the current bar (or group)
|
55
|
+
# number_index: The index of the current bar INSIDE of the current bar group (always 0 if you don't have grouped bars)
|
56
|
+
# data_size: total number of bar or groups.
|
57
|
+
# number_size: total number of bars in the current group (always 1 if you don't have bar groups)
|
58
|
+
#
|
59
|
+
# The default proc looks like:
|
60
|
+
# graph.colors=Proc.new do |data_index, number_index, data_size, number_size|
|
61
|
+
# Color::HSL.from_fraction(Float(data_index) / Float(data_size), 1.0, 0.4 + (Float(number_index) / Float(number_size) * 0.4)).to_rgb.html
|
62
|
+
# end
|
63
|
+
attr_accessor :colors
|
33
64
|
|
34
|
-
# Returns a new graph creator with some default options
|
65
|
+
# Returns a new graph creator with some default options specified via a hash:
|
66
|
+
# height:: String to use as height parameter on the svg tag. Default is <tt>'100%'</tt>.
|
67
|
+
# width:: String to use as width parameter on the svg tag. Default is <tt>'100%'</tt>.
|
68
|
+
# indent:: Indent option to the XmlMarkup object. Defaults to <tt>2</tt>.
|
69
|
+
# padding:: Number of svg units in between two bars. Defaults to <tt>14</tt>.
|
70
|
+
# bar_text:: (Boolean) Whether or not to include the text labels above every bar. Defaults to +true+.
|
71
|
+
# viewbox:: Hash of <tt>:height</tt> and <tt>:width</tt> keys to use for the viewbox parameter of the svg tag. Defaults to <tt>{:height => 600, :width => 800}</tt>.
|
72
|
+
# margin:: Hash of margins to use for graph (in svg units). Defaults to <tt>{:top => 50, :left => 50, :right => 50, :bottom => 100}</tt>.
|
35
73
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# :
|
39
|
-
# :indent - Indent option to the XmlMarkup object. Defaults to 2.
|
40
|
-
# :padding - Number of svg units in between two bars.
|
41
|
-
# :viewbox - Hash of :height and :width keys to use for the viewbox parameter of the svg tag. Defaults to { :height => 600, :width => 800 }.
|
42
|
-
# :margin - Hash of margins to use for graph (in svg units). Defaults to { :top => 50, :left => 50, :right => 50, :bottom => 100 }.
|
74
|
+
# For example, this creates a graph with a title and different indent setting:
|
75
|
+
#
|
76
|
+
# graph = Lilygraph.new(:title => 'Testing a title', :indent => 4)
|
43
77
|
def initialize(options = {})
|
44
78
|
@options = DEFAULT_OPTIONS.merge(options)
|
45
79
|
@data = []
|
46
80
|
@labels = []
|
81
|
+
|
82
|
+
@colors = Proc.new do |data_index, number_index, data_size, number_size|
|
83
|
+
Color::HSL.from_fraction(Float(data_index) / Float(data_size), 1.0, 0.4 + (Float(number_index) / Float(number_size) * 0.4)).to_rgb.html
|
84
|
+
end
|
47
85
|
end
|
48
86
|
|
49
|
-
# Updates the graph options with items from the passed in hash
|
87
|
+
# Updates the graph options with items from the passed in hash. Please refer
|
88
|
+
# to new for a description of available options.
|
50
89
|
def update_options(options = {})
|
51
90
|
@options = @options.merge(options)
|
52
91
|
end
|
@@ -55,6 +94,10 @@ class Lilygraph
|
|
55
94
|
# order to add your own items to the graph. Your block is passed the XmlMarkup
|
56
95
|
# object to use as well as the options hash in case you need to use some of
|
57
96
|
# that data.
|
97
|
+
#
|
98
|
+
# graph.render do |xml|
|
99
|
+
# xml.text "Hello", :x => 5, :y => 25
|
100
|
+
# end
|
58
101
|
def render
|
59
102
|
output = ""
|
60
103
|
xml = Builder::XmlMarkup.new(:target => output, :indent => @options[:indent])
|
@@ -125,13 +168,26 @@ class Lilygraph
|
|
125
168
|
|
126
169
|
# Rectangles
|
127
170
|
data.each_with_index do |number, number_index|
|
128
|
-
color =
|
171
|
+
color = if @colors.respond_to? :call
|
172
|
+
@colors.call(data_index, number_index, @data.size, data.size)
|
173
|
+
elsif @colors.class == Array
|
174
|
+
first = @colors[data_index % (@colors.size)]
|
175
|
+
|
176
|
+
if first.class == Array
|
177
|
+
first[number_index % (first.size)]
|
178
|
+
else
|
179
|
+
first
|
180
|
+
end
|
181
|
+
else
|
182
|
+
@colors
|
183
|
+
end
|
184
|
+
|
129
185
|
height = ((dy / 10.0) * number).round
|
130
186
|
|
131
187
|
bar_x = (x + ((dx - width) / 2.0) + (number_index * bar_width)).round
|
132
188
|
bar_y = @options[:viewbox][:height] - @options[:margin][:bottom] - height
|
133
189
|
|
134
|
-
xml.rect :fill => color
|
190
|
+
xml.rect :fill => color, :stroke => color, 'stroke-width' => 0, :x => bar_x, :width => bar_width, :y => bar_y, :height => height - 1
|
135
191
|
end
|
136
192
|
|
137
193
|
# Text
|
@@ -152,7 +208,7 @@ class Lilygraph
|
|
152
208
|
end
|
153
209
|
|
154
210
|
# Yield in case they want to do some custom drawing and have a block ready
|
155
|
-
yield
|
211
|
+
yield(xml, @options) if block_given?
|
156
212
|
|
157
213
|
end
|
158
214
|
end
|
data/lilygraph.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{lilygraph}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Christopher Giroir"]
|
12
|
-
s.date = %q{2009-08-
|
12
|
+
s.date = %q{2009-08-20}
|
13
13
|
s.description = %q{Lilygraph is a Ruby library for creating svg charts and graphs based on XmlBuilder.}
|
14
14
|
s.email = %q{kelsin@valefor.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -22,6 +22,17 @@ Gem::Specification.new do |s|
|
|
22
22
|
"README",
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
|
+
"doc/classes/Lilygraph.html",
|
26
|
+
"doc/classes/Lilygraph.src/M000001.html",
|
27
|
+
"doc/classes/Lilygraph.src/M000002.html",
|
28
|
+
"doc/classes/Lilygraph.src/M000003.html",
|
29
|
+
"doc/created.rid",
|
30
|
+
"doc/files/lib/lilygraph_rb.html",
|
31
|
+
"doc/fr_class_index.html",
|
32
|
+
"doc/fr_file_index.html",
|
33
|
+
"doc/fr_method_index.html",
|
34
|
+
"doc/index.html",
|
35
|
+
"doc/rdoc-style.css",
|
25
36
|
"lib/lilygraph.rb",
|
26
37
|
"lilygraph.gemspec"
|
27
38
|
]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Kelsin-lilygraph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Giroir
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08-
|
12
|
+
date: 2009-08-20 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -37,6 +37,17 @@ files:
|
|
37
37
|
- README
|
38
38
|
- Rakefile
|
39
39
|
- VERSION
|
40
|
+
- doc/classes/Lilygraph.html
|
41
|
+
- doc/classes/Lilygraph.src/M000001.html
|
42
|
+
- doc/classes/Lilygraph.src/M000002.html
|
43
|
+
- doc/classes/Lilygraph.src/M000003.html
|
44
|
+
- doc/created.rid
|
45
|
+
- doc/files/lib/lilygraph_rb.html
|
46
|
+
- doc/fr_class_index.html
|
47
|
+
- doc/fr_file_index.html
|
48
|
+
- doc/fr_method_index.html
|
49
|
+
- doc/index.html
|
50
|
+
- doc/rdoc-style.css
|
40
51
|
- lib/lilygraph.rb
|
41
52
|
- lilygraph.gemspec
|
42
53
|
has_rdoc: false
|