rubyvis 0.3.3 → 0.3.4

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 (78) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +8 -0
  3. data/Manifest.txt +45 -36
  4. data/examples/{first_rbp_api.rb → 1_basic/1a_bar_rbp_api.rb} +1 -1
  5. data/examples/{first_protovis_api.rb → 1_basic/1b_bar_pv_api.rb} +1 -1
  6. data/examples/{second.rb → 1_basic/2_bar_and_rule.rb} +2 -2
  7. data/examples/{third.rb → 1_basic/3_grouped_bars.rb} +1 -1
  8. data/examples/{area_interpolation.rb → 1_basic/area_interpolation.rb} +1 -1
  9. data/examples/{dot.rb → 1_basic/dot.rb} +1 -1
  10. data/examples/{fixtures → 1_basic/fixtures}/tipsy.gif +0 -0
  11. data/examples/1_basic/grid.rb +29 -0
  12. data/examples/{image.rb → 1_basic/image.rb} +1 -1
  13. data/examples/{line.rb → 1_basic/line.rb} +1 -1
  14. data/examples/{line_interpolation.rb → 1_basic/line_interpolation.rb} +1 -1
  15. data/examples/2_medium/censo_agropecuario/censo_agropecuario_chile_data.rb +53 -0
  16. data/examples/2_medium/censo_agropecuario/census_treemap.rb +63 -0
  17. data/examples/2_medium/censo_agropecuario/create_data.rb +10 -0
  18. data/examples/2_medium/censo_agropecuario/resultset.csv +51 -0
  19. data/examples/{nested_grid.rb → 2_medium/nested_grid.rb} +3 -4
  20. data/examples/{area.rb → 3_pv_conventional/area.rb} +1 -1
  21. data/examples/{bar_column_chart.rb → 3_pv_conventional/bar_column_chart.rb} +1 -1
  22. data/examples/{grouped_charts.rb → 3_pv_conventional/grouped_charts.rb} +1 -1
  23. data/examples/{line_and_step.rb → 3_pv_conventional/line_and_step.rb} +1 -1
  24. data/examples/{pie_and_donut.rb → 3_pv_conventional/pie_and_donut.rb} +1 -1
  25. data/examples/{scatterplot.rb → 3_pv_conventional/scatterplot.rb} +1 -1
  26. data/examples/{stacked_charts.rb → 3_pv_conventional/stacked_charts.rb} +1 -3
  27. data/examples/{antibiotics → 4_pv_custom/antibiotics}/antibiotics_data.rb +0 -0
  28. data/examples/{antibiotics → 4_pv_custom/antibiotics}/antibiotics_scatter.rb +1 -1
  29. data/examples/{antibiotics → 4_pv_custom/antibiotics}/antibiotics_wedge.rb +1 -1
  30. data/examples/{barley → 4_pv_custom/barley}/barley.rb +5 -1
  31. data/examples/{barley → 4_pv_custom/barley}/barley_data.rb +0 -0
  32. data/examples/{cars → 4_pv_custom/cars}/cars.rb +1 -1
  33. data/examples/{cars → 4_pv_custom/cars}/cars_data.rb +0 -0
  34. data/examples/{crimea → 4_pv_custom/crimea}/crimea_data.rb +0 -0
  35. data/examples/{crimea → 4_pv_custom/crimea}/crimea_grouped_bar.rb +1 -1
  36. data/examples/{crimea → 4_pv_custom/crimea}/crimea_line.rb +1 -1
  37. data/examples/{bubble_charts.rb → 5_pv_hierarchies/bubble_charts.rb} +3 -2
  38. data/examples/5_pv_hierarchies/bubble_charts_matrix.rb +64 -0
  39. data/examples/{circle_packing.rb → 5_pv_hierarchies/circle_packing.rb} +4 -4
  40. data/examples/{dendogram.rb → 5_pv_hierarchies/dendogram.rb} +2 -2
  41. data/examples/{icicle.rb → 5_pv_hierarchies/icicle.rb} +2 -2
  42. data/examples/{indent.rb → 5_pv_hierarchies/indent.rb} +2 -2
  43. data/examples/5_pv_hierarchies/node_link_tree.rb +52 -0
  44. data/examples/{sunburst.rb → 5_pv_hierarchies/sunburst.rb} +2 -2
  45. data/examples/5_pv_hierarchies/treemap.rb +48 -0
  46. data/lib/rubyvis.rb +1 -1
  47. data/lib/rubyvis/dom.rb +16 -1
  48. data/lib/rubyvis/internals.rb +2 -2
  49. data/lib/rubyvis/layout.rb +2 -0
  50. data/lib/rubyvis/layout/grid.rb +105 -0
  51. data/lib/rubyvis/layout/pack.rb +53 -54
  52. data/lib/rubyvis/layout/stack.rb +26 -24
  53. data/lib/rubyvis/layout/tree.rb +267 -0
  54. data/lib/rubyvis/layout/treemap.rb +1 -0
  55. data/lib/rubyvis/mark.rb +10 -8
  56. data/lib/rubyvis/mark/area.rb +6 -6
  57. data/lib/rubyvis/mark/dot.rb +1 -1
  58. data/lib/rubyvis/mark/shorcut_methods.rb +29 -2
  59. data/lib/rubyvis/nest.rb +48 -2
  60. data/lib/rubyvis/scale/ordinal.rb +6 -6
  61. data/lib/rubyvis/scale/quantitative.rb +13 -7
  62. data/lib/rubyvis/scene/svg_area.rb +20 -14
  63. data/lib/rubyvis/scene/svg_bar.rb +1 -1
  64. data/lib/rubyvis/scene/svg_scene.rb +0 -1
  65. data/lib/rubyvis/sceneelement.rb +1 -1
  66. data/spec/area_spec.rb +12 -0
  67. data/spec/dom_spec.rb +15 -8
  68. data/spec/layout_stack_spec.rb +70 -0
  69. data/spec/nest_spec.rb +8 -2
  70. data/spec/scale_linear_spec.rb +7 -1
  71. data/spec/scale_ordinal_spec.rb +4 -0
  72. data/spec/spec_helper.rb +1 -1
  73. data/web/build_site.rb +6 -2
  74. data/web/index.haml +2 -2
  75. metadata +61 -68
  76. metadata.gz.sig +0 -0
  77. data/examples/treemap/treemap.rb +0 -29
  78. data/examples/treemap/treemap_data.rb +0 -285
