diff options
Diffstat (limited to 'visualize/static/d3.v2.js')
-rw-r--r-- | visualize/static/d3.v2.js | 636 |
1 files changed, 350 insertions, 286 deletions
diff --git a/visualize/static/d3.v2.js b/visualize/static/d3.v2.js index c1b6caf2..6dffa7dd 100644 --- a/visualize/static/d3.v2.js +++ b/visualize/static/d3.v2.js @@ -10,7 +10,7 @@ try { d3_style_setProperty.call(this, name, value + "", priority); }; } -d3 = {version: "2.8.1"}; // semver +d3 = {version: "2.9.6"}; // semver function d3_class(ctor, properties) { try { for (var key in properties) { @@ -100,12 +100,20 @@ d3_class(d3_Map, { var d3_map_prefix = "\0", // prevent collision with built-ins d3_map_prefixCode = d3_map_prefix.charCodeAt(0); +function d3_identity(d) { + return d; +} function d3_this() { return this; } -d3.functor = function(v) { +function d3_true() { + return true; +} +function d3_functor(v) { return typeof v === "function" ? v : function() { return v; }; -}; +} + +d3.functor = d3_functor; // Copies a variable number of methods from source to target. d3.rebind = function(target, source) { var i = 1, n = arguments.length, method; @@ -441,7 +449,7 @@ function d3_splitter(d) { return d == null; } function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); + return s.replace(/^\s+|\s+$/g, "").replace(/\s+/g, " "); } d3.range = function(start, stop, step) { if (arguments.length < 3) { @@ -484,7 +492,10 @@ d3.xhr = function(url, mime, callback) { req.open("GET", url, true); if (mime) req.setRequestHeader("Accept", mime); req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); + if (req.readyState === 4) { + var s = req.status; + callback(!s && req.response || s >= 200 && s < 300 || s === 304 ? req : null); + } }; req.send(null); }; @@ -650,7 +661,7 @@ d3.format = function(specifier) { // Apply the scale, computing it from the value's exponent for si format. if (scale < 0) { var prefix = d3.formatPrefix(value, precision); - value *= prefix.scale; + value = prefix.scale(value); suffix = prefix.symbol; } else { value *= scale; @@ -719,12 +730,12 @@ d3.formatPrefix = function(value, precision) { }; function d3_formatPrefix(d, i) { + var k = Math.pow(10, Math.abs(8 - i) * 3); return { - scale: Math.pow(10, (8 - i) * 3), + scale: i > 8 ? function(d) { return d / k; } : function(d) { return d * k; }, symbol: d }; } - /* * TERMS OF USE - EASING EQUATIONS * @@ -1024,6 +1035,7 @@ d3.interpolateTransform = function(a, b) { } if (ra != rb) { + if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; // shortest path q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3.interpolateNumber(ra, rb)}); } else if (rb) { s.push(s.pop() + "rotate(" + rb + ")"); @@ -1077,6 +1089,7 @@ d3.interpolateHsl = function(a, b) { h1 = b.h - h0, s1 = b.s - s0, l1 = b.l - l0; + if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360; // shortest path return function(t) { return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); }; @@ -1120,7 +1133,7 @@ d3.interpolateObject = function(a, b) { }; } -var d3_interpolate_number = /[-+]?(?:\d*\.?\d+)(?:[eE][-+]?\d+)?/g; +var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; function d3_interpolateByName(n) { return n == "transform" @@ -1504,7 +1517,7 @@ var d3_select = function(s, n) { return n.querySelector(s); }, // Prefer Sizzle, if available. if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; + d3_select = function(s, n) { return Sizzle(s, n)[0] || null; }; d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; d3_selectMatches = Sizzle.matchesSelector; } @@ -1615,7 +1628,7 @@ d3_selectionPrototype.attr = function(name, value) { : (name.local ? attrConstantNS : attrConstant))); }; d3_selectionPrototype.classed = function(name, value) { - var names = name.split(d3_selection_classedWhitespace), + var names = d3_collapse(name).split(" "), n = names.length, i = -1; if (arguments.length > 1) { @@ -1627,8 +1640,6 @@ d3_selectionPrototype.classed = function(name, value) { } }; -var d3_selection_classedWhitespace = /\s+/g; - function d3_selection_classed(name, value) { var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); @@ -2000,14 +2011,19 @@ d3_selectionPrototype.on = function(type, listener, capture) { }); }; d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); + return d3_selection_each(this, function(node, i, j) { + callback.call(node, node.__data__, i, j); + }); +}; + +function d3_selection_each(groups, callback) { + for (var j = 0, m = groups.length; j < m; j++) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { + if (node = group[i]) callback(node, i, j); } } - return this; -}; + return groups; +} // // Note: assigning to the arguments array simultaneously changes the value of // the corresponding argument! @@ -2134,12 +2150,12 @@ function d3_transition(groups, id, time) { }; d3.timer(function(elapsed) { - groups.each(function(d, i, j) { + return d3_selection_each(groups, function(node, i, j) { var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); + delay = node.delay, + duration = node.duration, + lock = (node = node.node).__transition__ || (node.__transition__ = {active: 0, count: 0}), + d = node.__data__; ++lock.count; @@ -2150,8 +2166,8 @@ function d3_transition(groups, id, time) { lock.active = id; tweens.forEach(function(key, value) { - if (tween = value.call(node, d, i)) { - tweened.push(tween); + if (value = value.call(node, d, i)) { + tweened.push(value); } }); @@ -2185,7 +2201,6 @@ function d3_transition(groups, id, time) { return 1; } }); - return 1; }, 0, time); return groups; @@ -2330,16 +2345,14 @@ d3_transitionPrototype.remove = function() { }); }; d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = value.apply(this, arguments) | 0; } - : (value = value | 0, function(d, i, j) { groups[j][i].delay = value; })); + return d3_selection_each(this, typeof value === "function" + ? function(node, i, j) { node.delay = value.call(node = node.node, node.__data__, i, j) | 0; } + : (value = value | 0, function(node) { node.delay = value; })); }; d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = Math.max(1, value.apply(this, arguments) | 0); } - : (value = Math.max(1, value | 0), function(d, i, j) { groups[j][i].duration = value; })); + return d3_selection_each(this, typeof value === "function" + ? function(node, i, j) { node.duration = Math.max(1, value.call(node = node.node, node.__data__, i, j) | 0); } + : (value = Math.max(1, value | 0), function(node) { node.duration = value; })); }; function d3_transition_each(callback) { var id = d3_transitionId, @@ -2349,16 +2362,11 @@ function d3_transition_each(callback) { d3_transitionId = this.id; d3_transitionEase = this.ease(); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) { - d3_transitionDelay = this[j][i].delay; - d3_transitionDuration = this[j][i].duration; - callback.call(node = node.node, node.__data__, i, j); - } - } - } + d3_selection_each(this, function(node, i, j) { + d3_transitionDelay = node.delay; + d3_transitionDuration = node.duration; + callback.call(node = node.node, node.__data__, i, j); + }); d3_transitionId = id; d3_transitionEase = ease; @@ -2802,11 +2810,11 @@ function d3_scale_log(linear, log) { scale.tickFormat = function(n, format) { if (arguments.length < 2) format = d3_scale_logFormat; if (arguments.length < 1) return format; - var k = n / scale.ticks().length, + var k = Math.max(.1, n / scale.ticks().length), f = log === d3_scale_logn ? (e = -1e-12, Math.floor) : (e = 1e-12, Math.ceil), e; return function(d) { - return d / pow(f(log(d) + e)) < k ? format(d) : ""; + return d / pow(f(log(d) + e)) <= k ? format(d) : ""; }; }; @@ -3185,25 +3193,25 @@ d3.svg.arc = function() { arc.innerRadius = function(v) { if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); + innerRadius = d3_functor(v); return arc; }; arc.outerRadius = function(v) { if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); + outerRadius = d3_functor(v); return arc; }; arc.startAngle = function(v) { if (!arguments.length) return startAngle; - startAngle = d3.functor(v); + startAngle = d3_functor(v); return arc; }; arc.endAngle = function(v) { if (!arguments.length) return endAngle; - endAngle = d3.functor(v); + endAngle = d3_functor(v); return arc; }; @@ -3239,36 +3247,66 @@ function d3_svg_arcEndAngle(d) { function d3_svg_line(projection) { var x = d3_svg_lineX, y = d3_svg_lineY, + defined = d3_true, interpolate = d3_svg_lineInterpolatorDefault, - interpolator = d3_svg_lineInterpolators.get(interpolate), + interpolator = d3_svg_lineLinear, tension = .7; - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); + function line(data) { + var segments = [], + points = [], + i = -1, + n = data.length, + d, + fx = d3_functor(x), + fy = d3_functor(y); + + function segment() { + segments.push("M", interpolator(projection(points), tension)); + } + + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points.push([+fx.call(this, d, i), +fy.call(this, d, i)]); + } else if (points.length) { + segment(); + points = []; + } + } + + if (points.length) segment(); + + return segments.length ? segments.join("") : null; } - line.x = function(v) { + line.x = function(_) { if (!arguments.length) return x; - x = v; + x = _; return line; }; - line.y = function(v) { + line.y = function(_) { if (!arguments.length) return y; - y = v; + y = _; + return line; + }; + + line.defined = function(_) { + if (!arguments.length) return defined; + defined = _; return line; }; - line.interpolate = function(v) { + line.interpolate = function(_) { if (!arguments.length) return interpolate; - if (!d3_svg_lineInterpolators.has(v += "")) v = d3_svg_lineInterpolatorDefault; - interpolator = d3_svg_lineInterpolators.get(interpolate = v); + if (!d3_svg_lineInterpolators.has(_ += "")) _ = d3_svg_lineInterpolatorDefault; + interpolator = d3_svg_lineInterpolators.get(interpolate = _); return line; }; - line.tension = function(v) { + line.tension = function(_) { if (!arguments.length) return tension; - tension = v; + tension = _; return line; }; @@ -3276,35 +3314,9 @@ function d3_svg_line(projection) { } d3.svg.line = function() { - return d3_svg_line(Object); + return d3_svg_line(d3_identity); }; -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - // The default `x` property, which references d[0]. function d3_svg_lineX(d) { return d[0]; @@ -3532,19 +3544,21 @@ function d3_svg_lineBasisClosed(points) { } function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); + var n = points.length - 1; + if (n) { + var x0 = points[0][0], + y0 = points[0][1], + dx = points[n][0] - x0, + dy = points[n][1] - y0, + i = -1, + p, + t; + while (++i <= n) { + p = points[i]; + t = i / n; + p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); + p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); + } } return d3_svg_lineBasis(points); } @@ -3640,8 +3654,7 @@ function d3_svg_lineMonotoneTangents(points) { // not monotonic, it's possible that the slope will be infinite, so we protect // against NaN by setting the coordinate to zero. i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); + s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); tangents.push([s || 0, m[i] * s || 0]); } @@ -3651,8 +3664,7 @@ function d3_svg_lineMonotoneTangents(points) { function d3_svg_lineMonotone(points) { return points.length < 3 ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); + : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); } d3.svg.line.radial = function() { var line = d3_svg_line(d3_svg_lineRadial); @@ -3681,71 +3693,107 @@ function d3_svg_area(projection) { x1 = d3_svg_lineX, y0 = 0, y1 = d3_svg_lineY, - interpolate, - i0, - i1, + defined = d3_true, + interpolate = d3_svg_lineInterpolatorDefault, + i0 = d3_svg_lineLinear, + i1 = d3_svg_lineLinear, + L = "L", tension = .7; - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + i0(projection(points1), tension) - + "L" + i1(projection(points0.reverse()), tension) - + "Z"; + function area(data) { + var segments = [], + points0 = [], + points1 = [], + i = -1, + n = data.length, + d, + fx0 = d3_functor(x0), + fy0 = d3_functor(y0), + fx1 = x0 === x1 ? function() { return x; } : d3_functor(x1), + fy1 = y0 === y1 ? function() { return y; } : d3_functor(y1), + x, + y; + + function segment() { + segments.push("M", i0(projection(points1), tension), + L, i1(projection(points0.reverse()), tension), + "Z"); + } + + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points0.push([x = +fx0.call(this, d, i), y = +fy0.call(this, d, i)]); + points1.push([+fx1.call(this, d, i), +fy1.call(this, d, i)]); + } else if (points0.length) { + segment(); + points0 = []; + points1 = []; + } + } + + if (points0.length) segment(); + + return segments.length ? segments.join("") : null; } - area.x = function(x) { + area.x = function(_) { if (!arguments.length) return x1; - x0 = x1 = x; + x0 = x1 = _; return area; }; - area.x0 = function(x) { + area.x0 = function(_) { if (!arguments.length) return x0; - x0 = x; + x0 = _; return area; }; - area.x1 = function(x) { + area.x1 = function(_) { if (!arguments.length) return x1; - x1 = x; + x1 = _; return area; }; - area.y = function(y) { + area.y = function(_) { if (!arguments.length) return y1; - y0 = y1 = y; + y0 = y1 = _; return area; }; - area.y0 = function(y) { + area.y0 = function(_) { if (!arguments.length) return y0; - y0 = y; + y0 = _; return area; }; - area.y1 = function(y) { + area.y1 = function(_) { if (!arguments.length) return y1; - y1 = y; + y1 = _; return area; }; - area.interpolate = function(x) { + area.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return area; + }; + + area.interpolate = function(_) { if (!arguments.length) return interpolate; - if (!d3_svg_lineInterpolators.has(x += "")) x = d3_svg_lineInterpolatorDefault; - i0 = d3_svg_lineInterpolators.get(interpolate = x); + if (!d3_svg_lineInterpolators.has(_ += "")) _ = d3_svg_lineInterpolatorDefault; + i0 = d3_svg_lineInterpolators.get(interpolate = _); i1 = i0.reverse || i0; + L = /-closed$/.test(_) ? "M" : "L"; return area; }; - area.tension = function(x) { + area.tension = function(_) { if (!arguments.length) return tension; - tension = x; + tension = _; return area; }; - return area.interpolate("linear"); + return area; } d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; @@ -3754,18 +3802,6 @@ d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; d3.svg.area = function() { return d3_svg_area(Object); }; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} d3.svg.area.radial = function() { var area = d3_svg_area(d3_svg_lineRadial); area.radius = area.x, delete area.x; @@ -3825,31 +3861,31 @@ d3.svg.chord = function() { chord.radius = function(v) { if (!arguments.length) return radius; - radius = d3.functor(v); + radius = d3_functor(v); return chord; }; chord.source = function(v) { if (!arguments.length) return source; - source = d3.functor(v); + source = d3_functor(v); return chord; }; chord.target = function(v) { if (!arguments.length) return target; - target = d3.functor(v); + target = d3_functor(v); return chord; }; chord.startAngle = function(v) { if (!arguments.length) return startAngle; - startAngle = d3.functor(v); + startAngle = d3_functor(v); return chord; }; chord.endAngle = function(v) { if (!arguments.length) return endAngle; - endAngle = d3.functor(v); + endAngle = d3_functor(v); return chord; }; @@ -3891,13 +3927,13 @@ d3.svg.diagonal = function() { diagonal.source = function(x) { if (!arguments.length) return source; - source = d3.functor(x); + source = d3_functor(x); return diagonal; }; diagonal.target = function(x) { if (!arguments.length) return target; - target = d3.functor(x); + target = d3_functor(x); return diagonal; }; @@ -3949,14 +3985,14 @@ d3.svg.symbol = function() { symbol.type = function(x) { if (!arguments.length) return type; - type = d3.functor(x); + type = d3_functor(x); return symbol; }; // size of symbol in square pixels symbol.size = function(x) { if (!arguments.length) return size; - size = d3.functor(x); + size = d3_functor(x); return symbol; }; @@ -4084,17 +4120,23 @@ d3.svg.axis = function() { tickEnter.append("line").attr("class", "tick"); tickEnter.append("text"); - tickUpdate.select("text").text(tickFormat); + + var lineEnter = tickEnter.select("line"), + lineUpdate = tickUpdate.select("line"), + text = tick.select("text").text(tickFormat), + textEnter = tickEnter.select("text"), + textUpdate = tickUpdate.select("text"); switch (orient) { case "bottom": { tickTransform = d3_svg_axisX; subtickEnter.attr("y2", tickMinorSize); subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize); - tickEnter.select("line").attr("y2", tickMajorSize); - tickEnter.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle"); + lineEnter.attr("y2", tickMajorSize); + textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding); + lineUpdate.attr("x2", 0).attr("y2", tickMajorSize); + textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding); + text.attr("dy", ".71em").attr("text-anchor", "middle"); pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); break; } @@ -4102,10 +4144,11 @@ d3.svg.axis = function() { tickTransform = d3_svg_axisX; subtickEnter.attr("y2", -tickMinorSize); subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize); - tickEnter.select("line").attr("y2", -tickMajorSize); - tickEnter.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle"); + lineEnter.attr("y2", -tickMajorSize); + textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); + lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize); + textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); + text.attr("dy", "0em").attr("text-anchor", "middle"); pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); break; } @@ -4113,10 +4156,11 @@ d3.svg.axis = function() { tickTransform = d3_svg_axisY; subtickEnter.attr("x2", -tickMinorSize); subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0); - tickEnter.select("line").attr("x2", -tickMajorSize); - tickEnter.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end"); + lineEnter.attr("x2", -tickMajorSize); + textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); + lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0); + textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0); + text.attr("dy", ".32em").attr("text-anchor", "end"); pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); break; } @@ -4124,10 +4168,11 @@ d3.svg.axis = function() { tickTransform = d3_svg_axisY; subtickEnter.attr("x2", tickMinorSize); subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0); - tickEnter.select("line").attr("x2", tickMajorSize); - tickEnter.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start"); + lineEnter.attr("x2", tickMajorSize); + textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding); + lineUpdate.attr("x2", tickMajorSize).attr("y2", 0); + textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0); + text.attr("dy", ".32em").attr("text-anchor", "start"); pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); break; } @@ -4633,6 +4678,7 @@ d3.behavior.drag = function() { offset = [0, 0]; } + d3_eventCancel(); event_({type: "dragstart"}); function point() { @@ -4787,7 +4833,7 @@ d3.behavior.zoom = function() { function mouseup() { if (moved) d3_eventCancel(); w.on("mousemove.zoom", null).on("mouseup.zoom", null); - if (moved && d3.event.target === eventTarget) w.on("click.zoom", click); + if (moved && d3.event.target === eventTarget) w.on("click.zoom", click, true); } function click() { @@ -5011,12 +5057,12 @@ d3.layout.chord = function() { value: v }; } - groups.push({ + groups[di] = { index: di, startAngle: x0, endAngle: x, value: (x - x0) / k - }); + }; x += padding; } @@ -5229,7 +5275,7 @@ d3.layout.force = function() { force.linkDistance = function(x) { if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); + linkDistance = d3_functor(x); return force; }; @@ -5238,7 +5284,7 @@ d3.layout.force = function() { force.linkStrength = function(x) { if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); + linkStrength = d3_functor(x); return force; }; @@ -5366,7 +5412,7 @@ d3.layout.force = function() { // use `node.call(force.drag)` to make nodes draggable force.drag = function() { if (!drag) drag = d3.behavior.drag() - .origin(Object) + .origin(d3_identity) .on("dragstart", dragstart) .on("drag", d3_layout_forceDrag) .on("dragend", d3_layout_forceDragEnd); @@ -5526,6 +5572,7 @@ d3.layout.pie = function() { // They are stored in the original data's order. var arcs = []; index.forEach(function(i) { + var d; arcs[i] = { data: data[i], value: d = values[i], @@ -5589,7 +5636,7 @@ d3.layout.pie = function() { var d3_layout_pieSortByValue = {}; // data is two-dimensional array of x,y; we populate y0 d3.layout.stack = function() { - var values = Object, + var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, @@ -5854,12 +5901,14 @@ d3.layout.histogram = function() { } // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); + if (m > 0) { + i = -1; while(++i < n) { + x = values[i]; + if ((x >= range[0]) && (x <= range[1])) { + bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; + bin.y += k; + bin.push(data[i]); + } } } @@ -5882,7 +5931,7 @@ d3.layout.histogram = function() { // values. histogram.range = function(x) { if (!arguments.length) return ranger; - ranger = d3.functor(x); + ranger = d3_functor(x); return histogram; }; @@ -5899,7 +5948,7 @@ d3.layout.histogram = function() { if (!arguments.length) return binner; binner = typeof x === "number" ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); + : d3_functor(x); return histogram; }; @@ -5947,7 +5996,8 @@ d3.layout.hierarchy = function() { n, c = node.children = [], v = 0, - j = depth + 1; + j = depth + 1, + d; while (++i < n) { d = recurse(childs[i], j, nodes); d.parent = node; @@ -7235,13 +7285,15 @@ function d3_geo_type(types, defaultValue) { d3.geo.path = function() { var pointRadius = 4.5, pointCircle = d3_path_circle(pointRadius), - projection = d3.geo.albersUsa(); + projection = d3.geo.albersUsa(), + buffer = []; function path(d, i) { - if (typeof pointRadius === "function") { - pointCircle = d3_path_circle(pointRadius.apply(this, arguments)); - } - return pathType(d) || null; + if (typeof pointRadius === "function") pointCircle = d3_path_circle(pointRadius.apply(this, arguments)); + pathType(d); + var result = buffer.length ? buffer.join("") : null; + buffer = []; + return result; } function project(coordinates) { @@ -7251,44 +7303,38 @@ d3.geo.path = function() { var pathType = d3_geo_type({ FeatureCollection: function(o) { - var path = [], - features = o.features, + var features = o.features, i = -1, // features.index n = features.length; - while (++i < n) path.push(pathType(features[i].geometry)); - return path.join(""); + while (++i < n) buffer.push(pathType(features[i].geometry)); }, Feature: function(o) { - return pathType(o.geometry); + pathType(o.geometry); }, Point: function(o) { - return "M" + project(o.coordinates) + pointCircle; + buffer.push("M", project(o.coordinates), pointCircle); }, MultiPoint: function(o) { - var path = [], - coordinates = o.coordinates, + var coordinates = o.coordinates, i = -1, // coordinates.index n = coordinates.length; - while (++i < n) path.push("M", project(coordinates[i]), pointCircle); - return path.join(""); + while (++i < n) buffer.push("M", project(coordinates[i]), pointCircle); }, LineString: function(o) { - var path = ["M"], - coordinates = o.coordinates, + var coordinates = o.coordinates, i = -1, // coordinates.index n = coordinates.length; - while (++i < n) path.push(project(coordinates[i]), "L"); - path.pop(); - return path.join(""); + buffer.push("M"); + while (++i < n) buffer.push(project(coordinates[i]), "L"); + buffer.pop(); }, MultiLineString: function(o) { - var path = [], - coordinates = o.coordinates, + var coordinates = o.coordinates, i = -1, // coordinates.index n = coordinates.length, subcoordinates, // coordinates[i] @@ -7298,16 +7344,14 @@ d3.geo.path = function() { subcoordinates = coordinates[i]; j = -1; m = subcoordinates.length; - path.push("M"); - while (++j < m) path.push(project(subcoordinates[j]), "L"); - path.pop(); + buffer.push("M"); + while (++j < m) buffer.push(project(subcoordinates[j]), "L"); + buffer.pop(); } - return path.join(""); }, Polygon: function(o) { - var path = [], - coordinates = o.coordinates, + var coordinates = o.coordinates, i = -1, // coordinates.index n = coordinates.length, subcoordinates, // coordinates[i] @@ -7317,17 +7361,15 @@ d3.geo.path = function() { subcoordinates = coordinates[i]; j = -1; if ((m = subcoordinates.length - 1) > 0) { - path.push("M"); - while (++j < m) path.push(project(subcoordinates[j]), "L"); - path[path.length - 1] = "Z"; + buffer.push("M"); + while (++j < m) buffer.push(project(subcoordinates[j]), "L"); + buffer[buffer.length - 1] = "Z"; } } - return path.join(""); }, MultiPolygon: function(o) { - var path = [], - coordinates = o.coordinates, + var coordinates = o.coordinates, i = -1, // coordinates index n = coordinates.length, subcoordinates, // coordinates[i] @@ -7344,22 +7386,19 @@ d3.geo.path = function() { subsubcoordinates = subcoordinates[j]; k = -1; if ((p = subsubcoordinates.length - 1) > 0) { - path.push("M"); - while (++k < p) path.push(project(subsubcoordinates[k]), "L"); - path[path.length - 1] = "Z"; + buffer.push("M"); + while (++k < p) buffer.push(project(subsubcoordinates[k]), "L"); + buffer[buffer.length - 1] = "Z"; } } } - return path.join(""); }, GeometryCollection: function(o) { - var path = [], - geometries = o.geometries, + var geometries = o.geometries, i = -1, // geometries index n = geometries.length; - while (++i < n) path.push(pathType(geometries[i])); - return path.join(""); + while (++i < n) buffer.push(pathType(geometries[i])); } }); @@ -7585,7 +7624,7 @@ d3.geo.circle = function() { var origin = [0, 0], degrees = 90 - 1e-2, radians = degrees * d3_geo_radians, - arc = d3.geo.greatArc().target(Object); + arc = d3.geo.greatArc().source(origin).target(d3_identity); function circle() { // TODO render a circle as a Polygon @@ -7596,14 +7635,14 @@ d3.geo.circle = function() { } circle.clip = function(d) { - arc.source(typeof origin === "function" ? origin.apply(this, arguments) : origin); - return clipType(d); + if (typeof origin === "function") arc.source(origin.apply(this, arguments)); + return clipType(d) || null; }; var clipType = d3_geo_type({ FeatureCollection: function(o) { - var features = o.features.map(clipType).filter(Object); + var features = o.features.map(clipType).filter(d3_identity); return features && (o = Object.create(o), o.features = features, o); }, @@ -7645,7 +7684,7 @@ d3.geo.circle = function() { }, GeometryCollection: function(o) { - var geometries = o.geometries.map(clipType).filter(Object); + var geometries = o.geometries.map(clipType).filter(d3_identity); return geometries.length && (o = Object.create(o), o.geometries = geometries, o); } @@ -7677,9 +7716,11 @@ d3.geo.circle = function() { d0 = d1; } - if (p1 && clipped.length) { - d1 = arc.distance(p2 = clipped[0]); - clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1))); + // Close the clipped polygon if necessary. + p0 = coordinates[0]; + p1 = clipped[0]; + if (p1 && p2[0] === p0[0] && p2[1] === p0[1] && !(p2[0] === p1[0] && p2[1] === p1[1])) { + clipped.push(p1); } return resample(clipped); @@ -7707,6 +7748,7 @@ d3.geo.circle = function() { circle.origin = function(x) { if (!arguments.length) return origin; origin = x; + if (typeof origin !== "function") arc.source(origin); return circle; }; @@ -7716,58 +7758,49 @@ d3.geo.circle = function() { return circle; }; - // Precision is specified in degrees. - circle.precision = function(x) { - if (!arguments.length) return arc.precision(); - arc.precision(x); - return circle; - }; - - return circle; + return d3.rebind(circle, arc, "precision"); } d3.geo.greatArc = function() { - var source = d3_geo_greatArcSource, - target = d3_geo_greatArcTarget, - precision = 6 * d3_geo_radians; + var source = d3_geo_greatArcSource, p0, + target = d3_geo_greatArcTarget, p1, + precision = 6 * d3_geo_radians, + interpolate = d3_geo_greatArcInterpolator(); function greatArc() { - var a = typeof source === "function" ? source.apply(this, arguments) : source, - b = typeof target === "function" ? target.apply(this, arguments) : target, - i = d3_geo_greatArcInterpolate(a, b), - dt = precision / i.d, + var d = greatArc.distance.apply(this, arguments), // initializes the interpolator, too t = 0, - coordinates = [a]; - while ((t += dt) < 1) coordinates.push(i(t)); - coordinates.push(b); - return { - type: "LineString", - coordinates: coordinates - }; + dt = precision / d, + coordinates = [p0]; + while ((t += dt) < 1) coordinates.push(interpolate(t)); + coordinates.push(p1); + return {type: "LineString", coordinates: coordinates}; } // Length returned in radians; multiply by radius for distance. greatArc.distance = function() { - var a = typeof source === "function" ? source.apply(this, arguments) : source, - b = typeof target === "function" ? target.apply(this, arguments) : target; - return d3_geo_greatArcInterpolate(a, b).d; + if (typeof source === "function") interpolate.source(p0 = source.apply(this, arguments)); + if (typeof target === "function") interpolate.target(p1 = target.apply(this, arguments)); + return interpolate.distance(); }; - greatArc.source = function(x) { + greatArc.source = function(_) { if (!arguments.length) return source; - source = x; + source = _; + if (typeof source !== "function") interpolate.source(p0 = source); return greatArc; }; - greatArc.target = function(x) { + greatArc.target = function(_) { if (!arguments.length) return target; - target = x; + target = _; + if (typeof target !== "function") interpolate.target(p1 = target); return greatArc; }; // Precision is specified in degrees. - greatArc.precision = function(x) { + greatArc.precision = function(_) { if (!arguments.length) return precision / d3_geo_radians; - precision = x * d3_geo_radians; + precision = _ * d3_geo_radians; return greatArc; }; @@ -7782,29 +7815,59 @@ function d3_geo_greatArcTarget(d) { return d.target; } -function d3_geo_greatArcInterpolate(a, b) { - var x0 = a[0] * d3_geo_radians, cx0 = Math.cos(x0), sx0 = Math.sin(x0), - y0 = a[1] * d3_geo_radians, cy0 = Math.cos(y0), sy0 = Math.sin(y0), - x1 = b[0] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1), - y1 = b[1] * d3_geo_radians, cy1 = Math.cos(y1), sy1 = Math.sin(y1), - d = interpolate.d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))), - sd = Math.sin(d); - - // From http://williams.best.vwh.net/avform.htm#Intermediate +function d3_geo_greatArcInterpolator() { + var x0, y0, cy0, sy0, kx0, ky0, + x1, y1, cy1, sy1, kx1, ky1, + d, + k; + function interpolate(t) { - var A = Math.sin(d - (t *= d)) / sd, - B = Math.sin(t) / sd, - x = A * cy0 * cx0 + B * cy1 * cx1, - y = A * cy0 * sx0 + B * cy1 * sx1, - z = A * sy0 + B * sy1; + var B = Math.sin(t *= d) * k, + A = Math.sin(d - t) * k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; return [ Math.atan2(y, x) / d3_geo_radians, Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians ]; } + interpolate.distance = function() { + if (d == null) k = 1 / Math.sin(d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0))))); + return d; + }; + + interpolate.source = function(_) { + var cx0 = Math.cos(x0 = _[0] * d3_geo_radians), + sx0 = Math.sin(x0); + cy0 = Math.cos(y0 = _[1] * d3_geo_radians); + sy0 = Math.sin(y0); + kx0 = cy0 * cx0; + ky0 = cy0 * sx0; + d = null; + return interpolate; + }; + + interpolate.target = function(_) { + var cx1 = Math.cos(x1 = _[0] * d3_geo_radians), + sx1 = Math.sin(x1); + cy1 = Math.cos(y1 = _[1] * d3_geo_radians); + sy1 = Math.sin(y1); + kx1 = cy1 * cx1; + ky1 = cy1 * sx1; + d = null; + return interpolate; + }; + return interpolate; } + +function d3_geo_greatArcInterpolate(a, b) { + var i = d3_geo_greatArcInterpolator().source(a).target(b); + i.distance(); + return i; +} d3.geo.greatCircle = d3.geo.circle; d3.geom = {}; /** @@ -8809,7 +8872,7 @@ function d3_time_parseWeekday(date, string, i) { } var d3_time_weekdayAbbrevRe = /^(?:sun|mon|tue|wed|thu|fri|sat)/i, - d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/i; + d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/i, d3_time_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; function d3_time_parseMonthAbbrev(date, string, i) { @@ -8993,7 +9056,8 @@ function d3_time_formatIsoNative(date) { } d3_time_formatIsoNative.parse = function(string) { - return new Date(string); + var date = new Date(string); + return isNaN(date) ? null : date; }; d3_time_formatIsoNative.toString = d3_time_formatIso.toString; |