rubyvis 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +1 -3
- data/History.txt +9 -1
- data/Manifest.txt +5 -0
- data/README.txt +34 -6
- data/examples/antibiotics/antibiotics.rb +11 -11
- data/examples/barley/barley.rb +5 -5
- data/examples/grouped_charts.rb +67 -0
- data/examples/line_and_step.rb +61 -0
- data/examples/stacked_charts.rb +50 -0
- data/examples/third.rb +10 -6
- data/lib/rubyvis.rb +3 -1
- data/lib/rubyvis/layout.rb +25 -0
- data/lib/rubyvis/layout/stack.rb +228 -0
- data/lib/rubyvis/mark.rb +34 -33
- data/lib/rubyvis/mark/area.rb +3 -2
- data/lib/rubyvis/mark/bar.rb +4 -1
- data/lib/rubyvis/mark/dot.rb +18 -18
- data/lib/rubyvis/mark/label.rb +1 -1
- data/lib/rubyvis/mark/line.rb +2 -1
- data/lib/rubyvis/mark/panel.rb +5 -5
- data/lib/rubyvis/mark/wedge.rb +2 -1
- data/lib/rubyvis/nest.rb +5 -6
- data/lib/rubyvis/scale/log.rb +15 -9
- data/lib/rubyvis/scene/svg_area.rb +8 -8
- data/lib/rubyvis/scene/svg_line.rb +4 -4
- data/lib/rubyvis/sceneelement.rb +1 -1
- data/spec/scale_log_spec.rb +105 -0
- data/spec/spec.opts +2 -1
- metadata +9 -3
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
data/History.txt
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
=== 0.1.
|
1
|
+
=== 0.1.4 / 2010-10-20
|
2
|
+
|
3
|
+
* Bug fix: Order now works on Nest
|
4
|
+
* Added log scale spec. domain, range, scale, invert and ticks works like javascript version
|
5
|
+
* First stack layout version operational
|
6
|
+
* Added grouped and stacked chart examples
|
7
|
+
|
8
|
+
|
9
|
+
=== 0.1.3 / 2010-10-08
|
2
10
|
|
3
11
|
* New Wedge and Dot mark
|
4
12
|
* New Log scale and Nest.
|
data/Manifest.txt
CHANGED
@@ -13,10 +13,13 @@ examples/crimea/crimea_grouped_bar.rb
|
|
13
13
|
examples/crimea/crimea_line.rb
|
14
14
|
examples/dot.rb
|
15
15
|
examples/first.rb
|
16
|
+
examples/grouped_charts.rb
|
16
17
|
examples/line.rb
|
18
|
+
examples/line_and_step.rb
|
17
19
|
examples/pie_and_donut.rb
|
18
20
|
examples/scatterplot.rb
|
19
21
|
examples/second.rb
|
22
|
+
examples/stacked_charts.rb
|
20
23
|
examples/third.rb
|
21
24
|
lib/rubyvis.rb
|
22
25
|
lib/rubyvis/color/color.rb
|
@@ -28,6 +31,8 @@ lib/rubyvis/format/number.rb
|
|
28
31
|
lib/rubyvis/internals.rb
|
29
32
|
lib/rubyvis/javascript_behaviour.rb
|
30
33
|
lib/rubyvis/label.rb
|
34
|
+
lib/rubyvis/layout.rb
|
35
|
+
lib/rubyvis/layout/stack.rb
|
31
36
|
lib/rubyvis/mark.rb
|
32
37
|
lib/rubyvis/mark/anchor.rb
|
33
38
|
lib/rubyvis/mark/area.rb
|
data/README.txt
CHANGED
@@ -8,13 +8,34 @@ Ruby port of Protovis, a great visualization toolkit
|
|
8
8
|
|
9
9
|
== FEATURES/PROBLEMS:
|
10
10
|
|
11
|
-
Implemented:
|
12
|
-
|
11
|
+
Implemented: All marks, except transient, image and transition.
|
12
|
+
|
13
|
+
Basic protovis examples[http://vis.stanford.edu/protovis/ex/] works exactly like ruby ones with minor sintactic modifications:
|
14
|
+
* Area Charts: Ok
|
15
|
+
* Bar & Column Charts: Ok
|
16
|
+
* Scatterplots: Ok
|
17
|
+
* Pie & Donut: Interaction with mouse not implemented
|
18
|
+
* Line & Step Charts: Ok
|
19
|
+
* Stacked Charts: Ok
|
20
|
+
* Grouped Charts: Almost ok. Problems on data stack at third level.
|
21
|
+
|
22
|
+
Complex examples requires more works:
|
23
|
+
|
24
|
+
* antibiotics: Almost ok. Missing center labels
|
25
|
+
* barley: ok
|
26
|
+
* crimea: line and grouped line ok.
|
27
|
+
|
28
|
+
|
29
|
+
I try to maintain, when posible, complete compatibility with Javascript API, including camel case naming of functions. Johnson [http://github.com/jbarnette/johnson] - the lovely Javascript wrapper inside Ruby embrace - is our friend.
|
13
30
|
|
14
31
|
Until version 0.1.0, lambdas should always should created explicitly for method you may be temted to call it with a block.
|
32
|
+
|
15
33
|
On a second stage, traditional block calling could be using maintaining backwards compatibily with Javascript API,
|
34
|
+
|
16
35
|
User could use +pv+ freely, cause is defined as a global method which call Rubyvis.
|
17
36
|
|
37
|
+
+self.parent.index+ doesn't work always as expected. +self.index+ works ok. I'm working on it
|
38
|
+
|
18
39
|
== CURRENT PROGRESS
|
19
40
|
|
20
41
|
* pv.js
|
@@ -25,14 +46,20 @@ User could use +pv+ freely, cause is defined as a global method which call Rubyv
|
|
25
46
|
* data/Numbers.js
|
26
47
|
* data/Scale.js
|
27
48
|
* data/LinearScale.js
|
49
|
+
* data/LogScale.js (incomplete)
|
50
|
+
* data/Nest.js
|
28
51
|
* data/QuantitativeScale.js
|
29
|
-
* data/OrdinalScale.js
|
30
|
-
* mark/
|
52
|
+
* data/OrdinalScale.js
|
53
|
+
* mark/Anchor.js
|
54
|
+
* mark/Area.js
|
31
55
|
* mark/Bar.js
|
32
|
-
* mark/
|
56
|
+
* mark/Dot.js
|
33
57
|
* mark/Label.js
|
34
58
|
* mark/Line.js
|
59
|
+
* mark/Mark.js
|
60
|
+
* mark/Panel.js
|
35
61
|
* mark/Rule.js
|
62
|
+
* mark/Wedge.js
|
36
63
|
* scene/SvgBar.js
|
37
64
|
* scene/SvgLabel.js
|
38
65
|
* scene/SvgLine.js
|
@@ -55,7 +82,8 @@ User could use +pv+ freely, cause is defined as a global method which call Rubyv
|
|
55
82
|
vis.render
|
56
83
|
puts vis.to_svg
|
57
84
|
|
58
|
-
|
85
|
+
See examples directory for original protovis examples adaptations.
|
86
|
+
|
59
87
|
== REQUIREMENTS:
|
60
88
|
|
61
89
|
Ruby 1.8.7 or 1.9.1
|
@@ -5,8 +5,8 @@ load(File.dirname(__FILE__)+"/antibiotics_data.rb")
|
|
5
5
|
s = 180
|
6
6
|
_p = 20
|
7
7
|
z = pv.Scale.log(0.001, 1000).range(0, s)
|
8
|
-
color = pv.colors("darkred", "darkblue")
|
9
|
-
ticks = pv.range(-2, 3).map {|e| 10**e}
|
8
|
+
color = pv.colors("darkred", "darkblue")
|
9
|
+
ticks = pv.range(-2, 3).map {|e| (10**e).to_f}
|
10
10
|
|
11
11
|
#/* Root panel. */
|
12
12
|
vis = Rubyvis::Panel.new
|
@@ -29,7 +29,7 @@ cell = vis.add(pv.Panel)
|
|
29
29
|
|
30
30
|
#/* Label. */
|
31
31
|
cell.anchor("center").add(pv.Label)
|
32
|
-
.visible(lambda {|d, y, x| x == y})
|
32
|
+
.visible(lambda {|d, y, x| puts d,y,x; return x == y})
|
33
33
|
.font("bold 14px sans-serif")
|
34
34
|
.text(lambda {|d, y, x| x});
|
35
35
|
|
@@ -37,18 +37,18 @@ cell.anchor("center").add(pv.Label)
|
|
37
37
|
plot = cell.add(pv.Panel)
|
38
38
|
.data(lambda {|y, x| [x]})
|
39
39
|
.visible(lambda {|x, y| x != y})
|
40
|
-
.stroke_style(
|
40
|
+
.stroke_style("#aaa");
|
41
41
|
|
42
42
|
#/* Ticks. */
|
43
43
|
tick = pv.Rule.new()
|
44
44
|
.visible(lambda {|d, x, y| x != y})
|
45
45
|
.data(ticks)
|
46
|
-
.stroke_style(
|
46
|
+
.stroke_style("#ddd");
|
47
47
|
|
48
48
|
#/* X-axis ticks. */
|
49
49
|
xtick = plot.add(pv.Rule)
|
50
50
|
.extend(tick)
|
51
|
-
.left(
|
51
|
+
.left(z);
|
52
52
|
|
53
53
|
#/* Bottom and top labels. */
|
54
54
|
xtick.anchor("bottom").add(pv.Label)
|
@@ -59,7 +59,7 @@ xtick.anchor("top").add(pv.Label)
|
|
59
59
|
#/* Y-axis ticks. */
|
60
60
|
ytick = plot.add(pv.Rule)
|
61
61
|
.extend(tick)
|
62
|
-
.bottom(
|
62
|
+
.bottom(z);
|
63
63
|
|
64
64
|
#/* Bottom and top labels. */
|
65
65
|
ytick.anchor("right").add(pv.Label)
|
@@ -76,10 +76,10 @@ ytick.anchor("left").add(pv.Label)
|
|
76
76
|
#/* Dot plot. */
|
77
77
|
dot = plot.add(pv.Dot)
|
78
78
|
.data($bacteria)
|
79
|
-
.stroke_style(
|
80
|
-
.fill_style(lambda {
|
81
|
-
.left(lambda {|d, x, y|
|
82
|
-
.bottom(lambda {|d, x, y| z.scale(d[y])})
|
79
|
+
.stroke_style(lambda {|d| color.scale(d[:gram])})
|
80
|
+
.fill_style(lambda {|d| color.scale(d[:gram]).alpha(0.2)})
|
81
|
+
.left(lambda {|d, x, y| z.scale(d[x.to_sym])})
|
82
|
+
.bottom(lambda {|d, x, y| z.scale(d[y.to_sym])})
|
83
83
|
.title(lambda {|d| d[:name]});
|
84
84
|
|
85
85
|
#/* Legend. */
|
data/examples/barley/barley.rb
CHANGED
@@ -27,7 +27,7 @@ c = pv.Colors.category10()
|
|
27
27
|
# The root panel. */
|
28
28
|
vis = Rubyvis::Panel.new
|
29
29
|
.width(w)
|
30
|
-
.height(h * pv.keys(site).
|
30
|
+
.height(h * pv.keys(site).size)
|
31
31
|
.top(15.5)
|
32
32
|
.left(0.5)
|
33
33
|
.right(0.5)
|
@@ -44,7 +44,7 @@ cell = vis.add(pv.Panel)
|
|
44
44
|
# Title bar. */
|
45
45
|
cell.add(pv.Bar)
|
46
46
|
.height(14)
|
47
|
-
.fill_style(
|
47
|
+
.fill_style("bisque")
|
48
48
|
.anchor("center").add(pv.Label)
|
49
49
|
.text(lambda{|site| site.key});
|
50
50
|
|
@@ -62,17 +62,17 @@ dot = cell.add(pv.Panel)
|
|
62
62
|
|
63
63
|
# A label showing the variety. */
|
64
64
|
dot.anchor("left").add(pv.Label)
|
65
|
-
.visible(lambda {
|
65
|
+
.visible(lambda { self.parent.index!=0})
|
66
66
|
.left(-2)
|
67
67
|
.text(lambda {|d| d[:variety]})
|
68
68
|
|
69
69
|
# X-ticks. */
|
70
70
|
vis.add(pv.Rule)
|
71
71
|
.data(x.ticks())
|
72
|
-
.left(lambda {|d| x.scale(d)})
|
72
|
+
.left(lambda {|d| 90+x.scale(d)})
|
73
73
|
.bottom(-5)
|
74
74
|
.height(5)
|
75
|
-
.stroke_style(
|
75
|
+
.stroke_style("#999")
|
76
76
|
.anchor("bottom").add(pv.Label);
|
77
77
|
|
78
78
|
# A legend showing the year. */
|
@@ -0,0 +1,67 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
|
4
|
+
n = 3
|
5
|
+
m = 4
|
6
|
+
data = pv.range(n).map {
|
7
|
+
pv.range(m).map {
|
8
|
+
rand() + 0.1;
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
|
13
|
+
w = 400
|
14
|
+
h = 250
|
15
|
+
x = pv.Scale.linear(0, 1.1).range(0, w)
|
16
|
+
y = pv.Scale.ordinal(pv.range(n)).split_banded(0, h, 4/5.0);
|
17
|
+
|
18
|
+
#/* The root panel. */
|
19
|
+
vis = pv.Panel.new()
|
20
|
+
.width(w)
|
21
|
+
.height(h)
|
22
|
+
.bottom(20)
|
23
|
+
.left(20)
|
24
|
+
.right(10)
|
25
|
+
.top(5);
|
26
|
+
|
27
|
+
#/* The bars. */
|
28
|
+
|
29
|
+
colors=pv.Colors.category20()
|
30
|
+
|
31
|
+
bar = vis.add(pv.Panel)
|
32
|
+
.data(data)
|
33
|
+
.top(lambda {y.scale(self.index)})
|
34
|
+
.height(y.range_band)
|
35
|
+
.add(pv.Bar)
|
36
|
+
.data(lambda {|d| d})
|
37
|
+
.top(lambda {self.index * y.range_band / m.to_f})
|
38
|
+
.height(y.range_band / m.to_f)
|
39
|
+
.left(0)
|
40
|
+
.width(x)
|
41
|
+
.fillStyle(lambda { colors.scale(self.index)})
|
42
|
+
|
43
|
+
#/* The value label. */
|
44
|
+
bar.anchor("right").add(pv.Label)
|
45
|
+
.textStyle("white")
|
46
|
+
.text(lambda {|d| "%0.1f" % d});
|
47
|
+
|
48
|
+
#/* The variable label. */
|
49
|
+
bar.parent.anchor("left").add(pv.Label)
|
50
|
+
.textAlign("right")
|
51
|
+
.textMargin(5)
|
52
|
+
.text(lambda {"ABCDEFGHIJK"[self.parent.index,1]});
|
53
|
+
|
54
|
+
#/* X-axis ticks. */
|
55
|
+
vis.add(pv.Rule)
|
56
|
+
.data(x.ticks(5))
|
57
|
+
.left(x)
|
58
|
+
.strokeStyle(lambda {|d| d!=0 ? "rgba(255,255,255,.3)" : "#000"})
|
59
|
+
.add(pv.Rule)
|
60
|
+
.bottom(0)
|
61
|
+
.height(5)
|
62
|
+
.strokeStyle("#000")
|
63
|
+
.anchor("bottom").add(pv.Label)
|
64
|
+
.text(x.tick_format);
|
65
|
+
|
66
|
+
vis.render();
|
67
|
+
puts vis.to_svg
|
@@ -0,0 +1,61 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
|
4
|
+
data = pv.range(0, 10, 0.2).map {|x|
|
5
|
+
OpenStruct.new({:x=> x, :y=> Math.sin(x) + rand() + 1.5})
|
6
|
+
}
|
7
|
+
|
8
|
+
|
9
|
+
vis = pv.Panel.new().width(200).height(200);
|
10
|
+
|
11
|
+
|
12
|
+
w = 400
|
13
|
+
h = 200
|
14
|
+
x = pv.Scale.linear(data, lambda {|d| d.x}).range(0, w)
|
15
|
+
|
16
|
+
y = pv.Scale.linear(0, 4).range(0, h);
|
17
|
+
|
18
|
+
#/* The root panel. */
|
19
|
+
vis = pv.Panel.new()
|
20
|
+
.width(w)
|
21
|
+
.height(h)
|
22
|
+
.bottom(20)
|
23
|
+
.left(20)
|
24
|
+
.right(10)
|
25
|
+
.top(5);
|
26
|
+
|
27
|
+
#/* X-axis ticks. */
|
28
|
+
vis.add(pv.Rule)
|
29
|
+
.data(x.ticks())
|
30
|
+
.visible(lambda {|d| d > 0})
|
31
|
+
.left(x)
|
32
|
+
.strokeStyle("#eee")
|
33
|
+
.add(pv.Rule)
|
34
|
+
.bottom(-5)
|
35
|
+
.height(5)
|
36
|
+
.strokeStyle("#000")
|
37
|
+
.anchor("bottom").add(pv.Label)
|
38
|
+
.text(x.tick_format)
|
39
|
+
|
40
|
+
#/* Y-axis ticks. */
|
41
|
+
vis.add(pv.Rule)
|
42
|
+
.data(y.ticks(5))
|
43
|
+
.bottom(y)
|
44
|
+
.strokeStyle(lambda {|d| d!=0 ? "#eee" : "#000"})
|
45
|
+
.anchor("left").add(pv.Label)
|
46
|
+
.text(y.tick_format);
|
47
|
+
|
48
|
+
#/* The line. */
|
49
|
+
vis.add(pv.Line)
|
50
|
+
.data(data)
|
51
|
+
.interpolate("step-after")
|
52
|
+
.left(lambda {|d| x.scale(d.x)})
|
53
|
+
.bottom(lambda {|d| y.scale(d.y)})
|
54
|
+
.lineWidth(3);
|
55
|
+
|
56
|
+
vis.render();
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
puts vis.to_svg
|
@@ -0,0 +1,50 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
|
4
|
+
data = pv.range(4).map {|i|
|
5
|
+
pv.range(0, 10, 1).map {|x|
|
6
|
+
OpenStruct.new({:x=> x, :y=> Math.sin(x) + rand() * 0.5 + 2})
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
w = 400
|
11
|
+
h = 200
|
12
|
+
|
13
|
+
x = pv.Scale.linear(0, 9.9).range(0, w)
|
14
|
+
y = pv.Scale.linear(0, 14).range(0, h)
|
15
|
+
|
16
|
+
#/* The root panel. */
|
17
|
+
vis = pv.Panel.new()
|
18
|
+
.width(w)
|
19
|
+
.height(h)
|
20
|
+
.bottom(20)
|
21
|
+
.left(20)
|
22
|
+
.right(10)
|
23
|
+
.top(5)
|
24
|
+
if(true)
|
25
|
+
#/* X-axis and ticks. */
|
26
|
+
vis.add(pv.Rule)
|
27
|
+
.data(x.ticks())
|
28
|
+
.visible(lambda {|d| d!=0})
|
29
|
+
.left(x)
|
30
|
+
.bottom(-5)
|
31
|
+
.height(5)
|
32
|
+
.anchor("bottom").add(pv.Label)
|
33
|
+
.text(x.tick_format)
|
34
|
+
#/* Y-axis and ticks. */
|
35
|
+
vis.add(pv.Rule)
|
36
|
+
.data(y.ticks(3))
|
37
|
+
.bottom(y)
|
38
|
+
.strokeStyle(lambda {|d| d!=0 ? "rgba(128,128,128,.2)" : "#000"})
|
39
|
+
.anchor("left").add(pv.Label)
|
40
|
+
.text(y.tick_format)
|
41
|
+
end
|
42
|
+
#/* The stack layout. */
|
43
|
+
vis.add(pv.Layout.Stack)
|
44
|
+
.layers(data)
|
45
|
+
.x(lambda {|d| x.scale(d.x)})
|
46
|
+
.y(lambda {|d| y.scale(d.y)})
|
47
|
+
.layer.add(pv.Area)
|
48
|
+
|
49
|
+
vis.render();
|
50
|
+
puts vis.to_svg
|
data/examples/third.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
2
|
require 'rubyvis'
|
3
3
|
|
4
|
-
vis = pv.Panel.new().width(
|
4
|
+
vis = pv.Panel.new().width(200).height(150);
|
5
5
|
|
6
|
-
vis.add(pv.Panel).data([
|
7
|
-
.data([
|
6
|
+
bar= vis.add(pv.Panel).data(["a","b"]).add(pv.Bar)
|
7
|
+
.data([1,2])
|
8
8
|
.width(20)
|
9
|
-
.height(
|
9
|
+
.height(60)
|
10
10
|
.bottom(0)
|
11
|
-
.left(lambda {|d,t|
|
11
|
+
.left(lambda {|d,t| self.parent.index*60+self.index*30})
|
12
|
+
|
13
|
+
|
14
|
+
bar.anchor("bottom").add(pv.Label).text(lambda {|d,t| "#{t}-#{d}"})
|
15
|
+
bar.anchor("top").add(pv.Label).text(lambda {"#{self.parent.index}-#{index}"})
|
16
|
+
|
12
17
|
|
13
|
-
|
14
18
|
vis.render()
|
15
19
|
#puts vis.children_inspect
|
16
20
|
puts vis.to_svg
|
data/lib/rubyvis.rb
CHANGED
@@ -17,6 +17,8 @@ require 'rubyvis/scale'
|
|
17
17
|
require 'rubyvis/color/color'
|
18
18
|
require 'rubyvis/color/colors'
|
19
19
|
|
20
|
+
require 'rubyvis/layout'
|
21
|
+
|
20
22
|
require 'rubyvis/scene/svg_scene'
|
21
23
|
require 'rubyvis/transform'
|
22
24
|
|
@@ -26,7 +28,7 @@ end
|
|
26
28
|
|
27
29
|
module Rubyvis
|
28
30
|
@document=nil
|
29
|
-
VERSION = '0.1.
|
31
|
+
VERSION = '0.1.4'
|
30
32
|
API_VERSION='3.3'
|
31
33
|
Infinity=1.0 / 0 # You actually can do it! http://snipplr.com/view/2137/uses-for-infinity-in-ruby/
|
32
34
|
# :section: basic methods
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rubyvis
|
2
|
+
def self.Layout
|
3
|
+
Rubyvis::Layout
|
4
|
+
end
|
5
|
+
class Layout < Rubyvis::Panel
|
6
|
+
@properties=Mark.properties.dup
|
7
|
+
def self.attr_accessor_dsl(*attr)
|
8
|
+
attr.each do |sym|
|
9
|
+
if sym.is_a? Array
|
10
|
+
name,func=sym
|
11
|
+
else
|
12
|
+
name=sym
|
13
|
+
func=nil
|
14
|
+
end
|
15
|
+
@properties[name]=true
|
16
|
+
self.property_method(name,false, func, self)
|
17
|
+
define_method(name.to_s+"=") {|v|
|
18
|
+
self.send(name,v)
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
#require 'rubyvis/layout/stack'
|