@@ -123,8 +123,8 @@ module Rubyvis
123
123
  def self.range(*arguments)
124
124
  start, stop, step=arguments
125
125
  if (arguments.size == 1)
126
- stop = start;
127
- start = 0;
126
+ stop = start
127
+ start = 0
128
128
  end
129
129
  step||= 1
130
130
  raise "range must be finite" if ((stop - start) / step.to_f).infinite?
@@ -32,8 +32,10 @@ module Rubyvis
32
32
  end
33
33
 
34
34
  require 'rubyvis/layout/stack'
35
+ require 'rubyvis/layout/grid'
35
36
  require 'rubyvis/layout/network'
36
37
  require 'rubyvis/layout/hierarchy'
38
+ require 'rubyvis/layout/tree'
37
39
  require 'rubyvis/layout/treemap'
38
40
  require 'rubyvis/layout/partition'
39
41
  require 'rubyvis/layout/cluster'
@@ -0,0 +1,105 @@
1
+ module Rubyvis
2
+ class Layout
3
+ # Alias for Rubyvis::Layout::Grid
4
+ def self.Grid
5
+ Rubyvis::Layout::Grid
6
+ end
7
+
8
+ # Implements a grid layout with regularly-sized rows and columns. The
9
+ # number of rows and columns are determined from their respective
10
+ # properties. For example, the 2×3 array:
11
+ #
12
+ # <pre>1 2 3
13
+ # 4 5 6</pre>
14
+ #
15
+ # can be represented using the <tt>rows</tt> property as:
16
+ #
17
+ # <pre>[[1, 2, 3], [4, 5, 6]]</pre>
18
+ #
19
+ # If your data is in column-major order, you can equivalently use the
20
+ # <tt>columns</tt> property. If the <tt>rows</tt> property is an array, it
21
+ # takes priority over the <tt>columns</tt> property. The data is implicitly
22
+ # transposed, as if the {@link pv.transpose} operator were applied.
23
+ #
24
+ # <p>This layout exports a single <tt>cell</tt> mark prototype, which is
25
+ # intended to be used with a bar, panel, layout, or subclass thereof. The data
26
+ # property of the cell prototype is defined as the elements in the array. For
27
+ # example, if the array is a two-dimensional array of values in the range
28
+ # [0,1], a simple heatmap can be generated as:
29
+ #
30
+ # <pre>vis.add(pv.Layout.Grid)
31
+ # .rows(arrays)
32
+ # .cell.add(pv.Bar)
33
+ # .fillStyle(pv.ramp("white", "black"))</pre>
34
+ #
35
+ # The grid subdivides the full width and height of the parent panel into equal
36
+ # rectangles. Note, however, that for large, interactive, or animated heatmaps,
37
+ # you may see significantly better performance through dynamic {@link pv.Image}
38
+ # generation.
39
+ #
40
+ # <p>For irregular grids using value-based spatial partitioning, see {@link
41
+ # pv.Layout.Treemap}.
42
+
43
+
44
+
45
+ class Grid < Layout
46
+ attr_accessor :_grid
47
+ attr_accessor :cell
48
+ @properties=Layout.properties.dup
49
+ def initialize
50
+ super
51
+ @cell=_cell
52
+ end
53
+ def _cell
54
+ that=self
55
+ m=Rubyvis::Mark.new().
56
+ data(lambda {that.scene[that.index]._grid}).
57
+ width(lambda {that.width/that.cols.to_f}).
58
+ height(lambda {that.height/that.rows.to_f}).
59
+ left(lambda {(that.width/that.cols.to_f)*(self.index % that.cols)}).
60
+ top(lambda {(that.height/that.rows.to_f)*(self.index / that.cols).floor})
61
+ m.parent=self
62
+ m
63
+ end
64
+ private :_cell
65
+
66
+
67
+ ##
68
+ # :attr: rows
69
+ # The number of rows. This property can also be specified as the data in
70
+ # row-major order; in this case, the rows property is implicitly set to the
71
+ # length of the array, and the cols property is set to the length of the first
72
+ # element in the array.
73
+ #
74
+
75
+ ##
76
+ # :attr: cols
77
+ #
78
+ # The number of columns. This property can also be specified as the data in
79
+ # column-major order; in this case, the cols property is implicitly set to the
80
+ # length of the array, and the rows property is set to the length of the first
81
+ # element in the array.
82
+ #
83
+
84
+ attr_accessor_dsl :rows, :cols
85
+ def self.defaults
86
+ Rubyvis::Layout::Grid.new.mark_extend(Rubyvis::Layout.defaults).
87
+ rows(1).
88
+ cols(1)
89
+ end
90
+ def build_implied(s)
91
+ layout_build_implied(s)
92
+ r=s.rows
93
+ c=s.cols
94
+ r=Rubyvis.transpose(c) if c.is_a? Array
95
+ if r.is_a? Array
96
+ s._grid=Rubyvis.blend(r)
97
+ s.rows=r.size
98
+ s.cols=r[0] ? r[0].size : 0
99
+ else
100
+ s._grid=Rubyvis.repeat([s.data],r*c)
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -1,6 +1,6 @@
1
1
  module Rubyvis
