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.
Files changed (55) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +13 -1
  3. data/Manifest.txt +19 -0
  4. data/examples/antibiotics/antibiotics.rb +96 -0
  5. data/examples/antibiotics/antibiotics_data.rb +20 -0
  6. data/examples/area.rb +103 -0
  7. data/examples/bar_column_chart.rb +55 -0
  8. data/examples/barley/barley.rb +29 -19
  9. data/examples/barley/barley_data.rb +122 -0
  10. data/examples/crimea/crimea_grouped_bar.rb +59 -0
  11. data/examples/dot.rb +19 -0
  12. data/examples/first.rb +1 -6
  13. data/examples/line.rb +84 -0
  14. data/examples/pie_and_donut.rb +38 -0
  15. data/examples/scatterplot.rb +55 -0
  16. data/examples/second.rb +3 -4
  17. data/examples/third.rb +1 -1
  18. data/lib/rubyvis.rb +3 -1
  19. data/lib/rubyvis/color/color.rb +31 -3
  20. data/lib/rubyvis/color/colors.rb +3 -3
  21. data/lib/rubyvis/format/number.rb +80 -10
  22. data/lib/rubyvis/internals.rb +11 -5
  23. data/lib/rubyvis/javascript_behaviour.rb +1 -0
  24. data/lib/rubyvis/mark.rb +43 -20
  25. data/lib/rubyvis/mark/anchor.rb +1 -1
  26. data/lib/rubyvis/mark/area.rb +15 -13
  27. data/lib/rubyvis/mark/bar.rb +2 -2
  28. data/lib/rubyvis/mark/dot.rb +85 -0
  29. data/lib/rubyvis/mark/label.rb +1 -1
  30. data/lib/rubyvis/mark/line.rb +7 -6
  31. data/lib/rubyvis/mark/panel.rb +0 -1
  32. data/lib/rubyvis/mark/rule.rb +5 -4
  33. data/lib/rubyvis/mark/wedge.rb +124 -0
  34. data/lib/rubyvis/nest.rb +158 -0
  35. data/lib/rubyvis/scale.rb +4 -0
  36. data/lib/rubyvis/scale/log.rb +55 -0
  37. data/lib/rubyvis/scale/ordinal.rb +34 -11
  38. data/lib/rubyvis/scale/quantitative.rb +17 -3
  39. data/lib/rubyvis/scene/svg_area.rb +197 -0
  40. data/lib/rubyvis/scene/svg_dot.rb +67 -0
  41. data/lib/rubyvis/scene/svg_label.rb +17 -15
  42. data/lib/rubyvis/scene/svg_line.rb +0 -2
  43. data/lib/rubyvis/scene/svg_rule.rb +2 -2
  44. data/lib/rubyvis/scene/svg_scene.rb +8 -1
  45. data/lib/rubyvis/scene/svg_wedge.rb +56 -0
  46. data/lib/rubyvis/sceneelement.rb +2 -1
  47. data/spec/bar_spec.rb +27 -3
  48. data/spec/label_spec.rb +1 -1
  49. data/spec/nest_spec.rb +41 -0
  50. data/spec/panel_spec.rb +1 -1
  51. data/spec/scale_linear_spec.rb +2 -2
  52. data/spec/scale_ordinal_spec.rb +81 -0
  53. data/spec/spec.opts +0 -1
  54. metadata +24 -3
  55. 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 {self.index * 25})
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().width(150).height(200);
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*20}).add(pv.Label).text(lambda {|d,t| "#{t}-#{d}"})
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.2'
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