rubyvis 0.6.0 → 0.6.1
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.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.travis.yml +13 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +37 -0
- data/History.txt +6 -0
- data/LICENSE.txt +23 -0
- data/{README.txt → README.md} +15 -12
- data/Rakefile +4 -11
- data/lib/rubyvis.rb +1 -1
- data/lib/rubyvis/scale/quantitative.rb +14 -18
- data/lib/rubyvis/scene/svg_label.rb +1 -1
- data/rubyvis.gemspec +21 -0
- data/spec/anchor_spec.rb +2 -1
- data/spec/line_spec.rb +2 -2
- data/spec/scale_linear_datetime_spec.rb +23 -8
- data/spec/spec_helper.rb +2 -1
- metadata +31 -214
- data/.gemtest +0 -0
- data/vendor/protovis/protovis-r3.3.js +0 -287
- data/vendor/protovis/src/behavior/Behavior.js +0 -32
- data/vendor/protovis/src/behavior/Drag.js +0 -112
- data/vendor/protovis/src/behavior/Pan.js +0 -110
- data/vendor/protovis/src/behavior/Point.js +0 -157
- data/vendor/protovis/src/behavior/Resize.js +0 -104
- data/vendor/protovis/src/behavior/Select.js +0 -100
- data/vendor/protovis/src/behavior/Zoom.js +0 -85
- data/vendor/protovis/src/color/Color.js +0 -598
- data/vendor/protovis/src/color/Colors.js +0 -135
- data/vendor/protovis/src/color/Ramp.js +0 -17
- data/vendor/protovis/src/data/Arrays.js +0 -277
- data/vendor/protovis/src/data/Dom.js +0 -380
- data/vendor/protovis/src/data/Flatten.js +0 -146
- data/vendor/protovis/src/data/Histogram.js +0 -120
- data/vendor/protovis/src/data/LinearScale.js +0 -54
- data/vendor/protovis/src/data/LogScale.js +0 -142
- data/vendor/protovis/src/data/Nest.js +0 -257
- data/vendor/protovis/src/data/Numbers.js +0 -313
- data/vendor/protovis/src/data/Objects.js +0 -78
- data/vendor/protovis/src/data/OrdinalScale.js +0 -267
- data/vendor/protovis/src/data/QuantileScale.js +0 -180
- data/vendor/protovis/src/data/QuantitativeScale.js +0 -440
- data/vendor/protovis/src/data/RootScale.js +0 -55
- data/vendor/protovis/src/data/Scale.js +0 -86
- data/vendor/protovis/src/data/Transform.js +0 -109
- data/vendor/protovis/src/data/Tree.js +0 -124
- data/vendor/protovis/src/data/Vector.js +0 -118
- data/vendor/protovis/src/geo/Geo.js +0 -5
- data/vendor/protovis/src/geo/GeoScale.js +0 -307
- data/vendor/protovis/src/geo/LatLng.js +0 -23
- data/vendor/protovis/src/geo/Projection.js +0 -43
- data/vendor/protovis/src/geo/Projections.js +0 -117
- data/vendor/protovis/src/lang/Array.js +0 -112
- data/vendor/protovis/src/lang/init.js +0 -26
- data/vendor/protovis/src/layout/Arc.js +0 -178
- data/vendor/protovis/src/layout/Bullet.js +0 -164
- data/vendor/protovis/src/layout/Cluster.js +0 -205
- data/vendor/protovis/src/layout/Force.js +0 -309
- data/vendor/protovis/src/layout/Grid.js +0 -119
- data/vendor/protovis/src/layout/Hierarchy.js +0 -249
- data/vendor/protovis/src/layout/Horizon.js +0 -159
- data/vendor/protovis/src/layout/Indent.js +0 -83
- data/vendor/protovis/src/layout/Layout.js +0 -56
- data/vendor/protovis/src/layout/Matrix.js +0 -177
- data/vendor/protovis/src/layout/Network.js +0 -302
- data/vendor/protovis/src/layout/Pack.js +0 -323
- data/vendor/protovis/src/layout/Partition.js +0 -203
- data/vendor/protovis/src/layout/Rollup.js +0 -203
- data/vendor/protovis/src/layout/Stack.js +0 -391
- data/vendor/protovis/src/layout/Tree.js +0 -282
- data/vendor/protovis/src/layout/Treemap.js +0 -347
- data/vendor/protovis/src/mark/Anchor.js +0 -81
- data/vendor/protovis/src/mark/Area.js +0 -268
- data/vendor/protovis/src/mark/Bar.js +0 -93
- data/vendor/protovis/src/mark/Dot.js +0 -212
- data/vendor/protovis/src/mark/Ease.js +0 -150
- data/vendor/protovis/src/mark/Image.js +0 -154
- data/vendor/protovis/src/mark/Label.js +0 -155
- data/vendor/protovis/src/mark/Line.js +0 -195
- data/vendor/protovis/src/mark/Mark.js +0 -1237
- data/vendor/protovis/src/mark/Panel.js +0 -273
- data/vendor/protovis/src/mark/Rule.js +0 -143
- data/vendor/protovis/src/mark/Transient.js +0 -7
- data/vendor/protovis/src/mark/Transition.js +0 -195
- data/vendor/protovis/src/mark/Wedge.js +0 -244
- data/vendor/protovis/src/physics/BoundConstraint.js +0 -75
- data/vendor/protovis/src/physics/ChargeForce.js +0 -184
- data/vendor/protovis/src/physics/CollisionConstraint.js +0 -113
- data/vendor/protovis/src/physics/Constraint.js +0 -26
- data/vendor/protovis/src/physics/DragForce.js +0 -49
- data/vendor/protovis/src/physics/Force.js +0 -25
- data/vendor/protovis/src/physics/Particle.js +0 -81
- data/vendor/protovis/src/physics/PositionConstraint.js +0 -72
- data/vendor/protovis/src/physics/Quadtree.js +0 -195
- data/vendor/protovis/src/physics/Simulation.js +0 -159
- data/vendor/protovis/src/physics/SpringForce.js +0 -141
- data/vendor/protovis/src/pv-internals.js +0 -154
- data/vendor/protovis/src/pv.js +0 -95
- data/vendor/protovis/src/scene/SvgArea.js +0 -172
- data/vendor/protovis/src/scene/SvgBar.js +0 -28
- data/vendor/protovis/src/scene/SvgCurve.js +0 -354
- data/vendor/protovis/src/scene/SvgDot.js +0 -81
- data/vendor/protovis/src/scene/SvgImage.js +0 -45
- data/vendor/protovis/src/scene/SvgLabel.js +0 -46
- data/vendor/protovis/src/scene/SvgLine.js +0 -159
- data/vendor/protovis/src/scene/SvgPanel.js +0 -126
- data/vendor/protovis/src/scene/SvgRule.js +0 -26
- data/vendor/protovis/src/scene/SvgScene.js +0 -185
- data/vendor/protovis/src/scene/SvgWedge.js +0 -66
- data/vendor/protovis/src/text/DateFormat.js +0 -262
- data/vendor/protovis/src/text/Format.js +0 -78
- data/vendor/protovis/src/text/NumberFormat.js +0 -227
- data/vendor/protovis/src/text/TimeFormat.js +0 -115
@@ -1,23 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Abstract; not implemented. There is no explicit constructor; this class
|
3
|
-
* merely serves to document the representation used by {@link pv.Geo.scale}.
|
4
|
-
*
|
5
|
-
* @class Represents a pair of geographic coordinates.
|
6
|
-
*
|
7
|
-
* @name pv.Geo.LatLng
|
8
|
-
* @see pv.Geo.scale
|
9
|
-
*/
|
10
|
-
|
11
|
-
/**
|
12
|
-
* The <i>latitude</i> coordinate in degrees; positive is North.
|
13
|
-
*
|
14
|
-
* @type number
|
15
|
-
* @name pv.Geo.LatLng.prototype.lat
|
16
|
-
*/
|
17
|
-
|
18
|
-
/**
|
19
|
-
* The <i>longitude</i> coordinate in degrees; positive is East.
|
20
|
-
*
|
21
|
-
* @type number
|
22
|
-
* @name pv.Geo.LatLng.prototype.lng
|
23
|
-
*/
|
@@ -1,43 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Abstract; not implemented. There is no explicit constructor; this class
|
3
|
-
* merely serves to document the representation used by {@link pv.Geo.scale}.
|
4
|
-
*
|
5
|
-
* @class Represents a geographic projection. This class provides the core
|
6
|
-
* implementation for {@link pv.Geo.scale}s, mapping between geographic
|
7
|
-
* coordinates (latitude and longitude) and normalized screen space in the range
|
8
|
-
* [-1,1]. The remaining mapping between normalized screen space and actual
|
9
|
-
* pixels is performed by <tt>pv.Geo.scale</tt>.
|
10
|
-
*
|
11
|
-
* <p>Many geographic projections have a point around which the projection is
|
12
|
-
* centered. Rather than have each implementation add support for a
|
13
|
-
* user-specified center point, the <tt>pv.Geo.scale</tt> translates the
|
14
|
-
* geographic coordinates relative to the center point for both the forward and
|
15
|
-
* inverse projection.
|
16
|
-
*
|
17
|
-
* <p>In general, this class should not be used directly, unless the desire is
|
18
|
-
* to implement a new geographic projection. Instead, use <tt>pv.Geo.scale</tt>.
|
19
|
-
* Implementations are not required to implement inverse projections, but are
|
20
|
-
* needed for some forms of interactivity. Also note that some inverse
|
21
|
-
* projections are ambiguous, such as the connecting points in Dymaxian maps.
|
22
|
-
*
|
23
|
-
* @name pv.Geo.Projection
|
24
|
-
* @see pv.Geo.scale
|
25
|
-
*/
|
26
|
-
|
27
|
-
/**
|
28
|
-
* The <i>forward</i> projection.
|
29
|
-
*
|
30
|
-
* @function
|
31
|
-
* @name pv.Geo.Projection.prototype.project
|
32
|
-
* @param {pv.Geo.LatLng} latlng the latitude and longitude to project.
|
33
|
-
* @returns {pv.Vector} the xy-coordinates of the given point.
|
34
|
-
*/
|
35
|
-
|
36
|
-
/**
|
37
|
-
* The <i>inverse</i> projection; optional.
|
38
|
-
*
|
39
|
-
* @function
|
40
|
-
* @name pv.Geo.Projection.prototype.invert
|
41
|
-
* @param {pv.Vector} xy the x- and y-coordinates to invert.
|
42
|
-
* @returns {pv.Geo.LatLng} the latitude and longitude of the given point.
|
43
|
-
*/
|
@@ -1,117 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* The built-in projections.
|
3
|
-
*
|
4
|
-
* @see pv.Geo.Projection
|
5
|
-
* @namespace
|
6
|
-
*/
|
7
|
-
pv.Geo.projections = {
|
8
|
-
|
9
|
-
/** @see http://en.wikipedia.org/wiki/Mercator_projection */
|
10
|
-
mercator: {
|
11
|
-
project: function(latlng) {
|
12
|
-
return {
|
13
|
-
x: latlng.lng / 180,
|
14
|
-
y: latlng.lat > 85 ? 1 : latlng.lat < -85 ? -1
|
15
|
-
: Math.log(Math.tan(Math.PI / 4
|
16
|
-
+ pv.radians(latlng.lat) / 2)) / Math.PI
|
17
|
-
};
|
18
|
-
},
|
19
|
-
invert: function(xy) {
|
20
|
-
return {
|
21
|
-
lng: xy.x * 180,
|
22
|
-
lat: pv.degrees(2 * Math.atan(Math.exp(xy.y * Math.PI)) - Math.PI / 2)
|
23
|
-
};
|
24
|
-
}
|
25
|
-
},
|
26
|
-
|
27
|
-
/** @see http://en.wikipedia.org/wiki/Gall-Peters_projection */
|
28
|
-
"gall-peters": {
|
29
|
-
project: function(latlng) {
|
30
|
-
return {
|
31
|
-
x: latlng.lng / 180,
|
32
|
-
y: Math.sin(pv.radians(latlng.lat))
|
33
|
-
};
|
34
|
-
},
|
35
|
-
invert: function(xy) {
|
36
|
-
return {
|
37
|
-
lng: xy.x * 180,
|
38
|
-
lat: pv.degrees(Math.asin(xy.y))
|
39
|
-
};
|
40
|
-
}
|
41
|
-
},
|
42
|
-
|
43
|
-
/** @see http://en.wikipedia.org/wiki/Sinusoidal_projection */
|
44
|
-
sinusoidal: {
|
45
|
-
project: function(latlng) {
|
46
|
-
return {
|
47
|
-
x: pv.radians(latlng.lng) * Math.cos(pv.radians(latlng.lat)) / Math.PI,
|
48
|
-
y: latlng.lat / 90
|
49
|
-
};
|
50
|
-
},
|
51
|
-
invert: function(xy) {
|
52
|
-
return {
|
53
|
-
lng: pv.degrees((xy.x * Math.PI) / Math.cos(xy.y * Math.PI / 2)),
|
54
|
-
lat: xy.y * 90
|
55
|
-
};
|
56
|
-
}
|
57
|
-
},
|
58
|
-
|
59
|
-
/** @see http://en.wikipedia.org/wiki/Aitoff_projection */
|
60
|
-
aitoff: {
|
61
|
-
project: function(latlng) {
|
62
|
-
var l = pv.radians(latlng.lng),
|
63
|
-
f = pv.radians(latlng.lat),
|
64
|
-
a = Math.acos(Math.cos(f) * Math.cos(l / 2));
|
65
|
-
return {
|
66
|
-
x: 2 * (a ? (Math.cos(f) * Math.sin(l / 2) * a / Math.sin(a)) : 0) / Math.PI,
|
67
|
-
y: 2 * (a ? (Math.sin(f) * a / Math.sin(a)) : 0) / Math.PI
|
68
|
-
};
|
69
|
-
},
|
70
|
-
invert: function(xy) {
|
71
|
-
var x = xy.x * Math.PI / 2,
|
72
|
-
y = xy.y * Math.PI / 2;
|
73
|
-
return {
|
74
|
-
lng: pv.degrees(x / Math.cos(y)),
|
75
|
-
lat: pv.degrees(y)
|
76
|
-
};
|
77
|
-
}
|
78
|
-
},
|
79
|
-
|
80
|
-
/** @see http://en.wikipedia.org/wiki/Hammer_projection */
|
81
|
-
hammer: {
|
82
|
-
project: function(latlng) {
|
83
|
-
var l = pv.radians(latlng.lng),
|
84
|
-
f = pv.radians(latlng.lat),
|
85
|
-
c = Math.sqrt(1 + Math.cos(f) * Math.cos(l / 2));
|
86
|
-
return {
|
87
|
-
x: 2 * Math.SQRT2 * Math.cos(f) * Math.sin(l / 2) / c / 3,
|
88
|
-
y: Math.SQRT2 * Math.sin(f) / c / 1.5
|
89
|
-
};
|
90
|
-
},
|
91
|
-
invert: function(xy) {
|
92
|
-
var x = xy.x * 3,
|
93
|
-
y = xy.y * 1.5,
|
94
|
-
z = Math.sqrt(1 - x * x / 16 - y * y / 4);
|
95
|
-
return {
|
96
|
-
lng: pv.degrees(2 * Math.atan2(z * x, 2 * (2 * z * z - 1))),
|
97
|
-
lat: pv.degrees(Math.asin(z * y))
|
98
|
-
};
|
99
|
-
}
|
100
|
-
},
|
101
|
-
|
102
|
-
/** The identity or "none" projection. */
|
103
|
-
identity: {
|
104
|
-
project: function(latlng) {
|
105
|
-
return {
|
106
|
-
x: latlng.lng / 180,
|
107
|
-
y: latlng.lat / 90
|
108
|
-
};
|
109
|
-
},
|
110
|
-
invert: function(xy) {
|
111
|
-
return {
|
112
|
-
lng: xy.x * 180,
|
113
|
-
lat: xy.y * 90
|
114
|
-
};
|
115
|
-
}
|
116
|
-
}
|
117
|
-
};
|
@@ -1,112 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @class The built-in Array class.
|
3
|
-
* @name Array
|
4
|
-
*/
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Creates a new array with the results of calling a provided function on every
|
8
|
-
* element in this array. Implemented in Javascript 1.6.
|
9
|
-
*
|
10
|
-
* @function
|
11
|
-
* @name Array.prototype.map
|
12
|
-
* @see <a
|
13
|
-
* href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/Map">map</a>
|
14
|
-
* documentation.
|
15
|
-
* @param {function} f function that produces an element of the new Array from
|
16
|
-
* an element of the current one.
|
17
|
-
* @param [o] object to use as <tt>this</tt> when executing <tt>f</tt>.
|
18
|
-
*/
|
19
|
-
if (!Array.prototype.map) Array.prototype.map = function(f, o) {
|
20
|
-
var n = this.length;
|
21
|
-
var result = new Array(n);
|
22
|
-
for (var i = 0; i < n; i++) {
|
23
|
-
if (i in this) {
|
24
|
-
result[i] = f.call(o, this[i], i, this);
|
25
|
-
}
|
26
|
-
}
|
27
|
-
return result;
|
28
|
-
};
|
29
|
-
|
30
|
-
/**
|
31
|
-
* Creates a new array with all elements that pass the test implemented by the
|
32
|
-
* provided function. Implemented in Javascript 1.6.
|
33
|
-
*
|
34
|
-
* @function
|
35
|
-
* @name Array.prototype.filter
|
36
|
-
* @see <a
|
37
|
-
* href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/filter">filter</a>
|
38
|
-
* documentation.
|
39
|
-
* @param {function} f function to test each element of the array.
|
40
|
-
* @param [o] object to use as <tt>this</tt> when executing <tt>f</tt>.
|
41
|
-
*/
|
42
|
-
if (!Array.prototype.filter) Array.prototype.filter = function(f, o) {
|
43
|
-
var n = this.length;
|
44
|
-
var result = new Array();
|
45
|
-
for (var i = 0; i < n; i++) {
|
46
|
-
if (i in this) {
|
47
|
-
var v = this[i];
|
48
|
-
if (f.call(o, v, i, this)) result.push(v);
|
49
|
-
}
|
50
|
-
}
|
51
|
-
return result;
|
52
|
-
};
|
53
|
-
|
54
|
-
/**
|
55
|
-
* Executes a provided function once per array element. Implemented in
|
56
|
-
* Javascript 1.6.
|
57
|
-
*
|
58
|
-
* @function
|
59
|
-
* @name Array.prototype.forEach
|
60
|
-
* @see <a
|
61
|
-
* href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/ForEach">forEach</a>
|
62
|
-
* documentation.
|
63
|
-
* @param {function} f function to execute for each element.
|
64
|
-
* @param [o] object to use as <tt>this</tt> when executing <tt>f</tt>.
|
65
|
-
*/
|
66
|
-
if (!Array.prototype.forEach) Array.prototype.forEach = function(f, o) {
|
67
|
-
var n = this.length >>> 0;
|
68
|
-
for (var i = 0; i < n; i++) {
|
69
|
-
if (i in this) f.call(o, this[i], i, this);
|
70
|
-
}
|
71
|
-
};
|
72
|
-
|
73
|
-
/**
|
74
|
-
* Apply a function against an accumulator and each value of the array (from
|
75
|
-
* left-to-right) as to reduce it to a single value. Implemented in Javascript
|
76
|
-
* 1.8.
|
77
|
-
*
|
78
|
-
* @function
|
79
|
-
* @name Array.prototype.reduce
|
80
|
-
* @see <a
|
81
|
-
* href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/Reduce">reduce</a>
|
82
|
-
* documentation.
|
83
|
-
* @param {function} f function to execute on each value in the array.
|
84
|
-
* @param [v] object to use as the first argument to the first call of
|
85
|
-
* <tt>t</tt>.
|
86
|
-
*/
|
87
|
-
if (!Array.prototype.reduce) Array.prototype.reduce = function(f, v) {
|
88
|
-
var len = this.length;
|
89
|
-
if (!len && (arguments.length == 1)) {
|
90
|
-
throw new Error("reduce: empty array, no initial value");
|
91
|
-
}
|
92
|
-
|
93
|
-
var i = 0;
|
94
|
-
if (arguments.length < 2) {
|
95
|
-
while (true) {
|
96
|
-
if (i in this) {
|
97
|
-
v = this[i++];
|
98
|
-
break;
|
99
|
-
}
|
100
|
-
if (++i >= len) {
|
101
|
-
throw new Error("reduce: no values, no initial value");
|
102
|
-
}
|
103
|
-
}
|
104
|
-
}
|
105
|
-
|
106
|
-
for (; i < len; i++) {
|
107
|
-
if (i in this) {
|
108
|
-
v = f(v, this[i], i, this);
|
109
|
-
}
|
110
|
-
}
|
111
|
-
return v;
|
112
|
-
};
|
@@ -1,26 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Parses the Protovis specifications on load, allowing the use of JavaScript
|
3
|
-
* 1.8 function expressions on browsers that only support JavaScript 1.6.
|
4
|
-
*
|
5
|
-
* @see pv.parse
|
6
|
-
*/
|
7
|
-
pv.listen(window, "load", function() {
|
8
|
-
/*
|
9
|
-
* Note: in Firefox any variables declared here are visible to the eval'd
|
10
|
-
* script below. Even worse, any global variables declared by the script
|
11
|
-
* could overwrite local variables here (such as the index, `i`)! To protect
|
12
|
-
* against this, all variables are explicitly scoped on a pv.$ object.
|
13
|
-
*/
|
14
|
-
pv.$ = {i:0, x:document.getElementsByTagName("script")};
|
15
|
-
for (; pv.$.i < pv.$.x.length; pv.$.i++) {
|
16
|
-
pv.$.s = pv.$.x[pv.$.i];
|
17
|
-
if (pv.$.s.type == "text/javascript+protovis") {
|
18
|
-
try {
|
19
|
-
window.eval(pv.parse(pv.$.s.text));
|
20
|
-
} catch (e) {
|
21
|
-
pv.error(e);
|
22
|
-
}
|
23
|
-
}
|
24
|
-
}
|
25
|
-
delete pv.$;
|
26
|
-
});
|
@@ -1,178 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Constructs a new, empty arc layout. Layouts are not typically constructed
|
3
|
-
* directly; instead, they are added to an existing panel via
|
4
|
-
* {@link pv.Mark#add}.
|
5
|
-
*
|
6
|
-
* @class Implements a layout for arc diagrams. An arc diagram is a network
|
7
|
-
* visualization with a one-dimensional layout of nodes, using circular arcs to
|
8
|
-
* render links between nodes. For undirected networks, arcs are rendering on a
|
9
|
-
* single side; this makes arc diagrams useful as annotations to other
|
10
|
-
* two-dimensional network layouts, such as rollup, matrix or table layouts. For
|
11
|
-
* directed networks, links in opposite directions can be rendered on opposite
|
12
|
-
* sides using <tt>directed(true)</tt>.
|
13
|
-
*
|
14
|
-
* <p>Arc layouts are particularly sensitive to node ordering; for best results,
|
15
|
-
* order the nodes such that related nodes are close to each other. A poor
|
16
|
-
* (e.g., random) order may result in large arcs with crossovers that impede
|
17
|
-
* visual processing. A future improvement to this layout may include automatic
|
18
|
-
* reordering using, e.g., spectral graph layout or simulated annealing.
|
19
|
-
*
|
20
|
-
* <p>This visualization technique is related to that developed by
|
21
|
-
* M. Wattenberg, <a
|
22
|
-
* href="http://www.research.ibm.com/visual/papers/arc-diagrams.pdf">"Arc
|
23
|
-
* Diagrams: Visualizing Structure in Strings"</a> in <i>IEEE InfoVis</i>, 2002.
|
24
|
-
* However, this implementation is limited to simple node-link networks, as
|
25
|
-
* opposed to structures with hierarchical self-similarity (such as strings).
|
26
|
-
*
|
27
|
-
* <p>As with other network layouts, three mark prototypes are provided:<ul>
|
28
|
-
*
|
29
|
-
* <li><tt>node</tt> - for rendering nodes; typically a {@link pv.Dot}.
|
30
|
-
* <li><tt>link</tt> - for rendering links; typically a {@link pv.Line}.
|
31
|
-
* <li><tt>label</tt> - for rendering node labels; typically a {@link pv.Label}.
|
32
|
-
*
|
33
|
-
* </ul>For more details on how this layout is structured and can be customized,
|
34
|
-
* see {@link pv.Layout.Network}.
|
35
|
-
*
|
36
|
-
* @extends pv.Layout.Network
|
37
|
-
**/
|
38
|
-
pv.Layout.Arc = function() {
|
39
|
-
pv.Layout.Network.call(this);
|
40
|
-
var interpolate, // cached interpolate
|
41
|
-
directed, // cached directed
|
42
|
-
reverse, // cached reverse
|
43
|
-
buildImplied = this.buildImplied;
|
44
|
-
|
45
|
-
/** @private Cache layout state to optimize properties. */
|
46
|
-
this.buildImplied = function(s) {
|
47
|
-
buildImplied.call(this, s);
|
48
|
-
directed = s.directed;
|
49
|
-
interpolate = s.orient == "radial" ? "linear" : "polar";
|
50
|
-
reverse = s.orient == "right" || s.orient == "top";
|
51
|
-
};
|
52
|
-
|
53
|
-
/* Override link properties to handle directedness and orientation. */
|
54
|
-
this.link
|
55
|
-
.data(function(p) {
|
56
|
-
var s = p.sourceNode, t = p.targetNode;
|
57
|
-
return reverse != (directed || (s.breadth < t.breadth)) ? [s, t] : [t, s];
|
58
|
-
})
|
59
|
-
.interpolate(function() { return interpolate; });
|
60
|
-
};
|
61
|
-
|
62
|
-
pv.Layout.Arc.prototype = pv.extend(pv.Layout.Network)
|
63
|
-
.property("orient", String)
|
64
|
-
.property("directed", Boolean);
|
65
|
-
|
66
|
-
/**
|
67
|
-
* Default properties for arc layouts. By default, the orientation is "bottom".
|
68
|
-
*
|
69
|
-
* @type pv.Layout.Arc
|
70
|
-
*/
|
71
|
-
pv.Layout.Arc.prototype.defaults = new pv.Layout.Arc()
|
72
|
-
.extend(pv.Layout.Network.prototype.defaults)
|
73
|
-
.orient("bottom");
|
74
|
-
|
75
|
-
/**
|
76
|
-
* Specifies an optional sort function. The sort function follows the same
|
77
|
-
* comparator contract required by {@link pv.Dom.Node#sort}. Specifying a sort
|
78
|
-
* function provides an alternative to sort the nodes as they are specified by
|
79
|
-
* the <tt>nodes</tt> property; the main advantage of doing this is that the
|
80
|
-
* comparator function can access implicit fields populated by the network
|
81
|
-
* layout, such as the <tt>linkDegree</tt>.
|
82
|
-
*
|
83
|
-
* <p>Note that arc diagrams are particularly sensitive to order. This is
|
84
|
-
* referred to as the seriation problem, and many different techniques exist to
|
85
|
-
* find good node orders that emphasize clusters, such as spectral layout and
|
86
|
-
* simulated annealing.
|
87
|
-
*
|
88
|
-
* @param {function} f comparator function for nodes.
|
89
|
-
* @returns {pv.Layout.Arc} this.
|
90
|
-
*/
|
91
|
-
pv.Layout.Arc.prototype.sort = function(f) {
|
92
|
-
this.$sort = f;
|
93
|
-
return this;
|
94
|
-
};
|
95
|
-
|
96
|
-
/** @private Populates the x, y and angle attributes on the nodes. */
|
97
|
-
pv.Layout.Arc.prototype.buildImplied = function(s) {
|
98
|
-
if (pv.Layout.Network.prototype.buildImplied.call(this, s)) return;
|
99
|
-
|
100
|
-
var nodes = s.nodes,
|
101
|
-
orient = s.orient,
|
102
|
-
sort = this.$sort,
|
103
|
-
index = pv.range(nodes.length),
|
104
|
-
w = s.width,
|
105
|
-
h = s.height,
|
106
|
-
r = Math.min(w, h) / 2;
|
107
|
-
|
108
|
-
/* Sort the nodes. */
|
109
|
-
if (sort) index.sort(function(a, b) { return sort(nodes[a], nodes[b]); });
|
110
|
-
|
111
|
-
/** @private Returns the mid-angle, given the breadth. */
|
112
|
-
function midAngle(b) {
|
113
|
-
switch (orient) {
|
114
|
-
case "top": return -Math.PI / 2;
|
115
|
-
case "bottom": return Math.PI / 2;
|
116
|
-
case "left": return Math.PI;
|
117
|
-
case "right": return 0;
|
118
|
-
case "radial": return (b - .25) * 2 * Math.PI;
|
119
|
-
}
|
120
|
-
}
|
121
|
-
|
122
|
-
/** @private Returns the x-position, given the breadth. */
|
123
|
-
function x(b) {
|
124
|
-
switch (orient) {
|
125
|
-
case "top":
|
126
|
-
case "bottom": return b * w;
|
127
|
-
case "left": return 0;
|
128
|
-
case "right": return w;
|
129
|
-
case "radial": return w / 2 + r * Math.cos(midAngle(b));
|
130
|
-
}
|
131
|
-
}
|
132
|
-
|
133
|
-
/** @private Returns the y-position, given the breadth. */
|
134
|
-
function y(b) {
|
135
|
-
switch (orient) {
|
136
|
-
case "top": return 0;
|
137
|
-
case "bottom": return h;
|
138
|
-
case "left":
|
139
|
-
case "right": return b * h;
|
140
|
-
case "radial": return h / 2 + r * Math.sin(midAngle(b));
|
141
|
-
}
|
142
|
-
}
|
143
|
-
|
144
|
-
/* Populate the x, y and mid-angle attributes. */
|
145
|
-
for (var i = 0; i < nodes.length; i++) {
|
146
|
-
var n = nodes[index[i]], b = n.breadth = (i + .5) / nodes.length;
|
147
|
-
n.x = x(b);
|
148
|
-
n.y = y(b);
|
149
|
-
n.midAngle = midAngle(b);
|
150
|
-
}
|
151
|
-
};
|
152
|
-
|
153
|
-
/**
|
154
|
-
* The orientation. The default orientation is "left", which means that nodes
|
155
|
-
* will be positioned from left-to-right in the order they are specified in the
|
156
|
-
* <tt>nodes</tt> property. The following orientations are supported:<ul>
|
157
|
-
*
|
158
|
-
* <li>left - left-to-right.
|
159
|
-
* <li>right - right-to-left.
|
160
|
-
* <li>top - top-to-bottom.
|
161
|
-
* <li>bottom - bottom-to-top.
|
162
|
-
* <li>radial - radially, starting at 12 o'clock and proceeding clockwise.</ul>
|
163
|
-
*
|
164
|
-
* @type string
|
165
|
-
* @name pv.Layout.Arc.prototype.orient
|
166
|
-
*/
|
167
|
-
|
168
|
-
/**
|
169
|
-
* Whether this arc digram is directed (bidirectional); only applies to
|
170
|
-
* non-radial orientations. By default, arc digrams are undirected, such that
|
171
|
-
* all arcs appear on one side. If the arc digram is directed, then forward
|
172
|
-
* links are drawn on the conventional side (the same as as undirected
|
173
|
-
* links--right, left, bottom and top for left, right, top and bottom,
|
174
|
-
* respectively), while reverse links are drawn on the opposite side.
|
175
|
-
*
|
176
|
-
* @type boolean
|
177
|
-
* @name pv.Layout.Arc.prototype.directed
|
178
|
-
*/
|