2
2
  class Layout
3
- # Alias for Rubyvis::Layout::Indent
3
+ # Alias for Rubyvis::Layout::Indent
4
4
  def self.Pack
5
5
  Rubyvis::Layout::Pack
6
6
  end
@@ -37,7 +37,7 @@ module Rubyvis
37
37
  # H. Wang, G. Dai, and H. Wang, ACM CHI 2006.
38
38
  #/
39
39
  class Pack < Hierarchy
40
- @properties=Hierarchy.properties.dup
40
+ @properties=Hierarchy.properties.dup
41
41
  def initialize
42
42
  super
43
43
  @node.
@@ -45,15 +45,15 @@ module Rubyvis
45
45
  stroke_style("rgb(31, 119, 180)").
46
46
  fill_style("rgba(31, 119, 180, 0.25)")
47
47
 
48
-
49
- @node_label.text_align("center")
50
-
48
+
49
+ @node_label.text_align("center")
50
+
51
51
  @link=nil
52
-
52
+
53
53
  @radius = lambda { 1 }
54
54
  end
55
-
56
-
55
+
56
+
57
57
  ##
58
58
  # :attr: spacing
59
59
  # The spacing parameter; defaults to 1, which provides a little bit of padding
@@ -62,7 +62,7 @@ module Rubyvis
62
62
  # nodes as large as possible, with no padding on enclosing circles.
