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
data.tar.gz.sig
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
���œ(����l��W�3�w����r.�$�m�P_� ��>/�t[R�X�P1q�]�����QF'bVp�<:f�����>��q4�ĊD��v��H$��To�i4�G@������DCl"MzH�+9���94������`�ꩂCW#bBq+�{Ώt��,��t�y96
|
2
|
+
����g�^]q�S�U=*^!^-/9�q� ��F���
|
3
|
+
��r���G�%�V2�}g�����Ѿ���Ül
|
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 0.4.1 / 2011-01-26
|
2
|
+
* All tests run on ruby 1.8.7. Not all pass, because on ruby<1.9 hash order are not preserved
|
3
|
+
* Removed warnings for Ruby 1.9+
|
4
|
+
* Changed SvgScene.implicit and Color.names with constants
|
5
|
+
* Bug gix: Examples crashes on Ruby 1.9.3 because names of files are freezed and REXML try to change it
|
6
|
+
|
1
7
|
=== 0.4.0 / 2011-01-03
|
2
8
|
|
3
9
|
Massive bug fix. Please, update ASAP
|
data/Rakefile
CHANGED
@@ -16,7 +16,7 @@ h=Hoe.spec 'rubyvis' do
|
|
16
16
|
self.rspec_options << "-c" << "-b"
|
17
17
|
self.developer('Claudio Bustos', 'clbustos_at_gmail.com')
|
18
18
|
self.version=Rubyvis::VERSION
|
19
|
-
self.extra_dev_deps << ["coderay",">=0"] << ["haml",">=0"] << ["nokogiri", ">=0"] << ["rspec",">=2.0"]
|
19
|
+
self.extra_dev_deps << ["coderay",">=0"] << ["haml",">=0"] << ["nokogiri", ">=0"] << ["rspec",">=2.0"] << ["RedCloth",">=0"]
|
20
20
|
end
|
21
21
|
desc "Publicar docs en rubyforge"
|
22
22
|
task :publicar_docs => [:clean, :docs] do
|
@@ -18,7 +18,7 @@ def get_files(path)
|
|
18
18
|
h
|
19
19
|
end
|
20
20
|
|
21
|
-
files=get_files(File.dirname(__FILE__)+"/../../lib")
|
21
|
+
files=get_files(File.expand_path(File.dirname(__FILE__)+"/../../lib/"))
|
22
22
|
|
23
23
|
classes = Rubyvis.nodes(Rubyvis.flatten(files).leaf(lambda {|v| v.is_a? Numeric}).array)
|
24
24
|
|
data/lib/rubyvis.rb
CHANGED
@@ -32,7 +32,7 @@ require 'rubyvis/mark/shorcut_methods'
|
|
32
32
|
module Rubyvis
|
33
33
|
@document=nil
|
34
34
|
# Rubyvis version
|
35
|
-
VERSION = '0.4.
|
35
|
+
VERSION = '0.4.1'
|
36
36
|
# Protovis API on which current Rubyvis is based
|
37
37
|
PROTOVIS_API_VERSION='3.3'
|
38
38
|
# You actually can do it! http://snipplr.com/view/2137/uses-for-infinity-in-ruby/
|
data/lib/rubyvis/color/color.rb
CHANGED
@@ -53,7 +53,7 @@ module Rubyvis
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
named = Rubyvis::Color
|
56
|
+
named = Rubyvis::Color::NAMES[format.to_sym]
|
57
57
|
|
58
58
|
|
59
59
|
return Rubyvis.color(named) if (named)
|
@@ -88,41 +88,9 @@ module Rubyvis
|
|
88
88
|
# space is dependent on the implementing class; all colors support the
|
89
89
|
# Color.rgb() method to convert to RGB color space for interpolation.
|
90
90
|
class Color
|
91
|
-
# An opaque color format string, such as "#f00".
|
92
|
-
attr_reader :color
|
93
|
-
# The opacity, a float in [0, 1].
|
94
|
-
attr_reader :opacity
|
95
|
-
|
96
|
-
# Constructs a color with the specified color format string and opacity. This
|
97
|
-
# constructor should not be invoked directly; use Rubyvis.color instead.
|
98
|
-
def initialize(color,opacity)
|
99
|
-
@color=color
|
100
|
-
@opacity=opacity
|
101
|
-
end
|
102
|
-
# Returns a new color that is a brighter version of this color. The behavior of
|
103
|
-
# this method may vary slightly depending on the underlying color space.
|
104
|
-
# Although brighter and darker are inverse operations, the results of a series
|
105
|
-
# of invocations of these two methods might be inconsistent because of rounding
|
106
|
-
# errors.
|
107
|
-
# * @param [k] {number} an optional scale factor; defaults to 1.
|
108
|
-
def brighter(k)
|
109
|
-
self.rgb.brighter(k)
|
110
|
-
end
|
111
|
-
|
112
|
-
# Returns a new color that is a brighter version of this color. The behavior of
|
113
|
-
# this method may vary slightly depending on the underlying color space.
|
114
|
-
# Although brighter and darker are inverse operations, the results of a series
|
115
|
-
# of invocations of these two methods might be inconsistent because of rounding
|
116
|
-
# errors.
|
117
|
-
#
|
118
|
-
# * @param [k] {number} an optional scale factor; defaults to 1.
|
119
|
-
def darker(k)
|
120
|
-
self.rgb.darker(k)
|
121
|
-
end
|
122
91
|
|
123
92
|
# Association between names and colors
|
124
|
-
|
125
|
-
{
|
93
|
+
NAMES={
|
126
94
|
:aliceblue=>"#f0f8ff",
|
127
95
|
:antiquewhite=>"#faebd7",
|
128
96
|
:aqua=>"#00ffff",
|
@@ -271,7 +239,40 @@ module Rubyvis
|
|
271
239
|
:yellow=>"#ffff00",
|
272
240
|
:yellowgreen=>"#9acd32",
|
273
241
|
}
|
242
|
+
|
243
|
+
|
244
|
+
# An opaque color format string, such as "#f00".
|
245
|
+
attr_reader :color
|
246
|
+
# The opacity, a float in [0, 1].
|
247
|
+
attr_reader :opacity
|
248
|
+
|
249
|
+
# Constructs a color with the specified color format string and opacity. This
|
250
|
+
# constructor should not be invoked directly; use Rubyvis.color instead.
|
251
|
+
def initialize(color,opacity)
|
252
|
+
@color=color
|
253
|
+
@opacity=opacity
|
254
|
+
end
|
255
|
+
# Returns a new color that is a brighter version of this color. The behavior of
|
256
|
+
# this method may vary slightly depending on the underlying color space.
|
257
|
+
# Although brighter and darker are inverse operations, the results of a series
|
258
|
+
# of invocations of these two methods might be inconsistent because of rounding
|
259
|
+
# errors.
|
260
|
+
# * @param [k] {number} an optional scale factor; defaults to 1.
|
261
|
+
def brighter(k)
|
262
|
+
self.rgb.brighter(k)
|
263
|
+
end
|
264
|
+
|
265
|
+
# Returns a new color that is a brighter version of this color. The behavior of
|
266
|
+
# this method may vary slightly depending on the underlying color space.
|
267
|
+
# Although brighter and darker are inverse operations, the results of a series
|
268
|
+
# of invocations of these two methods might be inconsistent because of rounding
|
269
|
+
# errors.
|
270
|
+
#
|
271
|
+
# * @param [k] {number} an optional scale factor; defaults to 1.
|
272
|
+
def darker(k)
|
273
|
+
self.rgb.darker(k)
|
274
274
|
end
|
275
|
+
|
275
276
|
def self.transparent
|
276
277
|
Rubyvis.rgb(0,0,0,0)
|
277
278
|
end
|
data/lib/rubyvis/color/colors.rb
CHANGED
data/lib/rubyvis/internals.rb
CHANGED
@@ -70,7 +70,7 @@ module Rubyvis
|
|
70
70
|
norm.map {|x| x.quo(sum)}
|
71
71
|
end
|
72
72
|
def self.o_index(i)
|
73
|
-
|
73
|
+
OpenStruct.new :index=>i
|
74
74
|
end
|
75
75
|
def self.permute(array,indexes, f=nil)
|
76
76
|
f=Rubyvis.identity if f.nil?
|
@@ -127,7 +127,7 @@ module Rubyvis
|
|
127
127
|
start = 0
|
128
128
|
end
|
129
129
|
step||= 1
|
130
|
-
raise "range must be finite" if ((stop - start) / step.to_f).infinite?
|
130
|
+
raise "range must be finite" if ((stop.to_f - start.to_f) / step.to_f).infinite?
|
131
131
|
array = []
|
132
132
|
i = 0
|
133
133
|
stop = stop- (stop - start) * 1e-10 #// floating point precision!
|
data/lib/rubyvis/layout.rb
CHANGED
@@ -22,7 +22,10 @@ module Rubyvis
|
|
22
22
|
func=nil
|
23
23
|
end
|
24
24
|
@properties[name]=true
|
25
|
-
self.property_method(name,false, func, self)
|
25
|
+
self.property_method(name,false, func, self)
|
26
|
+
|
27
|
+
remove_method(name.to_s+"=") if public_method_defined? name.to_s+"="
|
28
|
+
|
26
29
|
define_method(name.to_s + "=") {|v|
|
27
30
|
self.send(name,v)
|
28
31
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Rubyvis
|
2
2
|
class Layout
|
3
|
-
# Alias for Rubyvis::Layout::Matrix
|
3
|
+
# Alias for Rubyvis::Layout::Matrix
|
4
4
|
def self.Matrix
|
5
5
|
Rubyvis::Layout::Matrix
|
6
6
|
end
|
@@ -53,16 +53,16 @@ module Rubyvis
|
|
53
53
|
end
|
54
54
|
# Deletes special add from network
|
55
55
|
def _link # :nodoc:
|
56
|
-
that=self
|
56
|
+
#that=self
|
57
57
|
l=Mark.new().
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
mark_extend(@node).
|
59
|
+
data(lambda {|d| [d.source_node, d.target_node] }).
|
60
|
+
fill_style(nil).
|
61
|
+
line_width(lambda {|d,_p| _p.link_value * 1.5 }).
|
62
|
+
stroke_style("rgba(0,0,0,.2)")
|
63
63
|
l
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def initialize
|
67
67
|
super
|
68
68
|
@_n=nil, # cached matrix size
|
@@ -72,117 +72,117 @@ module Rubyvis
|
|
72
72
|
@_pairs=nil, # cached pairs (array of links)
|
73
73
|
that=self
|
74
74
|
#/* Links are all pairs of nodes. */
|
75
|
-
@link.data(lambda {that._pairs})
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
@link.data(lambda {that._pairs}).
|
76
|
+
left(lambda { that._dx * (self.index % that._n) }).
|
77
|
+
top(lambda { that._dy * (self.index / that._n.to_f).floor }).
|
78
|
+
width(lambda { that._dx }).
|
79
|
+
height(lambda { that._dy }).
|
80
|
+
line_width(1.5).
|
81
|
+
stroke_style("#fff").
|
82
|
+
fill_style(lambda {|l| l.link_value!=0 ? "#555" : "#eee" })
|
83
|
+
|
84
84
|
@link.parent = self
|
85
85
|
#/* No special add for links! */
|
86
|
-
|
86
|
+
|
87
87
|
# delete this.link.add;
|
88
88
|
|
89
89
|
#/* Labels are duplicated for top & left. */
|
90
90
|
@node_label.
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
91
|
+
data(lambda { that._labels }).
|
92
|
+
left(lambda { (self.index & 1)!=0 ? that._dx * ((self.index >> 1) + 0.5) : 0 }).
|
93
|
+
top(lambda { (self.index & 1)!=0 ? 0 : that._dy * ((self.index >> 1) + 0.5) }).
|
94
|
+
text_margin(4).text_align(lambda { (self.index & 1)!=0 ? "left" : "right"; }).
|
95
|
+
text_angle(lambda { (self.index & 1)!=0 ? -Math::PI / 2.0 : 0; });
|
96
|
+
@node=nil
|
97
|
+
end
|
98
|
+
def self.defaults
|
99
|
+
Matrix.new.mark_extend(Network.defaults).
|
100
|
+
directed(true)
|
101
|
+
end
|
102
|
+
##
|
103
|
+
# :attr: directed
|
104
|
+
#
|
105
|
+
# Whether this matrix visualization is directed (bidirectional). By default,
|
106
|
+
# the graph is assumed to be undirected, such that the visualization is
|
107
|
+
# symmetric across the matrix diagonal. If the network is directed, then
|
108
|
+
# forward links are drawn above the diagonal, while reverse links are drawn
|
109
|
+
# below.
|
110
|
+
#
|
111
|
+
# @type boolean
|
112
|
+
# @name pv.Layout.Matrix.prototype.directed
|
113
|
+
#/
|
114
|
+
|
115
|
+
attr_accessor_dsl :directed
|
116
|
+
|
117
117
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
118
|
+
# Specifies an optional sort function. The sort function follows the same
|
119
|
+
# comparator contract required by {@link pv.Dom.Node#sort}. Specifying a sort
|
120
|
+
# function provides an alternative to sort the nodes as they are specified by
|
121
|
+
# the <tt>nodes</tt> property; the main advantage of doing this is that the
|
122
|
+
# comparator function can access implicit fields populated by the network
|
123
|
+
# layout, such as the <tt>linkDegree</tt>.
|
124
|
+
#
|
125
|
+
# <p>Note that matrix visualizations are particularly sensitive to order. This
|
126
|
+
# is referred to as the seriation problem, and many different techniques exist
|
127
|
+
# to find good node orders that emphasize clusters, such as spectral layout and
|
128
|
+
# simulated annealing.
|
129
|
+
#
|
130
|
+
# @param {function} f comparator function for nodes.
|
131
|
+
# @returns {pv.Layout.Matrix} this.
|
132
|
+
#/
|
133
|
+
def sort(f=nil,&block)
|
134
|
+
f||=block
|
135
|
+
@sort=f
|
136
|
+
self
|
137
|
+
end
|
138
|
+
def build_implied(s) # :nodoc:
|
139
|
+
return nil if network_build_implied(s)
|
140
|
+
nodes = s.nodes
|
141
|
+
links = s.links
|
142
|
+
sort = @sort
|
143
|
+
|
144
|
+
n = nodes.size
|
145
|
+
index = Rubyvis.range(n)
|
146
|
+
labels = []
|
147
|
+
pairs = []
|
148
|
+
map = {}
|
149
|
+
|
150
|
+
s._matrix = OpenStruct.new({:labels=> labels, :pairs=> pairs})
|
151
|
+
|
152
|
+
#/* Sort the nodes. */
|
153
|
+
if sort
|
154
|
+
index.sort! {|a,b| sort.call(nodes[a],nodes[b])}
|
137
155
|
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
links = s.links
|
142
|
-
sort = @sort
|
143
|
-
|
144
|
-
n = nodes.size
|
145
|
-
index = Rubyvis.range(n)
|
146
|
-
labels = []
|
147
|
-
pairs = []
|
148
|
-
map = {}
|
149
|
-
|
150
|
-
s._matrix = OpenStruct.new({:labels=> labels, :pairs=> pairs})
|
151
|
-
|
152
|
-
#/* Sort the nodes. */
|
153
|
-
if sort
|
154
|
-
index.sort! {|a,b| sort.call(nodes[a],nodes[b])}
|
155
|
-
end
|
156
|
-
#/* Create pairs. */
|
157
|
-
n.times {|i|
|
158
|
-
n.times {|j|
|
156
|
+
#/* Create pairs. */
|
157
|
+
n.times {|i|
|
158
|
+
n.times {|j|
|
159
159
|
a = index[i]
|
160
160
|
b = index[j]
|
161
161
|
_p = OpenStruct.new({
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
162
|
+
:row=> i,
|
163
|
+
:col=> j,
|
164
|
+
:source_node=> nodes[a],
|
165
|
+
:target_node=> nodes[b],
|
166
|
+
:link_value=> 0})
|
167
167
|
map["#{a}.#{b}"] = _p
|
168
168
|
pairs.push(map["#{a}.#{b}"])
|
169
|
-
}
|
170
169
|
}
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
}
|
184
|
-
|
185
|
-
|
170
|
+
}
|
171
|
+
#/* Create labels. */
|
172
|
+
n.times {|i|
|
173
|
+
a = index[i]
|
174
|
+
labels.push(nodes[a], nodes[a])
|
175
|
+
}
|
176
|
+
#/* Accumulate link values. */
|
177
|
+
links.each_with_index {|l,i|
|
178
|
+
source = l.source_node.index
|
179
|
+
target = l.target_node.index
|
180
|
+
value = l.link_value
|
181
|
+
map["#{source}.#{target}"].link_value += value
|
182
|
+
map["#{target}.#{source}"].link_value += value if (!s.directed)
|
183
|
+
}
|
184
|
+
build_implied_post(s)
|
186
185
|
end
|
187
186
|
end
|
188
187
|
end
|
188
|
+
end
|