rubyvis 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +3 -2
- data/History.txt +6 -0
- data/Rakefile +1 -1
- data/examples/5_pv_hierarchies/bubble_charts.rb +1 -1
- data/examples/5_pv_hierarchies/bubble_charts_matrix.rb +1 -1
- data/examples/5_pv_hierarchies/circle_packing.rb +1 -1
- data/examples/5_pv_hierarchies/dendogram.rb +1 -1
- data/examples/5_pv_hierarchies/icicle.rb +1 -1
- data/examples/5_pv_hierarchies/indent.rb +1 -1
- data/examples/5_pv_hierarchies/node_link_tree.rb +1 -1
- data/examples/5_pv_hierarchies/sunburst.rb +1 -1
- data/examples/5_pv_hierarchies/treemap.rb +1 -1
- data/lib/rubyvis.rb +1 -1
- data/lib/rubyvis/color/color.rb +35 -34
- data/lib/rubyvis/color/colors.rb +1 -1
- data/lib/rubyvis/internals.rb +2 -2
- data/lib/rubyvis/layout.rb +4 -1
- data/lib/rubyvis/layout/matrix.rb +105 -105
- data/lib/rubyvis/layout/network.rb +3 -3
- data/lib/rubyvis/mark.rb +5 -4
- data/lib/rubyvis/mark/area.rb +1 -1
- data/lib/rubyvis/mark/image.rb +1 -1
- data/lib/rubyvis/mark/rule.rb +2 -2
- data/lib/rubyvis/mark/shorcut_methods.rb +1 -0
- data/lib/rubyvis/mark/wedge.rb +31 -22
- data/lib/rubyvis/nest.rb +1 -1
- data/lib/rubyvis/scale/ordinal.rb +1 -1
- data/lib/rubyvis/scale/quantitative.rb +2 -1
- data/lib/rubyvis/scene/svg_curve.rb +24 -14
- data/lib/rubyvis/scene/svg_dot.rb +1 -1
- data/lib/rubyvis/scene/svg_label.rb +3 -2
- data/lib/rubyvis/scene/svg_scene.rb +6 -12
- data/spec/anchor_spec.rb +3 -3
- data/spec/area_spec.rb +22 -22
- data/spec/dot_spec.rb +9 -9
- data/spec/layout_arc_spec.rb +8 -8
- data/spec/layout_cluster_spec.rb +7 -6
- data/spec/layout_grid_spec.rb +18 -18
- data/spec/layout_indent_spec.rb +6 -6
- data/spec/layout_matrix_spec.rb +9 -9
- data/spec/layout_pack_spec.rb +6 -6
- data/spec/layout_partition_spec.rb +6 -6
- data/spec/layout_stack_spec.rb +10 -10
- data/spec/layout_tree_spec.rb +6 -6
- data/spec/layout_treemap_spec.rb +4 -4
- data/spec/line_spec.rb +14 -14
- data/spec/nest_spec.rb +2 -2
- data/spec/rule_spec.rb +11 -12
- data/spec/spec_helper.rb +8 -7
- data/spec/wedge_spec.rb +22 -22
- data/web/Rakefile +4 -1
- metadata +18 -5
- metadata.gz.sig +0 -0
@@ -121,7 +121,7 @@ module Rubyvis
|
|
121
121
|
|
122
122
|
|
123
123
|
def _link # :nodoc:
|
124
|
-
that=self
|
124
|
+
#that=self
|
125
125
|
l=Mark.new().
|
126
126
|
mark_extend(@node).
|
127
127
|
data(lambda {|d| [d.source_node, d.target_node] }).
|
@@ -135,7 +135,7 @@ module Rubyvis
|
|
135
135
|
|
136
136
|
|
137
137
|
def _node_label #:nodoc:
|
138
|
-
that=self
|
138
|
+
#that=self
|
139
139
|
nl=Mark.new().
|
140
140
|
mark_extend(@node).
|
141
141
|
text_margin(7).
|
@@ -185,7 +185,7 @@ module Rubyvis
|
|
185
185
|
|
186
186
|
|
187
187
|
attr_accessor_dsl [:links, lambda {|v|
|
188
|
-
|
188
|
+
# out=[]
|
189
189
|
v.map {|d|
|
190
190
|
if !d.link_value.is_a? Numeric
|
191
191
|
d.link_value = !d.value.is_a?(Numeric) ? 1 : d.value
|
data/lib/rubyvis/mark.rb
CHANGED
@@ -184,7 +184,8 @@ module Rubyvis
|
|
184
184
|
def self.property_method(name, _def, func=nil, klass=nil)
|
185
185
|
return if klass.method_defined? name
|
186
186
|
klass.send(:define_method, name) do |*arguments,&block|
|
187
|
-
v
|
187
|
+
v=arguments[0]
|
188
|
+
#v,dummy = arguments
|
188
189
|
if block
|
189
190
|
v=block
|
190
191
|
end
|
@@ -803,8 +804,8 @@ module Rubyvis
|
|
803
804
|
stack.shift
|
804
805
|
else
|
805
806
|
mark.build
|
806
|
-
Rubyvis.
|
807
|
-
Rubyvis.
|
807
|
+
Rubyvis::SvgScene.scale = scale;
|
808
|
+
Rubyvis::SvgScene.update_all(mark.scene);
|
808
809
|
end
|
809
810
|
mark.scale=nil
|
810
811
|
end
|
@@ -947,7 +948,7 @@ module Rubyvis
|
|
947
948
|
end while(mark=mark.parent)
|
948
949
|
end
|
949
950
|
def context(scene, index, f) # :nodoc:
|
950
|
-
proto=Mark
|
951
|
+
#proto=Mark
|
951
952
|
stack=Mark.stack
|
952
953
|
oscene=Mark.scene
|
953
954
|
oindex=Mark.index
|
data/lib/rubyvis/mark/area.rb
CHANGED
data/lib/rubyvis/mark/image.rb
CHANGED
@@ -61,7 +61,7 @@ module Rubyvis
|
|
61
61
|
# though this typically results in slower performance.
|
62
62
|
|
63
63
|
def dynamic_image(f)
|
64
|
-
f,dummy=arguments
|
64
|
+
#f,dummy=arguments
|
65
65
|
@_image = lambda {|*args|
|
66
66
|
c=f.js_apply(self,args)
|
67
67
|
c.nil? ? pv.Color.transparent : (c.is_a?(String) ? Rubyvis.color(c) : c )
|
data/lib/rubyvis/mark/rule.rb
CHANGED
data/lib/rubyvis/mark/wedge.rb
CHANGED
@@ -31,63 +31,72 @@ module Rubyvis
|
|
31
31
|
mark_anchor(name).left(lambda {
|
32
32
|
s = self.scene.target[self.index];
|
33
33
|
if (partial.call(s))
|
34
|
-
|
35
34
|
case (self.name())
|
36
35
|
when "outer"
|
37
|
-
|
36
|
+
s.left + s.outer_radius * Math.cos(mid_angle.call(s))
|
38
37
|
when "inner"
|
39
|
-
|
38
|
+
s.left + s.inner_radius * Math.cos(mid_angle.call(s))
|
40
39
|
when "start"
|
41
|
-
|
40
|
+
s.left + mid_radius.call(s) * Math.cos(s.start_angle)
|
42
41
|
when "center"
|
43
|
-
|
42
|
+
s.left + mid_radius.call(s) * Math.cos(mid_angle.call(s))
|
44
43
|
when "end"
|
45
|
-
|
44
|
+
s.left + mid_radius.call(s) * Math.cos(s.end_angle)
|
45
|
+
else
|
46
|
+
s.left
|
46
47
|
end
|
47
|
-
|
48
|
-
|
48
|
+
else
|
49
|
+
s.left
|
50
|
+
end
|
49
51
|
}).top(lambda {
|
50
52
|
s = self.scene.target[self.index];
|
51
53
|
if (partial.call(s))
|
52
54
|
case (self.name())
|
53
55
|
when "outer"
|
54
|
-
|
56
|
+
s.top + s.outer_radius * Math.sin(mid_angle.call(s))
|
55
57
|
when "inner"
|
56
|
-
|
58
|
+
s.top + s.inner_radius * Math.sin(mid_angle.call(s))
|
57
59
|
when "start"
|
58
|
-
|
60
|
+
s.top + mid_radius.call(s) * Math.sin(s.start_angle)
|
59
61
|
when "center"
|
60
|
-
|
62
|
+
s.top + mid_radius.call(s) * Math.sin(mid_angle.call(s))
|
61
63
|
when "end"
|
62
|
-
|
64
|
+
s.top + mid_radius.call(s) * Math.sin(s.end_angle)
|
65
|
+
else
|
66
|
+
s.top
|
63
67
|
end
|
68
|
+
else
|
69
|
+
s.top
|
64
70
|
end
|
65
|
-
return s.top;
|
66
71
|
|
67
72
|
}).text_align(lambda {
|
68
73
|
s = self.scene.target[self.index];
|
69
74
|
if (partial.call(s))
|
70
75
|
case (self.name())
|
71
76
|
when 'outer'
|
72
|
-
|
77
|
+
that.upright(mid_angle.call(s)) ? 'right':'left'
|
73
78
|
when 'inner'
|
74
|
-
|
75
|
-
|
79
|
+
that.upright(mid_angle.call(s)) ? 'left':'right'
|
80
|
+
else
|
81
|
+
'center'
|
76
82
|
end
|
83
|
+
else
|
84
|
+
'center'
|
77
85
|
end
|
78
|
-
return 'center'
|
79
86
|
}).text_baseline(lambda {
|
80
87
|
s = self.scene.target[self.index];
|
81
88
|
if (partial.call(s))
|
82
89
|
case (self.name())
|
83
90
|
when 'start'
|
84
|
-
|
91
|
+
that.upright(s.start_angle) ? 'top':'bottom'
|
85
92
|
when 'end'
|
86
|
-
|
87
|
-
|
93
|
+
that.upright(s.end_angle) ? 'bottom':'top'
|
94
|
+
else
|
95
|
+
'middle'
|
88
96
|
end
|
97
|
+
else
|
98
|
+
'middle'
|
89
99
|
end
|
90
|
-
return 'middle'
|
91
100
|
}).text_angle(lambda {
|
92
101
|
s = self.scene.target[self.index];
|
93
102
|
a=0
|
data/lib/rubyvis/nest.rb
CHANGED
@@ -393,7 +393,8 @@ module Rubyvis
|
|
393
393
|
|
394
394
|
@tick_format= Rubyvis.Format.number.fraction_digits([0, -(Rubyvis.log(step, 10) + 0.01).floor].max).to_proc
|
395
395
|
|
396
|
-
ticks = Rubyvis.range(start, _end + step, step)
|
396
|
+
ticks = Rubyvis.range(start, _end + step, step)
|
397
|
+
|
397
398
|
return reverse ? ticks.reverse() : ticks;
|
398
399
|
end
|
399
400
|
|
@@ -258,11 +258,14 @@ module Rubyvis::SvgScene
|
|
258
258
|
d = []
|
259
259
|
m = []
|
260
260
|
dx = []
|
261
|
-
k=0
|
261
|
+
#k=0
|
262
262
|
|
263
263
|
#/* Compute the slopes of the secant lines between successive points. */
|
264
264
|
|
265
|
-
|
265
|
+
|
266
|
+
0.upto(points.size-2) do |k|
|
267
|
+
|
268
|
+
# while(k < points.size-1) do
|
266
269
|
d[k] = (points[k+1].top - points[k].top) / (points[k+1].left - points[k].left).to_f
|
267
270
|
k+=1
|
268
271
|
end
|
@@ -270,31 +273,38 @@ module Rubyvis::SvgScene
|
|
270
273
|
#/* Initialize the tangents at every point as the average of the secants. */
|
271
274
|
m[0] = d[0]
|
272
275
|
dx[0] = points[1].left - points[0].left
|
276
|
+
|
277
|
+
|
273
278
|
1.upto(points.size-2) {|k|
|
274
279
|
m[k] = (d[k-1]+d[k]) / 2.0
|
275
280
|
dx[k] = (points[k+1].left - points[k-1].left) / 2.0
|
276
281
|
}
|
282
|
+
|
283
|
+
k=points.size-1
|
284
|
+
|
277
285
|
m[k] = d[k-1];
|
278
286
|
dx[k] = (points[k].left - points[k-1].left);
|
279
287
|
|
280
288
|
# /* Step 3. Very important, step 3. Yep. Wouldn't miss it. */
|
281
|
-
(points.size-1).times {|
|
282
|
-
if d[
|
283
|
-
m[
|
284
|
-
m[
|
289
|
+
(points.size-1).times {|kk|
|
290
|
+
if d[kk] == 0
|
291
|
+
m[ kk ] = 0;
|
292
|
+
m[kk + 1] = 0;
|
285
293
|
end
|
286
294
|
}
|
287
295
|
|
288
296
|
# /* Step 4 + 5. Out of 5 or more steps. */
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
297
|
+
|
298
|
+
|
299
|
+
(points.size-1).times {|kk|
|
300
|
+
next if ((m[kk].abs < 1e-5) or (m[kk+1].abs < 1e-5))
|
301
|
+
akk = m[kk] / d[kk].to_f
|
302
|
+
bkk = m[kk + 1] / d[kk].to_f
|
303
|
+
s = akk * akk + bkk * bkk; # monotone constant (?)
|
294
304
|
if (s > 9)
|
295
|
-
|
296
|
-
m[
|
297
|
-
m[
|
305
|
+
tkk = 3.0 / Math.sqrt(s)
|
306
|
+
m[kk] = tkk * akk * d[kk]
|
307
|
+
m[kk + 1] = tkk * bkk * d[kk]
|
298
308
|
end
|
299
309
|
}
|
300
310
|
len=nil;
|
@@ -39,7 +39,7 @@ module Rubyvis
|
|
39
39
|
"pointer-events"=> s.events,
|
40
40
|
"cursor"=> s.cursor,
|
41
41
|
"fill"=> fill.color,
|
42
|
-
"fill-opacity"=> (fill.opacity==0) ? nil :fill.opacity,
|
42
|
+
"fill-opacity"=> (fill.opacity==0) ? nil : fill.opacity,
|
43
43
|
"stroke"=> stroke.color,
|
44
44
|
"stroke-opacity"=> (stroke.opacity==0) ? nil : stroke.opacity,
|
45
45
|
"stroke-width"=> (stroke.opacity!=0) ? s.line_width / self.scale : nil
|
@@ -40,8 +40,9 @@ module Rubyvis
|
|
40
40
|
"fill-opacity"=> fill.opacity==0 ? nil : fill.opacity,
|
41
41
|
"text-anchor"=> anchor
|
42
42
|
}, {
|
43
|
-
"font"=> s.font, "text-shadow"=> s.text_shadow, "text-decoration"=> s.text_decoration
|
44
|
-
|
43
|
+
"font"=> s.font, "text-shadow"=> s.text_shadow, "text-decoration"=> s.text_decoration})
|
44
|
+
|
45
|
+
e.text=s.text.frozen? ? s.text.dup : s.text
|
45
46
|
|
46
47
|
|
47
48
|
e=SvgScene.append(e,scenes,i)
|
@@ -14,9 +14,6 @@ class REXML::Element #:nodoc:
|
|
14
14
|
end
|
15
15
|
|
16
16
|
module Rubyvis
|
17
|
-
def self.Scene # :nodoc:
|
18
|
-
Rubyvis::SvgScene
|
19
|
-
end
|
20
17
|
module SvgScene # :nodoc:
|
21
18
|
#include REXML
|
22
19
|
def self.svg
|
@@ -38,8 +35,7 @@ module Rubyvis
|
|
38
35
|
def self.scale=(v)
|
39
36
|
@scale=v
|
40
37
|
end
|
41
|
-
|
42
|
-
svg={
|
38
|
+
IMPLICIT={:svg=>{
|
43
39
|
"shape-rendering"=> "auto",
|
44
40
|
"pointer-events"=> "painted",
|
45
41
|
"x"=> 0,
|
@@ -53,11 +49,9 @@ module Rubyvis
|
|
53
49
|
"stroke-opacity"=> 1,
|
54
50
|
"stroke-width"=> 1.5,
|
55
51
|
"stroke-linejoin"=> "miter"
|
56
|
-
}
|
57
|
-
|
58
|
-
|
59
|
-
{:svg=>svg,:css=>css}
|
60
|
-
end
|
52
|
+
},:css=>{"font"=>"10px sans-serif"}
|
53
|
+
}
|
54
|
+
|
61
55
|
def self.update_all(scenes)
|
62
56
|
puts "update_all: #{scenes.inspect}" if $DEBUG
|
63
57
|
if (scenes.size>0 and scenes[0].reverse and scenes.type!='line' and scenes.type!='area')
|
@@ -130,7 +124,7 @@ module Rubyvis
|
|
130
124
|
e = self.create(type)
|
131
125
|
end
|
132
126
|
attributes.each {|name,value|
|
133
|
-
value = nil if (value ==
|
127
|
+
value = nil if (value == IMPLICIT[:svg][name])
|
134
128
|
if (value.nil?)
|
135
129
|
e.delete_attribute(name)
|
136
130
|
else
|
@@ -147,7 +141,7 @@ module Rubyvis
|
|
147
141
|
array_styles[$1]=$2
|
148
142
|
}
|
149
143
|
style.each {|name,value|
|
150
|
-
value=nil if value==
|
144
|
+
value=nil if value==IMPLICIT[:css][name]
|
151
145
|
if (value.nil?)
|
152
146
|
array_styles.delete(name)
|
153
147
|
else
|
data/spec/anchor_spec.rb
CHANGED
@@ -107,9 +107,9 @@ describe Rubyvis::Anchor do
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
it "should render equal to protovis 'anchor.html' example" do
|
110
|
-
@vis = Rubyvis::Panel.new()
|
111
|
-
|
112
|
-
|
110
|
+
@vis = Rubyvis::Panel.new().
|
111
|
+
width(200).
|
112
|
+
height(200)
|
113
113
|
|
114
114
|
@vis.add(Rubyvis::Bar).
|
115
115
|
fill_style("#ccc").
|
data/spec/area_spec.rb
CHANGED
@@ -10,21 +10,21 @@ describe Rubyvis::Area do
|
|
10
10
|
end
|
11
11
|
it "should render equal to protovis 'area-segmented.html' test" do
|
12
12
|
data=Rubyvis.range(0, 6, 0.1).map {|x| Math.sin(x)}
|
13
|
-
vis = Rubyvis.Panel.new()
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
vis = Rubyvis.Panel.new().
|
14
|
+
width(500).
|
15
|
+
height(200).
|
16
|
+
top(50).
|
17
|
+
bottom(50).
|
18
|
+
left(10).
|
19
|
+
right(10)
|
20
20
|
|
21
|
-
vis.add(Rubyvis::Area)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
vis.add(Rubyvis::Area).
|
22
|
+
segmented(true).
|
23
|
+
data(data).
|
24
|
+
bottom(0).
|
25
|
+
left(lambda {self.index / 59.0 * 500}).
|
26
|
+
height(lambda {|d| (d + 1) / 2.0 * 200 + 50}).
|
27
|
+
fill_style(lambda {|d| "hsl(#{(d + 1) * 180.0},50,50)"})
|
28
28
|
vis.render()
|
29
29
|
pv_out=fixture_svg_read("area_segmented.svg")
|
30
30
|
vis.to_svg.should have_same_svg_elements(pv_out)
|
@@ -53,13 +53,13 @@ describe Rubyvis::Area do
|
|
53
53
|
interpolations=["linear","step-before","step-after", "basis", "cardinal", "monotone"]
|
54
54
|
|
55
55
|
#/* The root panel. */
|
56
|
-
vis = pv.Panel.new()
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
vis = pv.Panel.new().
|
57
|
+
width(w).
|
58
|
+
height(h).
|
59
|
+
bottom(20).
|
60
|
+
left(20).
|
61
|
+
right(10).
|
62
|
+
top(5)
|
63
63
|
|
64
64
|
interpolations.each_with_index do |inter,i|
|
65
65
|
n=i%2
|
@@ -74,7 +74,7 @@ describe Rubyvis::Area do
|
|
74
74
|
panel.add(Rubyvis::Area).data(data).
|
75
75
|
bottom(0).
|
76
76
|
segmented(true).
|
77
|
-
fill_style(lambda {
|
77
|
+
fill_style(lambda {color[self.index]}).
|
78
78
|
left(lambda {|d| x.scale(d.x)}).
|
79
79
|
height(lambda {|d| y.scale(d.y)}).
|
80
80
|
interpolate(inter)
|