63
63
  #
64
64
  # @type number
65
-
65
+
66
66
  ##
67
67
  # :attr: order
68
68
  # The sibling node order. The default order is <tt>null</tt>, which means to
@@ -73,10 +73,10 @@ module Rubyvis
73
73
  # beforehand using the {@link pv.Dom} operator.
74
74
  #
75
75
  # @see pv.Dom.Node#sort
76
-
77
-
76
+
77
+
78
78
  attr_accessor_dsl :spacing, :order
79
-
79
+
80
80
  ##
81
81
  # Default properties for circle-packing layouts. The default spacing parameter
82
82
  # is 1 and the default order is "ascending".
@@ -86,11 +86,11 @@ module Rubyvis
86
86
  spacing(1).
87
87
  order("ascending")
88
88
  end
89
-
90
-
89
+
90
+
91
91
  # TODO is it possible for spacing to operate in pixel space?
92
92
  # Right now it appears to be multiples of the smallest radius.
93
-
93
+
94
94
  ##
95
95
  # Specifies the sizing function. By default, a sizing function is disabled and
96
96
  # all nodes are given constant size. The sizing function is invoked for each
@@ -109,7 +109,7 @@ module Rubyvis
109
109
  # @returns {pv.Layout.Pack} this.
110
110
  def size(f)
111
111
  if f.is_a? Proc
112
- @radius=lambda {|*args| Math.sqrt(f.js_apply(self,args))}
112
+ @radius=lambda {|*args| Math.sqrt(f.js_apply(self,args))}
113
113
  else
114
114
  f=Math.sqrt(f)
115
115
  @radius=lambda {f}
@@ -117,7 +117,7 @@ module Rubyvis
117
117
  self
118
118
  end
119
119
  ## @private Compute the radii of the leaf nodes. #/
120
-
120
+
121
121
  def radii(nodes)
122
122
  stack=Mark.stack
123
123
  stack.unshift(nil)
@@ -138,7 +138,7 @@ module Rubyvis
138
138
  nodes.push(c)
139
139
  c=c.next_sibling
140
140
  end
141
-
141
+
142
142
  # Sort.
143
143
  case @s.order
144
144
  when "ascending"
@@ -148,7 +148,7 @@ module Rubyvis
148
148
  when 'reverse'
149
149
  nodes.reverse
150
150
  end
151
-
151
+
152
152
  return pack_circle(nodes)
153
153
  end
154
154
  def bound(n)
@@ -164,7 +164,7 @@ module Rubyvis
164
164
  b.n = c
165
165
  c._p = b
166
166
  end
167
- def splice(a, b)
167
+ def splice(a, b)
168
168
  a.n = b
169
169
  b._p = a
170
170
  end
@@ -174,7 +174,7 @@ module Rubyvis
174
174
  dr = a.radius + b.radius
175
175
  (dr * dr - dx * dx - dy * dy) > 0.001 # within epsilon
176
176
  end
177
-
177
+
178
178
  ## @private #/
179
179
  def place(a, b, c)
180
180
  da = b.radius + c.radius
@@ -183,20 +183,19 @@ module Rubyvis
183
183
  dy = b.y - a.y
184
184
  dc = Math.sqrt(dx * dx + dy * dy)
