rubyvis 0.1.2 → 0.1.3
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.tar.gz.sig +0 -0
- data/History.txt +13 -1
- data/Manifest.txt +19 -0
- data/examples/antibiotics/antibiotics.rb +96 -0
- data/examples/antibiotics/antibiotics_data.rb +20 -0
- data/examples/area.rb +103 -0
- data/examples/bar_column_chart.rb +55 -0
- data/examples/barley/barley.rb +29 -19
- data/examples/barley/barley_data.rb +122 -0
- data/examples/crimea/crimea_grouped_bar.rb +59 -0
- data/examples/dot.rb +19 -0
- data/examples/first.rb +1 -6
- data/examples/line.rb +84 -0
- data/examples/pie_and_donut.rb +38 -0
- data/examples/scatterplot.rb +55 -0
- data/examples/second.rb +3 -4
- data/examples/third.rb +1 -1
- data/lib/rubyvis.rb +3 -1
- data/lib/rubyvis/color/color.rb +31 -3
- data/lib/rubyvis/color/colors.rb +3 -3
- data/lib/rubyvis/format/number.rb +80 -10
- data/lib/rubyvis/internals.rb +11 -5
- data/lib/rubyvis/javascript_behaviour.rb +1 -0
- data/lib/rubyvis/mark.rb +43 -20
- data/lib/rubyvis/mark/anchor.rb +1 -1
- data/lib/rubyvis/mark/area.rb +15 -13
- data/lib/rubyvis/mark/bar.rb +2 -2
- data/lib/rubyvis/mark/dot.rb +85 -0
- data/lib/rubyvis/mark/label.rb +1 -1
- data/lib/rubyvis/mark/line.rb +7 -6
- data/lib/rubyvis/mark/panel.rb +0 -1
- data/lib/rubyvis/mark/rule.rb +5 -4
- data/lib/rubyvis/mark/wedge.rb +124 -0
- data/lib/rubyvis/nest.rb +158 -0
- data/lib/rubyvis/scale.rb +4 -0
- data/lib/rubyvis/scale/log.rb +55 -0
- data/lib/rubyvis/scale/ordinal.rb +34 -11
- data/lib/rubyvis/scale/quantitative.rb +17 -3
- data/lib/rubyvis/scene/svg_area.rb +197 -0
- data/lib/rubyvis/scene/svg_dot.rb +67 -0
- data/lib/rubyvis/scene/svg_label.rb +17 -15
- data/lib/rubyvis/scene/svg_line.rb +0 -2
- data/lib/rubyvis/scene/svg_rule.rb +2 -2
- data/lib/rubyvis/scene/svg_scene.rb +8 -1
- data/lib/rubyvis/scene/svg_wedge.rb +56 -0
- data/lib/rubyvis/sceneelement.rb +2 -1
- data/spec/bar_spec.rb +27 -3
- data/spec/label_spec.rb +1 -1
- data/spec/nest_spec.rb +41 -0
- data/spec/panel_spec.rb +1 -1
- data/spec/scale_linear_spec.rb +2 -2
- data/spec/scale_ordinal_spec.rb +81 -0
- data/spec/spec.opts +0 -1
- metadata +24 -3
- metadata.gz.sig +0 -0
@@ -0,0 +1,122 @@
|
|
1
|
+
$barley = [
|
2
|
+
{ yield: 27.00000, variety: "Manchuria", year: 1931, site: "University Farm" },
|
3
|
+
{ yield: 48.86667, variety: "Manchuria", year: 1931, site: "Waseca" },
|
4
|
+
{ yield: 27.43334, variety: "Manchuria", year: 1931, site: "Morris" },
|
5
|
+
{ yield: 39.93333, variety: "Manchuria", year: 1931, site: "Crookston" },
|
6
|
+
{ yield: 32.96667, variety: "Manchuria", year: 1931, site: "Grand Rapids" },
|
7
|
+
{ yield: 28.96667, variety: "Manchuria", year: 1931, site: "Duluth" },
|
8
|
+
{ yield: 43.06666, variety: "Glabron", year: 1931, site: "University Farm" },
|
9
|
+
{ yield: 55.20000, variety: "Glabron", year: 1931, site: "Waseca" },
|
10
|
+
{ yield: 28.76667, variety: "Glabron", year: 1931, site: "Morris" },
|
11
|
+
{ yield: 38.13333, variety: "Glabron", year: 1931, site: "Crookston" },
|
12
|
+
{ yield: 29.13333, variety: "Glabron", year: 1931, site: "Grand Rapids" },
|
13
|
+
{ yield: 29.66667, variety: "Glabron", year: 1931, site: "Duluth" },
|
14
|
+
{ yield: 35.13333, variety: "Svansota", year: 1931, site: "University Farm" },
|
15
|
+
{ yield: 47.33333, variety: "Svansota", year: 1931, site: "Waseca" },
|
16
|
+
{ yield: 25.76667, variety: "Svansota", year: 1931, site: "Morris" },
|
17
|
+
{ yield: 40.46667, variety: "Svansota", year: 1931, site: "Crookston" },
|
18
|
+
{ yield: 29.66667, variety: "Svansota", year: 1931, site: "Grand Rapids" },
|
19
|
+
{ yield: 25.70000, variety: "Svansota", year: 1931, site: "Duluth" },
|
20
|
+
{ yield: 39.90000, variety: "Velvet", year: 1931, site: "University Farm" },
|
21
|
+
{ yield: 50.23333, variety: "Velvet", year: 1931, site: "Waseca" },
|
22
|
+
{ yield: 26.13333, variety: "Velvet", year: 1931, site: "Morris" },
|
23
|
+
{ yield: 41.33333, variety: "Velvet", year: 1931, site: "Crookston" },
|
24
|
+
{ yield: 23.03333, variety: "Velvet", year: 1931, site: "Grand Rapids" },
|
25
|
+
{ yield: 26.30000, variety: "Velvet", year: 1931, site: "Duluth" },
|
26
|
+
{ yield: 36.56666, variety: "Trebi", year: 1931, site: "University Farm" },
|
27
|
+
{ yield: 63.83330, variety: "Trebi", year: 1931, site: "Waseca" },
|
28
|
+
{ yield: 43.76667, variety: "Trebi", year: 1931, site: "Morris" },
|
29
|
+
{ yield: 46.93333, variety: "Trebi", year: 1931, site: "Crookston" },
|
30
|
+
{ yield: 29.76667, variety: "Trebi", year: 1931, site: "Grand Rapids" },
|
31
|
+
{ yield: 33.93333, variety: "Trebi", year: 1931, site: "Duluth" },
|
32
|
+
{ yield: 43.26667, variety: "No. 457", year: 1931, site: "University Farm" },
|
33
|
+
{ yield: 58.10000, variety: "No. 457", year: 1931, site: "Waseca" },
|
34
|
+
{ yield: 28.70000, variety: "No. 457", year: 1931, site: "Morris" },
|
35
|
+
{ yield: 45.66667, variety: "No. 457", year: 1931, site: "Crookston" },
|
36
|
+
{ yield: 32.16667, variety: "No. 457", year: 1931, site: "Grand Rapids" },
|
37
|
+
{ yield: 33.60000, variety: "No. 457", year: 1931, site: "Duluth" },
|
38
|
+
{ yield: 36.60000, variety: "No. 462", year: 1931, site: "University Farm" },
|
39
|
+
{ yield: 65.76670, variety: "No. 462", year: 1931, site: "Waseca" },
|
40
|
+
{ yield: 30.36667, variety: "No. 462", year: 1931, site: "Morris" },
|
41
|
+
{ yield: 48.56666, variety: "No. 462", year: 1931, site: "Crookston" },
|
42
|
+
{ yield: 24.93334, variety: "No. 462", year: 1931, site: "Grand Rapids" },
|
43
|
+
{ yield: 28.10000, variety: "No. 462", year: 1931, site: "Duluth" },
|
44
|
+
{ yield: 32.76667, variety: "Peatland", year: 1931, site: "University Farm" },
|
45
|
+
{ yield: 48.56666, variety: "Peatland", year: 1931, site: "Waseca" },
|
46
|
+
{ yield: 29.86667, variety: "Peatland", year: 1931, site: "Morris" },
|
47
|
+
{ yield: 41.60000, variety: "Peatland", year: 1931, site: "Crookston" },
|
48
|
+
{ yield: 34.70000, variety: "Peatland", year: 1931, site: "Grand Rapids" },
|
49
|
+
{ yield: 32.00000, variety: "Peatland", year: 1931, site: "Duluth" },
|
50
|
+
{ yield: 24.66667, variety: "No. 475", year: 1931, site: "University Farm" },
|
51
|
+
{ yield: 46.76667, variety: "No. 475", year: 1931, site: "Waseca" },
|
52
|
+
{ yield: 22.60000, variety: "No. 475", year: 1931, site: "Morris" },
|
53
|
+
{ yield: 44.10000, variety: "No. 475", year: 1931, site: "Crookston" },
|
54
|
+
{ yield: 19.70000, variety: "No. 475", year: 1931, site: "Grand Rapids" },
|
55
|
+
{ yield: 33.06666, variety: "No. 475", year: 1931, site: "Duluth" },
|
56
|
+
{ yield: 39.30000, variety: "Wisconsin No. 38", year: 1931, site: "University Farm" },
|
57
|
+
{ yield: 58.80000, variety: "Wisconsin No. 38", year: 1931, site: "Waseca" },
|
58
|
+
{ yield: 29.46667, variety: "Wisconsin No. 38", year: 1931, site: "Morris" },
|
59
|
+
{ yield: 49.86667, variety: "Wisconsin No. 38", year: 1931, site: "Crookston" },
|
60
|
+
{ yield: 34.46667, variety: "Wisconsin No. 38", year: 1931, site: "Grand Rapids" },
|
61
|
+
{ yield: 31.60000, variety: "Wisconsin No. 38", year: 1931, site: "Duluth" },
|
62
|
+
{ yield: 26.90000, variety: "Manchuria", year: 1932, site: "University Farm" },
|
63
|
+
{ yield: 33.46667, variety: "Manchuria", year: 1932, site: "Waseca" },
|
64
|
+
{ yield: 34.36666, variety: "Manchuria", year: 1932, site: "Morris" },
|
65
|
+
{ yield: 32.96667, variety: "Manchuria", year: 1932, site: "Crookston" },
|
66
|
+
{ yield: 22.13333, variety: "Manchuria", year: 1932, site: "Grand Rapids" },
|
67
|
+
{ yield: 22.56667, variety: "Manchuria", year: 1932, site: "Duluth" },
|
68
|
+
{ yield: 36.80000, variety: "Glabron", year: 1932, site: "University Farm" },
|
69
|
+
{ yield: 37.73333, variety: "Glabron", year: 1932, site: "Waseca" },
|
70
|
+
{ yield: 35.13333, variety: "Glabron", year: 1932, site: "Morris" },
|
71
|
+
{ yield: 26.16667, variety: "Glabron", year: 1932, site: "Crookston" },
|
72
|
+
{ yield: 14.43333, variety: "Glabron", year: 1932, site: "Grand Rapids" },
|
73
|
+
{ yield: 25.86667, variety: "Glabron", year: 1932, site: "Duluth" },
|
74
|
+
{ yield: 27.43334, variety: "Svansota", year: 1932, site: "University Farm" },
|
75
|
+
{ yield: 38.50000, variety: "Svansota", year: 1932, site: "Waseca" },
|
76
|
+
{ yield: 35.03333, variety: "Svansota", year: 1932, site: "Morris" },
|
77
|
+
{ yield: 20.63333, variety: "Svansota", year: 1932, site: "Crookston" },
|
78
|
+
{ yield: 16.63333, variety: "Svansota", year: 1932, site: "Grand Rapids" },
|
79
|
+
{ yield: 22.23333, variety: "Svansota", year: 1932, site: "Duluth" },
|
80
|
+
{ yield: 26.80000, variety: "Velvet", year: 1932, site: "University Farm" },
|
81
|
+
{ yield: 37.40000, variety: "Velvet", year: 1932, site: "Waseca" },
|
82
|
+
{ yield: 38.83333, variety: "Velvet", year: 1932, site: "Morris" },
|
83
|
+
{ yield: 32.06666, variety: "Velvet", year: 1932, site: "Crookston" },
|
84
|
+
{ yield: 32.23333, variety: "Velvet", year: 1932, site: "Grand Rapids" },
|
85
|
+
{ yield: 22.46667, variety: "Velvet", year: 1932, site: "Duluth" },
|
86
|
+
{ yield: 29.06667, variety: "Trebi", year: 1932, site: "University Farm" },
|
87
|
+
{ yield: 49.23330, variety: "Trebi", year: 1932, site: "Waseca" },
|
88
|
+
{ yield: 46.63333, variety: "Trebi", year: 1932, site: "Morris" },
|
89
|
+
{ yield: 41.83333, variety: "Trebi", year: 1932, site: "Crookston" },
|
90
|
+
{ yield: 20.63333, variety: "Trebi", year: 1932, site: "Grand Rapids" },
|
91
|
+
{ yield: 30.60000, variety: "Trebi", year: 1932, site: "Duluth" },
|
92
|
+
{ yield: 26.43334, variety: "No. 457", year: 1932, site: "University Farm" },
|
93
|
+
{ yield: 42.20000, variety: "No. 457", year: 1932, site: "Waseca" },
|
94
|
+
{ yield: 43.53334, variety: "No. 457", year: 1932, site: "Morris" },
|
95
|
+
{ yield: 34.33333, variety: "No. 457", year: 1932, site: "Crookston" },
|
96
|
+
{ yield: 19.46667, variety: "No. 457", year: 1932, site: "Grand Rapids" },
|
97
|
+
{ yield: 22.70000, variety: "No. 457", year: 1932, site: "Duluth" },
|
98
|
+
{ yield: 25.56667, variety: "No. 462", year: 1932, site: "University Farm" },
|
99
|
+
{ yield: 44.70000, variety: "No. 462", year: 1932, site: "Waseca" },
|
100
|
+
{ yield: 47.00000, variety: "No. 462", year: 1932, site: "Morris" },
|
101
|
+
{ yield: 30.53333, variety: "No. 462", year: 1932, site: "Crookston" },
|
102
|
+
{ yield: 19.90000, variety: "No. 462", year: 1932, site: "Grand Rapids" },
|
103
|
+
{ yield: 22.50000, variety: "No. 462", year: 1932, site: "Duluth" },
|
104
|
+
{ yield: 28.06667, variety: "Peatland", year: 1932, site: "University Farm" },
|
105
|
+
{ yield: 36.03333, variety: "Peatland", year: 1932, site: "Waseca" },
|
106
|
+
{ yield: 43.20000, variety: "Peatland", year: 1932, site: "Morris" },
|
107
|
+
{ yield: 25.23333, variety: "Peatland", year: 1932, site: "Crookston" },
|
108
|
+
{ yield: 26.76667, variety: "Peatland", year: 1932, site: "Grand Rapids" },
|
109
|
+
{ yield: 31.36667, variety: "Peatland", year: 1932, site: "Duluth" },
|
110
|
+
{ yield: 30.00000, variety: "No. 475", year: 1932, site: "University Farm" },
|
111
|
+
{ yield: 41.26667, variety: "No. 475", year: 1932, site: "Waseca" },
|
112
|
+
{ yield: 44.23333, variety: "No. 475", year: 1932, site: "Morris" },
|
113
|
+
{ yield: 32.13333, variety: "No. 475", year: 1932, site: "Crookston" },
|
114
|
+
{ yield: 15.23333, variety: "No. 475", year: 1932, site: "Grand Rapids" },
|
115
|
+
{ yield: 27.36667, variety: "No. 475", year: 1932, site: "Duluth" },
|
116
|
+
{ yield: 38.00000, variety: "Wisconsin No. 38", year: 1932, site: "University Farm" },
|
117
|
+
{ yield: 58.16667, variety: "Wisconsin No. 38", year: 1932, site: "Waseca" },
|
118
|
+
{ yield: 47.16667, variety: "Wisconsin No. 38", year: 1932, site: "Morris" },
|
119
|
+
{ yield: 35.90000, variety: "Wisconsin No. 38", year: 1932, site: "Crookston" },
|
120
|
+
{ yield: 20.66667, variety: "Wisconsin No. 38", year: 1932, site: "Grand Rapids" },
|
121
|
+
{ yield: 29.33333, variety: "Wisconsin No. 38", year: 1932, site: "Duluth" }
|
122
|
+
];
|
@@ -0,0 +1,59 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
require 'ostruct'
|
4
|
+
load(File.dirname(__FILE__)+"/crimea.rb")
|
5
|
+
|
6
|
+
|
7
|
+
w = 545
|
8
|
+
h = 280
|
9
|
+
#x = pv.Scale.linear($crimea, lambda {|d| d.date}).range(0, w)
|
10
|
+
|
11
|
+
x=pv.Scale.ordinal($crimea, lambda {|d| d.date}).split_banded(0,w,4/5.0)
|
12
|
+
|
13
|
+
y = pv.Scale.linear(0, 1500).range(0, h)
|
14
|
+
k=x.range_band / $causes.size
|
15
|
+
fill = pv.colors("lightpink", "darkgray", "lightblue")
|
16
|
+
|
17
|
+
format = pv.Format.date("%b")
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
vis = pv.Panel.new()
|
22
|
+
.width(w)
|
23
|
+
.height(h)
|
24
|
+
.margin(19.5)
|
25
|
+
.right(40);
|
26
|
+
|
27
|
+
panel = vis.add(pv.Panel)
|
28
|
+
.data($crimea)
|
29
|
+
.left(lambda {|d| x.scale(d.date)})
|
30
|
+
.width(x.range_band);
|
31
|
+
|
32
|
+
panel.add(pv.Bar)
|
33
|
+
.data($causes)
|
34
|
+
.bottom(0)
|
35
|
+
.width(k)
|
36
|
+
.left(lambda { self.index * k})
|
37
|
+
.height(lambda {|t, d| y.scale(d.send(t))})
|
38
|
+
.fill_style(lambda {|f| a=fill.scale(self.index); return a})
|
39
|
+
.stroke_style(lambda {|d| fill_style ? fill_style.darker : pv.color('black')})
|
40
|
+
.line_width(1);
|
41
|
+
|
42
|
+
panel.anchor("bottom").add(pv.Label)
|
43
|
+
.visible(lambda { (self.index % 3)==0})
|
44
|
+
.text_baseline("top")
|
45
|
+
.text_margin(10)
|
46
|
+
.text(lambda {|d| format.format(d.date)})
|
47
|
+
|
48
|
+
|
49
|
+
vis.add(pv.Rule)
|
50
|
+
.data(y.ticks())
|
51
|
+
.bottom(lambda {|d| y.scale(d)})
|
52
|
+
.stroke_style(lambda {|i| i!=0 ? pv.color("rgba(255, 255, 255, .5)") : pv.color("black")})
|
53
|
+
.anchor("right").add(pv.Label)
|
54
|
+
.visible(lambda { (self.index & 1)==0})
|
55
|
+
.text_margin(6);
|
56
|
+
|
57
|
+
vis.render();
|
58
|
+
|
59
|
+
puts vis.to_svg
|
data/examples/dot.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
|
4
|
+
vis = pv.Panel.new().width(200).height(200);
|
5
|
+
|
6
|
+
dot=vis.add(pv.Dot)
|
7
|
+
.data([1,2,3,4,5,6])
|
8
|
+
.bottom(lambda {|d| return d*30})
|
9
|
+
.left(lambda { return 20+self.index*20} )
|
10
|
+
.shape_radius(10)
|
11
|
+
dot.anchor('top').add(pv.Label).text('a')
|
12
|
+
dot.anchor('bottom').add(pv.Label).text('b')
|
13
|
+
dot.anchor('left').add(pv.Label).text('l')
|
14
|
+
dot.anchor('right').add(pv.Label).text('r')
|
15
|
+
|
16
|
+
|
17
|
+
vis.render()
|
18
|
+
#puts vis.children_inspect
|
19
|
+
puts vis.to_svg
|
data/examples/first.rb
CHANGED
@@ -6,12 +6,7 @@ vis.add(pv.Bar).data([1, 1.2, 1.7, 1.5, 0.7, 0.3]).
|
|
6
6
|
width(20).
|
7
7
|
height(lambda {|d| d * 80}).
|
8
8
|
bottom(0).
|
9
|
-
left(lambda {
|
9
|
+
left(lambda {index * 25})
|
10
10
|
|
11
|
-
|
12
|
-
=begin
|
13
|
-
Should generate this
|
14
|
-
<svg height="150" width="150" stroke-width="1.5" stroke="none" fill="none" font-family="sans-serif" font-size="10px"><g><rect fill="rgb(31,119,180)" height="80" width="20" y="70"></rect><rect fill="rgb(31,119,180)" height="96" width="20" y="54" x="25"></rect><rect fill="rgb(31,119,180)" height="136" width="20" y="14" x="50"></rect><rect fill="rgb(31,119,180)" height="120" width="20" y="30" x="75"></rect><rect fill="rgb(31,119,180)" height="56" width="20" y="94" x="100"></rect><rect fill="rgb(31,119,180)" height="24" width="20" y="126" x="125"></rect></g></svg>
|
15
|
-
=end
|
16
11
|
vis.render()
|
17
12
|
puts vis.to_svg
|
data/examples/line.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
|
4
|
+
data = pv.range(0, 10, 1).map {|x|
|
5
|
+
OpenStruct.new({:x=> x, :y=> Math.sin(x) + 2})
|
6
|
+
}
|
7
|
+
|
8
|
+
#p data
|
9
|
+
w = 400
|
10
|
+
h = 200
|
11
|
+
x = pv.Scale.linear(data, lambda {|d| d.x}).range(0, w)
|
12
|
+
|
13
|
+
|
14
|
+
y = pv.Scale.linear(data, lambda {|d| d.y}).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
|
+
|
25
|
+
#/* The area with top line. */
|
26
|
+
vis.add(pv.Line)
|
27
|
+
.data(data)
|
28
|
+
.line_width(5)
|
29
|
+
.left(lambda {|d| x.scale(d.x)})
|
30
|
+
.bottom(lambda {|d| y.scale(d.y)}).anchor("bottom").add(pv.Line)
|
31
|
+
.stroke_style('red').line_width(1)
|
32
|
+
|
33
|
+
|
34
|
+
vis.render();
|
35
|
+
|
36
|
+
|
37
|
+
puts vis.to_svg
|
38
|
+
|
39
|
+
=begin
|
40
|
+
<svg font-size="10px" font-family="sans-serif" fill="none" stroke="none" stroke-width="1.5" width="430" height="225">
|
41
|
+
<g transform="translate(20, 5)">
|
42
|
+
<line shape-rendering="crispEdges" x1="0" y1="200" x2="400" y2="200" stroke="rgb(0,0,0)" stroke-width="1"/>
|
43
|
+
<line shape-rendering="crispEdges" x1="0" y1="150" x2="400" y2="150" stroke="rgb(238,238,238)" stroke-width="1"/>
|
44
|
+
<line shape-rendering="crispEdges" x1="0" y1="100" x2="400" y2="100" stroke="rgb(238,238,238)" stroke-width="1"/>
|
45
|
+
<line shape-rendering="crispEdges" x1="0" y1="50" x2="400" y2="50" stroke="rgb(238,238,238)" stroke-width="1"/>
|
46
|
+
<line shape-rendering="crispEdges" x1="0" y1="0" x2="400" y2="0" stroke="rgb(238,238,238)" stroke-width="1"/>
|
47
|
+
</g>
|
48
|
+
<g transform="translate(20, 5)">
|
49
|
+
<text pointer-events="none" x="-3" dy="0.35em" transform="translate(0, 200)" fill="rgb(0,0,0)" text-anchor="end">0</text>
|
50
|
+
<text pointer-events="none" x="-3" dy="0.35em" transform="translate(0, 150)" fill="rgb(0,0,0)" text-anchor="end">1</text>
|
51
|
+
<text pointer-events="none" x="-3" dy="0.35em" transform="translate(0, 100)" fill="rgb(0,0,0)" text-anchor="end">2</text>
|
52
|
+
<text pointer-events="none" x="-3" dy="0.35em" transform="translate(0, 50)" fill="rgb(0,0,0)" text-anchor="end">3</text>
|
53
|
+
<text pointer-events="none" x="-3" dy="0.35em" fill="rgb(0,0,0)" text-anchor="end">4</text>
|
54
|
+
</g>
|
55
|
+
<g transform="translate(20, 5)">
|
56
|
+
<line shape-rendering="crispEdges" x1="44.44444444444444" y1="200" x2="44.44444444444444" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
57
|
+
<line shape-rendering="crispEdges" x1="88.88888888888889" y1="200" x2="88.88888888888889" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
58
|
+
<line shape-rendering="crispEdges" x1="133.33333333333331" y1="200" x2="133.33333333333331" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
59
|
+
<line shape-rendering="crispEdges" x1="177.77777777777777" y1="200" x2="177.77777777777777" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
60
|
+
<line shape-rendering="crispEdges" x1="222.22222222222223" y1="200" x2="222.22222222222223" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
61
|
+
<line shape-rendering="crispEdges" x1="266.66666666666663" y1="200" x2="266.66666666666663" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
62
|
+
<line shape-rendering="crispEdges" x1="311.11111111111114" y1="200" x2="311.11111111111114" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
63
|
+
<line shape-rendering="crispEdges" x1="355.55555555555554" y1="200" x2="355.55555555555554" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
64
|
+
<line shape-rendering="crispEdges" x1="400" y1="200" x2="400" y2="205" stroke="rgb(0,0,0)" stroke-width="1"/>
|
65
|
+
</g>
|
66
|
+
<g transform="translate(20, 5)">
|
67
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(44.4444, 205)" fill="rgb(0,0,0)" text-anchor="middle">1</text>
|
68
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(88.8889, 205)" fill="rgb(0,0,0)" text-anchor="middle">2</text>
|
69
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(133.333, 205)" fill="rgb(0,0,0)" text-anchor="middle">3</text>
|
70
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(177.778, 205)" fill="rgb(0,0,0)" text-anchor="middle">4</text>
|
71
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(222.222, 205)" fill="rgb(0,0,0)" text-anchor="middle">5</text>
|
72
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(266.667, 205)" fill="rgb(0,0,0)" text-anchor="middle">6</text>
|
73
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(311.111, 205)" fill="rgb(0,0,0)" text-anchor="middle">7</text>
|
74
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(355.556, 205)" fill="rgb(0,0,0)" text-anchor="middle">8</text>
|
75
|
+
<text pointer-events="none" y="3" dy="0.71em" transform="translate(400, 205)" fill="rgb(0,0,0)" text-anchor="middle">9</text>
|
76
|
+
</g>
|
77
|
+
<g transform="translate(20, 5)">
|
78
|
+
<path d="M0,99L44.44444444444444,56.92645075960516L88.88888888888889,53.535128658715905L133.33333333333331,91.94399959700664L177.77777777777777,136.8401247653964L222.22222222222223,146.94621373315692L266.66666666666663,112.9707749099463L311.11111111111114,66.15067006406053L355.55555555555554,49.53208766883091L400,78.39407573791217L400,199L355.55555555555554,199L311.11111111111114,199L266.66666666666663,199L222.22222222222223,199L177.77777777777777,199L133.33333333333331,199L88.88888888888889,199L44.44444444444444,199L0,199Z" fill="rgb(121,173,210)"/>
|
79
|
+
</g>
|
80
|
+
<g transform="translate(20, 5)">
|
81
|
+
<path d="M0,99L44.44444444444444,56.92645075960516L88.88888888888889,53.535128658715905L133.33333333333331,91.94399959700664L177.77777777777777,136.8401247653964L222.22222222222223,146.94621373315692L266.66666666666663,112.9707749099463L311.11111111111114,66.15067006406053L355.55555555555554,49.53208766883091L400,78.39407573791217" stroke="rgb(31,119,180)" stroke-width="3"/>
|
82
|
+
</g>
|
83
|
+
</svg>
|
84
|
+
=end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
|
4
|
+
# Sizing and scales. */
|
5
|
+
|
6
|
+
data = pv.range(10).map {rand()}
|
7
|
+
|
8
|
+
|
9
|
+
w = 400
|
10
|
+
h = 400
|
11
|
+
|
12
|
+
r = w / 2.0
|
13
|
+
|
14
|
+
a = pv.Scale.linear(0, pv.sum(data)).range(0, 2 * Math::PI)
|
15
|
+
|
16
|
+
#/* The root panel. */
|
17
|
+
vis = pv.Panel.new()
|
18
|
+
.width(w)
|
19
|
+
.height(h);
|
20
|
+
#/* The wedge, with centered label. */
|
21
|
+
|
22
|
+
vis.add(pv.Wedge)
|
23
|
+
.data(data.sort(&pv.reverse_order))
|
24
|
+
.bottom(w / 2.0)
|
25
|
+
.left(w / 2.0)
|
26
|
+
.innerRadius(r - 40)
|
27
|
+
.outerRadius(r)
|
28
|
+
.angle(a)
|
29
|
+
.event("mouseover", lambda {self.inner_radius(0)})
|
30
|
+
.event("mouseout", lambda{ self.inner_radius(r - 40)})
|
31
|
+
.anchor("center").add(pv.Label)
|
32
|
+
.visible(lambda {|d| d > 0.15})
|
33
|
+
.textAngle(0)
|
34
|
+
.text(lambda {|d| "%0.2f" % d});
|
35
|
+
|
36
|
+
vis.render();
|
37
|
+
|
38
|
+
puts vis.to_svg
|
@@ -0,0 +1,55 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require 'rubyvis'
|
3
|
+
data = pv.range(100).map {|x|
|
4
|
+
OpenStruct.new({x: x, y: rand(), z: 10**(2*rand)})
|
5
|
+
}
|
6
|
+
|
7
|
+
|
8
|
+
w = 400
|
9
|
+
h = 400
|
10
|
+
|
11
|
+
x = pv.Scale.linear(0, 99).range(0, w)
|
12
|
+
y = pv.Scale.linear(0, 1).range(0, h)
|
13
|
+
|
14
|
+
c = pv.Scale.log(1, 100).range("orange", "brown")
|
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
|
+
|
25
|
+
# Y-axis and ticks.
|
26
|
+
vis.add(pv.Rule)
|
27
|
+
.data(y.ticks())
|
28
|
+
.bottom(y)
|
29
|
+
.strokeStyle(lambda {|d| d!=0 ? "#eee" : "#000"})
|
30
|
+
.anchor("left").add(pv.Label)
|
31
|
+
.visible(lambda {|d| d > 0 and d < 1})
|
32
|
+
.text(y.tick_format)
|
33
|
+
|
34
|
+
# X-axis and ticks.
|
35
|
+
vis.add(pv.Rule)
|
36
|
+
.data(x.ticks())
|
37
|
+
.left(x)
|
38
|
+
.stroke_style(lambda {|d| d!=0 ? "#eee" : "#000"})
|
39
|
+
.anchor("bottom").add(pv.Label)
|
40
|
+
.visible(lambda {|d| d > 0 and d < 100})
|
41
|
+
.text(x.tick_format);
|
42
|
+
|
43
|
+
#/* The dot plot! */
|
44
|
+
vis.add(pv.Panel)
|
45
|
+
.data(data)
|
46
|
+
.add(pv.Dot)
|
47
|
+
.left(lambda {|d| x.scale(d.x)})
|
48
|
+
.bottom(lambda {|d| y.scale(d.y)})
|
49
|
+
.stroke_style(lambda {|d| c.scale(d.z)})
|
50
|
+
.fill_style(lambda {|d| c.scale(d.z).alpha(0.2)})
|
51
|
+
.shape_size(lambda {|d| d.z})
|
52
|
+
.title(lambda {|d| d.z})
|
53
|
+
|
54
|
+
vis.render()
|
55
|
+
puts vis.to_svg
|
data/examples/second.rb
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
2
|
require 'rubyvis'
|
3
3
|
|
4
|
-
vis = pv.Panel.new()
|
4
|
+
vis = pv.Panel.new()
|
5
|
+
.width(150)
|
6
|
+
.height(200)
|
5
7
|
|
6
8
|
vis.add(pv.Rule).data(pv.range(0, 2, 0.5)).bottom(lambda {|d| d * 80 + 0.5}).add(pv.Label).left(0)
|
7
9
|
|
8
10
|
|
9
11
|
vis.add(pv.Bar).data([1, 1.2, 1.7, 1.5, 0.7]).width(20).height(lambda {|d| d * 80}).bottom(0).left(lambda { self.index * 25 + 25}).anchor('bottom').add(pv.Label)
|
10
12
|
|
11
|
-
#puts vis.children_inspect
|
12
|
-
#exit
|
13
13
|
|
14
14
|
vis.render();
|
15
15
|
puts vis.to_svg
|
16
16
|
|
17
|
-
# <svg height="150" width="150" stroke-width="1.5" stroke="none" fill="none" font-family="sans-serif" font-size="10px"><g><line stroke-width="1" stroke="rgb(0,0,0)" y2="149.5" x2="150" y1="149.5" x1="0" shape-rendering="crispEdges"></line><line stroke-width="1" stroke="rgb(0,0,0)" y2="109.5" x2="150" y1="109.5" x1="0" shape-rendering="crispEdges"></line><line stroke-width="1" stroke="rgb(0,0,0)" y2="69.5" x2="150" y1="69.5" x1="0" shape-rendering="crispEdges"></line><line stroke-width="1" stroke="rgb(0,0,0)" y2="29.5" x2="150" y1="29.5" x1="0" shape-rendering="crispEdges"></line></g><g><text fill="rgb(0,0,0)" transform="translate(75, 149.5)" y="-3" x="3" pointer-events="none">0</text><text fill="rgb(0,0,0)" transform="translate(75, 109.5)" y="-3" x="3" pointer-events="none">0.5</text><text fill="rgb(0,0,0)" transform="translate(75, 69.5)" y="-3" x="3" pointer-events="none">1</text><text fill="rgb(0,0,0)" transform="translate(75, 29.5)" y="-3" x="3" pointer-events="none">1.5</text></g><g><rect fill="rgb(31,119,180)" height="80" width="20" y="70" x="25"></rect><rect fill="rgb(31,119,180)" height="96" width="20" y="54" x="50"></rect><rect fill="rgb(31,119,180)" height="136" width="20" y="14" x="75"></rect><rect fill="rgb(31,119,180)" height="120" width="20" y="30" x="100"></rect><rect fill="rgb(31,119,180)" height="56" width="20" y="94" x="125"></rect></g><g><text text-anchor="middle" fill="rgb(0,0,0)" transform="translate(35, 150)" y="-3" pointer-events="none">1</text><text text-anchor="middle" fill="rgb(0,0,0)" transform="translate(60, 150)" y="-3" pointer-events="none">1.2</text><text text-anchor="middle" fill="rgb(0,0,0)" transform="translate(85, 150)" y="-3" pointer-events="none">1.7</text><text text-anchor="middle" fill="rgb(0,0,0)" transform="translate(110, 150)" y="-3" pointer-events="none">1.5</text><text text-anchor="middle" fill="rgb(0,0,0)" transform="translate(135, 150)" y="-3" pointer-events="none">0.7</text></g></svg>
|
data/examples/third.rb
CHANGED
@@ -8,7 +8,7 @@ vis.add(pv.Panel).data([1,2]).add(pv.Bar)
|
|
8
8
|
.width(20)
|
9
9
|
.height(lambda {|d| d * 20})
|
10
10
|
.bottom(0)
|
11
|
-
.left(lambda {|d,t| t*60+self.index*
|
11
|
+
.left(lambda {|d,t| t*60+self.index*30}).add(pv.Label).text(lambda {|d,t| "#{t}-#{d}"})
|
12
12
|
|
13
13
|
|
14
14
|
vis.render()
|
data/lib/rubyvis.rb
CHANGED
@@ -7,6 +7,7 @@ require 'pp'
|
|
7
7
|
require 'rubyvis/internals'
|
8
8
|
require 'rubyvis/sceneelement'
|
9
9
|
require 'rubyvis/property'
|
10
|
+
require 'rubyvis/nest'
|
10
11
|
|
11
12
|
require 'rubyvis/javascript_behaviour'
|
12
13
|
require 'rubyvis/format'
|
@@ -25,7 +26,8 @@ end
|
|
25
26
|
|
26
27
|
module Rubyvis
|
27
28
|
@document=nil
|
28
|
-
VERSION = '0.1.
|
29
|
+
VERSION = '0.1.3'
|
30
|
+
API_VERSION='3.3'
|
29
31
|
Infinity=1.0 / 0 # You actually can do it! http://snipplr.com/view/2137/uses-for-infinity-in-ruby/
|
30
32
|
# :section: basic methods
|
31
33
|
def self.identity
|