185
185
  cos = (db * db + dc * dc - da * da) / (2.0 * db * dc)
186
-
187
186
  theta = Math.acos(cos)
188
187
  x = cos * db
189
188
  h = Math.sin(theta) * db
190
- dx /= dc
191
- dy /= dc
189
+ dx = dx/dc
190
+ dy = dy/dc
192
191
  c.x = a.x + x * dx + h * dy
193
192
  c.y = a.y + x * dy - h * dx
194
193
  end
195
-
194
+
196
195
  # @private #/
197
- def transform(n, x, y, k)
196
+ def transform(n, x, y, k)
198
197
  c=n.first_child
199
- while(c) do
198
+ while(c) do
200
199
  c.x += n.x
201
200
  c.y += n.y
202
201
  transform(c, x, y, k)
@@ -207,29 +206,29 @@ module Rubyvis
207
206
  n.radius *= k
208
207
  n.mid_angle=0 # Undefined on protovis
209
208
  end
210
-
211
209
 
212
- def pack_circle(nodes)
210
+
211
+ def pack_circle(nodes)
213
212
  @x_min = Infinity
214
213
  @x_max = -Infinity
215
214
  @y_min = Infinity
216
215
  @y_max = -Infinity
217
216
  a=b=c=j=k=nil
218
-
219
-
217
+
218
+
220
219
  # Create first node.
221
220
  a = nodes[0];
222
221
  a.x = -a.radius
223
222
  a.y = 0
224
223
  bound(a)
225
-
224
+
226
225
  # Create second node. #/
227
226
  if (nodes.size > 1)
228
227
  b = nodes[1]
229
228
  b.x = b.radius
230
229
  b.y = 0
231
230
  bound(b)
232
-
231
+
233
232
  # Create third node and build chain.
234
233
  if (nodes.size > 2)
235
234
  c = nodes[2]
@@ -239,35 +238,35 @@ module Rubyvis
239
238
  a._p = c
240
239
  insert(c, b)
241
240
  b = a.n
242
-
241
+
243
242
  # Now iterate through the rest.
244
243
  i=3
245
- while(i<nodes.size) do
244
+ while(i < nodes.size) do
246
245
  c=nodes[i]
247
246
  place(a, b, c)
248
-
247
+
249
248
  # Search for the closest intersection. #/
250
249
  isect = 0
251
250
  s1 = 1
252
251
  s2 = 1
253
-
252
+
254
253
  j=b.n
255
254
  while(j!=b) do
256
- if (intersects(j,c))
257
- isect=1;
258
- break;
255
+ if (intersects(j, c))
256
+ isect=1
257
+ break
259
258
  end
260
259
  j=j.n
261
260
  s1+=1
262
261
  end
263
-
262
+
264
263
  if isect==1
265
264
  k=a._p
266
- while(k!=k._p) do
265
+ while(k!=j._p) do
267
266
  if(intersects(k,c))
268
- if(s2<s1)
267
+ if(s2 < s1)
269
268
  isect=-1
270
- k=j
269
+ j=k
271
270
  end
272
271
  break
273
272
  end
@@ -275,10 +274,10 @@ module Rubyvis
275
274
  s2+=1
276
275
  end
277
276
  end
278
-
279
-
277
+
278
+
280
279
  # Update node chain. #/
281
- if (isect == 0)
280
+ if (isect == 0)
282
281
  insert(a, c)
283
282
  b = c
284
283
  bound(c)
@@ -293,11 +292,11 @@ module Rubyvis
293
292
  end
294
293
  i+=1
295
294
  end
296
-
297
-
295
+
296
+
298
297
  end
299
298
  end
300
-
299
+
301
300
  # Re-center the circles and return the encompassing radius. #/
302
301
  cx = (@x_min + @x_max) / 2.0
303
302
  cy = (@y_min + @y_max) / 2.0
@@ -309,20 +308,20 @@ module Rubyvis
309
308
  end
310
309
  cr + @s.spacing
311
310
  end
312
-
313
-
311
+
312
+
314
313
  def build_implied(s)
315
314
  return nil if hierarchy_build_implied(s)
316
315
  @s=s
317
316
  nodes = s.nodes
318
317
  root = nodes[0]
319
318
  radii(nodes)
320
-
319
+
321
320
  # Recursively compute the layout. #/
322
321
  root.x = 0
323
322
  root.y = 0
324
323
  root.radius = pack_tree(root)
325
-
324
+
326
325
  w = self.width
327
326
  h = self.height
328
327
  k = 1.0 / [2.0 * root.radius / w, 2.0 * root.radius / h].max
@@ -79,7 +79,10 @@ module Rubyvis
79
79
  attr_accessor :_x, :_y, :_values, :prop
80
80
 
81
81
  def self.defaults
82
- Stack.new.mark_extend(Layout.defaults).orient("bottom-left").offset("zero").layers([[]])
82
+ Stack.new.mark_extend(Layout.defaults).
83
+ orient("bottom-left").
84
+ offset("zero").
85
+ layers([[]])
83
86
  end
84
87
 
85
88
  # Constructs a new, empty stack layout. Layouts are not typically constructed
@@ -90,8 +93,8 @@ module Rubyvis
90
93
  @none=lambda {nil}
91
94
  @prop = {"t"=> @none, "l"=> @none, "r"=> @none, "b"=> @none, "w"=> @none, "h"=> @none}
92
95
  @values=nil
93
- @_x=lambda {return 0}
94
- @_y=lambda {return 0}
96
+ @_x=lambda {0}
97
+ @_y=lambda {0}
95
98
  @_values=Rubyvis.identity
96
99
  end
97
100
  def x(f)
@@ -123,7 +126,7 @@ module Rubyvis
123
126
 
124
127
  def build_implied(s)
125
128
  # puts "Build stack" if $DEBUG
126
- panel_build_implied(s)
129
+ layout_build_implied(s)
127
130
  data = s.layers
128
131
  n = data.size
129
132
  m = nil
@@ -149,20 +152,20 @@ module Rubyvis
149
152
  stack.unshift(nil)
150
153
  values = []
151
154
  n.times {|i|
152
- dy[i] = []
153
- y[i] = []
154
- o.parent.index = i
155
- stack[0] = data[i]
156
- values[i] = self._values.js_apply(o.parent, stack);
157
- m = values[i].size if (i==0)
158
- stack.unshift(nil)
159
- m.times {|j|
160
- stack[0] = values[i][j]
161
- o.index = j
162
- x[j] = self._x.js_apply(o, stack) if i==0
163
- dy[i][j] = self._y.js_apply(o, stack)
164
- }
165
- stack.shift()
155
+ dy[i] = []
156
+ y[i] = []
157
+ o.parent.index = i
158
+ stack[0] = data[i]
159
+ values[i] = self._values.js_apply(o.parent, stack)
160
+ m = values[i].size if (i==0)
161
+ stack.unshift(nil)
162
+ m.times {|j|
163
+ stack[0] = values[i][j]
164
+ o.index = j
165
+ x[j] = self._x.js_apply(o, stack) if i==0
166
+ dy[i][j] = self._y.js_apply(o, stack)
167
+ }
168
+ stack.shift()
166
169
  }
167
170
  stack.shift()
168
171
 
@@ -250,11 +253,11 @@ module Rubyvis
250
253
  # Propagate the offset to the other series. */
251
254
  m.times {|j|
252
255
  o = y[_index[0]][j]
253
- (1...n).each {|i|
254
-
255
- o += dy[_index[i - 1]][j]
256
- y[_index[i]][j] = o
257
- }
256
+ (1...n).each {|i|
257
+
258
+ o += dy[_index[i - 1]][j]
259
+ y[_index[i]][j] = o
260
+ }
258
261
  }
259
262
 
260
263
  # /* Find the property definitions for dynamic substitution. */
@@ -265,7 +268,6 @@ module Rubyvis
265
268
  py = orient[0,1]
266
269
 
267
270
  @values=values
268
-
269
271
  @prop.each {|k,v|
270
272
  @prop[k]=@none
271
273
  }