Add cardinal splines and clustered graph example

This commit is contained in:
Jeffrey Heer 2010-12-15 09:32:29 -08:00
Родитель 70cb5359c9
Коммит 633a931f5b
6 изменённых файлов: 553 добавлений и 65 удалений

Просмотреть файл

@ -72,6 +72,7 @@ d3.svg.js: \
src/svg/line.js \
src/svg/area.js \
src/svg/chord.js \
src/svg/curve.js \
src/svg/mouse.js
d3.layout.js: \

81
d3.js поставляемый
Просмотреть файл

@ -2287,7 +2287,86 @@ function d3_svg_chordStartAngle(d) {
function d3_svg_chordEndAngle(d) {
return d["endAngle"];
}
d3.svg.mouse = function(container) {
d3["svg"]["path"] = function(points) {
return "M" + points.join("L") + "Z";
}
d3["svg"]["cardinal"] = function(points, tension) {
if (points.length <= 2) return "";
if (tension == undefined) tension = 0.8;
return "M" + points[0] + d3_svg_curveHermite(points,
d3_svg_curveCardinalTangents(points, tension));
}
function d3_svg_curveCardinalTangents(points, tension) {
var pts = points,
N = pts.length-1;
// if closed shape, adjust endpoints to get all tangents
if (pts[0][0] == pts[N][0] && pts[0][1] == pts[N][1]) {
pts = [points[N-1]].concat(points);
pts.push(points[1]);
}
var tangents = [],
a = (1 - tension) / 2,
p0 = pts[0],
p1 = pts[1],
p2 = pts[2];
for (var i = 3; i < pts.length; i++) {
tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]);
p0 = p1;
p1 = p2;
p2 = pts[i];
}
tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]);
return tangents;
}
function d3_svg_curveHermite(points, tangents) {
if (tangents.length < 1
|| (points.length != tangents.length
&& points.length != tangents.length + 2)) return "";
var quad = points.length != tangents.length,
path = "",
p0 = points[0],
p = points[1],
t0 = tangents[0],
t = t0,
pi = 1;
if (quad) {
path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3)
+ "," + p[0] + "," + p[1];
p0 = points[1];
pi = 2;
}
if (tangents.length > 1) {
t = tangents[1];
p = points[pi];
pi++;
path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1])
+ "," + (p[0] - t[0]) + "," + (p[1] - t[1])
+ "," + p[0] + "," + p[1];
for (var i = 2; i < tangents.length; i++, pi++) {
p = points[pi];
t = tangents[i];
path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1])
+ "," + p[0] + "," + p[1];
}
}
if (quad) {
var lp = points[pi];
path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + ","
+ lp[0] + "," + lp[1];
}
return path;
}d3.svg.mouse = function(container) {
var point = (container.ownerSVGElement || container).createSVGPoint();
if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) {
var svg = d3.select(document.body)

110
d3.min.js поставляемый
Просмотреть файл

@ -1,64 +1,66 @@
(function(){var n=null;d3={version:"0.28.2"};if(!Date.now)Date.now=function(){return+new Date};if(!Object.create)Object.create=function(a){function b(){}b.prototype=a;return new b};function x(a){return Array.prototype.slice.call(a)}function y(a){return typeof a=="function"?a:function(){return a}}d3.ascending=function(a,b){return a<b?-1:a>b?1:0};d3.descending=function(a,b){return b<a?-1:b>a?1:0};d3.merge=function(a){return Array.prototype.concat.apply([],a)};
d3.split=function(a,b){var c=[],f=[],d,e=-1,h=a.length;if(arguments.length<2)b=aa;for(;++e<h;)if(b.call(f,d=a[e],e)){c.push(f);f=[]}else f.push(d);c.push(f);return c};function aa(a){return a==n}function E(a){return a.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/g," ")}function ba(a,b){b=x(arguments);b[0]=this;a.apply(this,b);return this}
d3.range=function(a,b,c){if(arguments.length==1){b=a;a=0}if(c==n)c=1;if((b-a)/c==Infinity)throw Error("infinite range");var f=[],d=-1,e;if(c<0)for(;(e=a+c*++d)>b;)f.push(e);else for(;(e=a+c*++d)<b;)f.push(e);return f};d3.requote=function(a){return a.replace(ca,"\\$&")};var ca=/[\\\^\$\*\+\?\[\]\(\)\.\{\}]/g;
d3.xhr=function(a,b,c){var f=new XMLHttpRequest;if(arguments.length<3)c=b;else b&&f.overrideMimeType(b);f.open("GET",a,true);f.onreadystatechange=function(){if(f.readyState==4)c(f.status<300?f:n)};f.send(n)};d3.text=function(a,b,c){if(arguments.length<3){c=b;b=n}d3.xhr(a,b,function(f){c(f&&f.responseText)})};d3.json=function(a,b){d3.text(a,"application/json",function(c){b(c?JSON.parse(c):n)})};
d3.html=function(a,b){d3.text(a,"text/html",function(c){if(c!=n){var f=document.createRange();f.selectNode(document.body);c=f.createContextualFragment(c)}b(c)})};d3.xml=function(a,b,c){if(arguments.length<3){c=b;b=n}d3.xhr(a,b,function(f){c(f&&f.responseXML)})};
d3.ns={prefix:{svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},qualify:function(a){var b=a.indexOf(":");return b<0?a:{space:d3.ns.prefix[a.substring(0,b)],local:a.substring(b+1)}}};d3.dispatch=function(){for(var a={},b,c=0,f=arguments.length;c<f;c++){b=arguments[c];a[b]=da(b)}return a};
function da(){var a={},b=[];a.add=function(c){for(var f=0;f<b.length;f++)if(b[f].i==c)return a;b.push({i:c,on:true});return a};a.remove=function(c){for(var f=0;f<b.length;f++){var d=b[f];if(d.i==c){d.on=false;b=b.slice(0,f).concat(b.slice(f+1));break}}return a};a.dispatch=function(){for(var c=b,f=0,d=c.length;f<d;f++){var e=c[f];e.on&&e.i.apply(this,arguments)}};return a}
d3.format=function(a){a=ea.exec(a);var b=a[1]||" ",c=a[5],f=+a[6],d=a[7],e=a[8],h=a[9];if(e)e=e.substring(1);if(c)b="0";if(h=="d")e="0";return function(g){if(h=="d"&&g%1)return"";if(e)g=(+g).toFixed(e);else g+="";if(d){for(var i=g.lastIndexOf("."),j=i>=0?g.substring(i):(i=g.length,""),l=[];i>0;)l.push(g.substring(i-=3,i+3));g=l.reverse().join(",")+j}i=g.length;if(i<f)g=Array(f-i+1).join(b)+g;return g}};
(function(){var n=null;d3={version:"0.28.2"};if(!Date.now)Date.now=function(){return+new Date};if(!Object.create)Object.create=function(a){function c(){}c.prototype=a;return new c};function x(a){return Array.prototype.slice.call(a)}function y(a){return typeof a=="function"?a:function(){return a}}d3.ascending=function(a,c){return a<c?-1:a>c?1:0};d3.descending=function(a,c){return c<a?-1:c>a?1:0};d3.merge=function(a){return Array.prototype.concat.apply([],a)};
d3.split=function(a,c){var e=[],f=[],d,b=-1,h=a.length;if(arguments.length<2)c=aa;for(;++b<h;)if(c.call(f,d=a[b],b)){e.push(f);f=[]}else f.push(d);e.push(f);return e};function aa(a){return a==n}function E(a){return a.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/g," ")}function ba(a,c){c=x(arguments);c[0]=this;a.apply(this,c);return this}
d3.range=function(a,c,e){if(arguments.length==1){c=a;a=0}if(e==n)e=1;if((c-a)/e==Infinity)throw Error("infinite range");var f=[],d=-1,b;if(e<0)for(;(b=a+e*++d)>c;)f.push(b);else for(;(b=a+e*++d)<c;)f.push(b);return f};d3.requote=function(a){return a.replace(ca,"\\$&")};var ca=/[\\\^\$\*\+\?\[\]\(\)\.\{\}]/g;
d3.xhr=function(a,c,e){var f=new XMLHttpRequest;if(arguments.length<3)e=c;else c&&f.overrideMimeType(c);f.open("GET",a,true);f.onreadystatechange=function(){if(f.readyState==4)e(f.status<300?f:n)};f.send(n)};d3.text=function(a,c,e){if(arguments.length<3){e=c;c=n}d3.xhr(a,c,function(f){e(f&&f.responseText)})};d3.json=function(a,c){d3.text(a,"application/json",function(e){c(e?JSON.parse(e):n)})};
d3.html=function(a,c){d3.text(a,"text/html",function(e){if(e!=n){var f=document.createRange();f.selectNode(document.body);e=f.createContextualFragment(e)}c(e)})};d3.xml=function(a,c,e){if(arguments.length<3){e=c;c=n}d3.xhr(a,c,function(f){e(f&&f.responseXML)})};
d3.ns={prefix:{svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},qualify:function(a){var c=a.indexOf(":");return c<0?a:{space:d3.ns.prefix[a.substring(0,c)],local:a.substring(c+1)}}};d3.dispatch=function(){for(var a={},c,e=0,f=arguments.length;e<f;e++){c=arguments[e];a[c]=da(c)}return a};
function da(){var a={},c=[];a.add=function(e){for(var f=0;f<c.length;f++)if(c[f].i==e)return a;c.push({i:e,on:true});return a};a.remove=function(e){for(var f=0;f<c.length;f++){var d=c[f];if(d.i==e){d.on=false;c=c.slice(0,f).concat(c.slice(f+1));break}}return a};a.dispatch=function(){for(var e=c,f=0,d=e.length;f<d;f++){var b=e[f];b.on&&b.i.apply(this,arguments)}};return a}
d3.format=function(a){a=ea.exec(a);var c=a[1]||" ",e=a[5],f=+a[6],d=a[7],b=a[8],h=a[9];if(b)b=b.substring(1);if(e)c="0";if(h=="d")b="0";return function(g){if(h=="d"&&g%1)return"";if(b)g=(+g).toFixed(b);else g+="";if(d){for(var i=g.lastIndexOf("."),j=i>=0?g.substring(i):(i=g.length,""),l=[];i>0;)l.push(g.substring(i-=3,i+3));g=l.reverse().join(",")+j}i=g.length;if(i<f)g=Array(f-i+1).join(c)+g;return g}};
var ea=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,fa=F(2),ga=F(3),oa={linear:function(){return ha},poly:F,quad:function(){return fa},cubic:function(){return ga},sin:function(){return ia},exp:function(){return ja},circle:function(){return ka},elastic:la,back:ma,bounce:function(){return na}},ra={"in":function(a){return a},out:pa,"in-out":qa,"out-in":function(a){return qa(pa(a))}};
d3.ease=function(a){var b=a.indexOf("-");return ra[b>=0?a.substring(b+1):"in"](oa[b>=0?a.substring(0,b):a].apply(n,Array.prototype.slice.call(arguments,1)))};function pa(a){return function(b){return 1-a(1-b)}}function qa(a){return function(b){return 0.5*(b<0.5?a(2*b):2-a(2-2*b))}}function ha(a){return a}function F(a){return function(b){return Math.pow(b,a)}}function ia(a){return 1-Math.cos(a*Math.PI/2)}function ja(a){return a?Math.pow(2,10*(a-1))-0.0010:0}
function ka(a){return 1-Math.sqrt(1-a*a)}function la(a,b){var c;if(arguments.length<2)b=0.45;if(arguments.length<1){a=1;c=b/4}else c=b/(2*Math.PI)*Math.asin(1/a);return function(f){return 1+a*Math.pow(2,10*-f)*Math.sin((f-c)*2*Math.PI/b)}}function ma(a){a||(a=1.70158);return function(b){return b*b*((a+1)*b-a)}}function na(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+0.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375}d3.event=n;
d3.interpolate=function(a,b){if(typeof b=="number")return d3.interpolateNumber(+a,b);if(typeof b=="string")return b in G||/^(#|rgb\(|hsl\()/.test(b)?d3.interpolateRgb(String(a),b):d3.interpolateString(String(a),b);if(b instanceof Array)return d3.interpolateArray(a,b);return d3.interpolateObject(a,b)};d3.interpolateNumber=function(a,b){b-=a;return function(c){return a+b*c}};
d3.interpolateString=function(a,b){var c,f,d=0,e=[],h=[],g,i;for(f=0;c=H.exec(b);++f){c.index&&e.push(b.substring(d,c.index));h.push({a:e.length,x:c[0]});e.push(n);d=H.lastIndex}d<b.length&&e.push(b.substring(d));f=0;for(g=h.length;(c=H.exec(a))&&f<g;++f){i=h[f];if(i.x==c[0]){if(i.a)if(e[i.a+1]==n){e[i.a-1]+=i.x;e.splice(i.a,1);for(c=f+1;c<g;++c)h[c].a--}else{e[i.a-1]+=i.x+e[i.a+1];e.splice(i.a,2);for(c=f+1;c<g;++c)h[c].a-=2}else if(e[i.a+1]==n)e[i.a]=i.x;else{e[i.a]=i.x+e[i.a+1];e.splice(i.a+1,1);
for(c=f+1;c<g;++c)h[c].a--}h.splice(f,1);g--;f--}else i.x=d3.interpolateNumber(parseFloat(c[0]),parseFloat(i.x))}for(;f<g;){i=h.pop();if(e[i.a+1]==n)e[i.a]=i.x;else{e[i.a]=i.x+e[i.a+1];e.splice(i.a+1,1)}g--}if(e.length==1)return e[0]==n?h[0].x:function(){return b};return function(j){for(f=0;f<g;++f)e[(i=h[f]).a]=i.x(j);return e.join("")}};
d3.interpolateRgb=function(a,b){a=d3.rgb(a);b=d3.rgb(b);var c=a.r,f=a.g,d=a.b,e=b.r-c,h=b.g-f,g=b.b-d;return function(i){return"rgb("+Math.round(c+e*i)+","+Math.round(f+h*i)+","+Math.round(d+g*i)+")"}};d3.interpolateArray=function(a,b){var c=[],f=[],d=a.length,e=b.length,h=Math.min(a.length,b.length),g;for(g=0;g<h;++g)c.push(d3.interpolate(a[g],b[g]));for(;g<d;++g)f[g]=a[g];for(;g<e;++g)f[g]=b[g];return function(i){for(g=0;g<h;++g)f[g]=c[g](i);return f}};
d3.interpolateObject=function(a,b){var c={},f={},d;for(d in a)if(d in b)c[d]=(d in sa||/\bcolor\b/.test(d)?d3.interpolateRgb:d3.interpolate)(a[d],b[d]);else f[d]=a[d];for(d in b)d in a||(f[d]=b[d]);return function(e){for(d in c)f[d]=c[d](e);return f}};var H=/[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g,sa={background:1,fill:1,stroke:1};d3.rgb=function(a,b,c){return arguments.length==1?I(""+a,J,ta):J(~~a,~~b,~~c)};function J(a,b,c){return{r:a,g:b,b:c,toString:ua}}
d3.ease=function(a){var c=a.indexOf("-");return ra[c>=0?a.substring(c+1):"in"](oa[c>=0?a.substring(0,c):a].apply(n,Array.prototype.slice.call(arguments,1)))};function pa(a){return function(c){return 1-a(1-c)}}function qa(a){return function(c){return 0.5*(c<0.5?a(2*c):2-a(2-2*c))}}function ha(a){return a}function F(a){return function(c){return Math.pow(c,a)}}function ia(a){return 1-Math.cos(a*Math.PI/2)}function ja(a){return a?Math.pow(2,10*(a-1))-0.0010:0}
function ka(a){return 1-Math.sqrt(1-a*a)}function la(a,c){var e;if(arguments.length<2)c=0.45;if(arguments.length<1){a=1;e=c/4}else e=c/(2*Math.PI)*Math.asin(1/a);return function(f){return 1+a*Math.pow(2,10*-f)*Math.sin((f-e)*2*Math.PI/c)}}function ma(a){a||(a=1.70158);return function(c){return c*c*((a+1)*c-a)}}function na(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+0.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375}d3.event=n;
d3.interpolate=function(a,c){if(typeof c=="number")return d3.interpolateNumber(+a,c);if(typeof c=="string")return c in G||/^(#|rgb\(|hsl\()/.test(c)?d3.interpolateRgb(String(a),c):d3.interpolateString(String(a),c);if(c instanceof Array)return d3.interpolateArray(a,c);return d3.interpolateObject(a,c)};d3.interpolateNumber=function(a,c){c-=a;return function(e){return a+c*e}};
d3.interpolateString=function(a,c){var e,f,d=0,b=[],h=[],g,i;for(f=0;e=H.exec(c);++f){e.index&&b.push(c.substring(d,e.index));h.push({a:b.length,x:e[0]});b.push(n);d=H.lastIndex}d<c.length&&b.push(c.substring(d));f=0;for(g=h.length;(e=H.exec(a))&&f<g;++f){i=h[f];if(i.x==e[0]){if(i.a)if(b[i.a+1]==n){b[i.a-1]+=i.x;b.splice(i.a,1);for(e=f+1;e<g;++e)h[e].a--}else{b[i.a-1]+=i.x+b[i.a+1];b.splice(i.a,2);for(e=f+1;e<g;++e)h[e].a-=2}else if(b[i.a+1]==n)b[i.a]=i.x;else{b[i.a]=i.x+b[i.a+1];b.splice(i.a+1,1);
for(e=f+1;e<g;++e)h[e].a--}h.splice(f,1);g--;f--}else i.x=d3.interpolateNumber(parseFloat(e[0]),parseFloat(i.x))}for(;f<g;){i=h.pop();if(b[i.a+1]==n)b[i.a]=i.x;else{b[i.a]=i.x+b[i.a+1];b.splice(i.a+1,1)}g--}if(b.length==1)return b[0]==n?h[0].x:function(){return c};return function(j){for(f=0;f<g;++f)b[(i=h[f]).a]=i.x(j);return b.join("")}};
d3.interpolateRgb=function(a,c){a=d3.rgb(a);c=d3.rgb(c);var e=a.r,f=a.g,d=a.b,b=c.r-e,h=c.g-f,g=c.b-d;return function(i){return"rgb("+Math.round(e+b*i)+","+Math.round(f+h*i)+","+Math.round(d+g*i)+")"}};d3.interpolateArray=function(a,c){var e=[],f=[],d=a.length,b=c.length,h=Math.min(a.length,c.length),g;for(g=0;g<h;++g)e.push(d3.interpolate(a[g],c[g]));for(;g<d;++g)f[g]=a[g];for(;g<b;++g)f[g]=c[g];return function(i){for(g=0;g<h;++g)f[g]=e[g](i);return f}};
d3.interpolateObject=function(a,c){var e={},f={},d;for(d in a)if(d in c)e[d]=(d in sa||/\bcolor\b/.test(d)?d3.interpolateRgb:d3.interpolate)(a[d],c[d]);else f[d]=a[d];for(d in c)d in a||(f[d]=c[d]);return function(b){for(d in e)f[d]=e[d](b);return f}};var H=/[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g,sa={background:1,fill:1,stroke:1};d3.rgb=function(a,c,e){return arguments.length==1?I(""+a,J,ta):J(~~a,~~c,~~e)};function J(a,c,e){return{r:a,g:c,b:e,toString:ua}}
function ua(){return"#"+K(this.r)+K(this.g)+K(this.b)}function K(a){return a<16?"0"+a.toString(16):a.toString(16)}
function I(a,b,c){var f,d,e,h,g;if(h=/([a-z]+)\((.*)\)/i.exec(a)){g=h[2].split(",");switch(h[1]){case "hsl":return c(parseFloat(g[0]),parseFloat(g[1])/100,parseFloat(g[2])/100);case "rgb":return b(L(g[0]),L(g[1]),L(g[2]))}}if(c=G[a])return b(c.r,c.g,c.b);if(a==n)return b(0,0,0);if(a.charAt(0)=="#"){if(a.length==4){f=a.charAt(1);f+=f;d=a.charAt(2);d+=d;e=a.charAt(3);e+=e}else if(a.length==7){f=a.substring(1,3);d=a.substring(3,5);e=a.substring(5,7)}f=parseInt(f,16);d=parseInt(d,16);e=parseInt(e,16)}return b(f,
d,e)}function va(a,b,c){var f=Math.min(a/=255,b/=255,c/=255),d=Math.max(a,b,c),e=d-f,h=(d+f)/2;if(e){f=h<0.5?e/(d+f):e/(2-d-f);a=a==d?(b-c)/e+(b<c?6:0):b==d?(c-a)/e+2:(a-b)/e+4;a*=60}else f=a=0;return M(a,f,h)}function L(a){var b=parseFloat(a);return a.charAt(a.length-1)=="%"?Math.round(b*2.55):b}
function I(a,c,e){var f,d,b,h,g;if(h=/([a-z]+)\((.*)\)/i.exec(a)){g=h[2].split(",");switch(h[1]){case "hsl":return e(parseFloat(g[0]),parseFloat(g[1])/100,parseFloat(g[2])/100);case "rgb":return c(L(g[0]),L(g[1]),L(g[2]))}}if(e=G[a])return c(e.r,e.g,e.b);if(a==n)return c(0,0,0);if(a.charAt(0)=="#"){if(a.length==4){f=a.charAt(1);f+=f;d=a.charAt(2);d+=d;b=a.charAt(3);b+=b}else if(a.length==7){f=a.substring(1,3);d=a.substring(3,5);b=a.substring(5,7)}f=parseInt(f,16);d=parseInt(d,16);b=parseInt(b,16)}return c(f,
d,b)}function va(a,c,e){var f=Math.min(a/=255,c/=255,e/=255),d=Math.max(a,c,e),b=d-f,h=(d+f)/2;if(b){f=h<0.5?b/(d+f):b/(2-d-f);a=a==d?(c-e)/b+(c<e?6:0):c==d?(e-a)/b+2:(a-c)/b+4;a*=60}else f=a=0;return M(a,f,h)}function L(a){var c=parseFloat(a);return a.charAt(a.length-1)=="%"?Math.round(c*2.55):c}
var G={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",
darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",
ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",
lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",
moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",
seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},N;for(N in G)G[N]=I(G[N],J,ta);d3.hsl=function(a,b,c){return arguments.length==1?I(""+a,va,M):M(+a,+b,+c)};
function M(a,b,c){return{h:a,s:b,l:c,toString:wa}}function wa(){return"hsl("+this.h+","+this.s*100+"%,"+this.l*100+"%)"}function ta(a,b,c){function f(h){if(h>360)h-=360;else if(h<0)h+=360;if(h<60)return d+(e-d)*h/60;if(h<180)return e;if(h<240)return d+(e-d)*(240-h)/60;return d}var d,e;a%=360;if(a<0)a+=360;b=b<0?0:b>1?1:b;c=c<0?0:c>1?1:c;e=c<=0.5?c*(1+b):c+b-c*b;d=2*c-e;return J(Math.round(f(a+120)*255),Math.round(f(a)*255),Math.round(f(a-120)*255))}var P=O([[document]]);P[0].parentNode=document.documentElement;
seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},N;for(N in G)G[N]=I(G[N],J,ta);d3.hsl=function(a,c,e){return arguments.length==1?I(""+a,va,M):M(+a,+c,+e)};
function M(a,c,e){return{h:a,s:c,l:e,toString:wa}}function wa(){return"hsl("+this.h+","+this.s*100+"%,"+this.l*100+"%)"}function ta(a,c,e){function f(h){if(h>360)h-=360;else if(h<0)h+=360;if(h<60)return d+(b-d)*h/60;if(h<180)return b;if(h<240)return d+(b-d)*(240-h)/60;return d}var d,b;a%=360;if(a<0)a+=360;c=c<0?0:c>1?1:c;e=e<0?0:e>1?1:e;b=e<=0.5?e*(1+c):e+c-e*c;d=2*e-b;return J(Math.round(f(a+120)*255),Math.round(f(a)*255),Math.round(f(a-120)*255))}var P=O([[document]]);P[0].parentNode=document.documentElement;
d3.select=function(a){return typeof a=="string"?P.select(a):O([[a]])};d3.selectAll=function(a){return typeof a=="string"?P.selectAll(a):O([x(a)])};
function O(a){function b(d){for(var e=[],h,g,i,j,l=0,p=a.length;l<p;l++){i=a[l];e.push(h=[]);h.parentNode=i.parentNode;h.parentData=i.parentData;for(var r=0,k=i.length;r<k;r++)if(j=i[r]){h.push(g=d(j));if(g&&"__data__"in j)g.__data__=j.__data__}else h.push(n)}return O(e)}function c(d){for(var e=[],h,g,i,j=0,l=a.length;j<l;j++){g=a[j];for(var p=0,r=g.length;p<r;p++)if(i=g[p]){e.push(h=d(i));h.parentNode=i;h.parentData=i.__data__}}return O(e)}function f(d){for(var e=0,h=a.length;e<h;e++)for(var g=a[e],
i=0,j=g.length;i<j;i++){var l=g[i];if(l)return d.call(l,l.__data__,i)}return n}a.select=function(d){return b(function(e){return e.querySelector(d)})};a.selectAll=function(d){return c(function(e){return x(e.querySelectorAll(d))})};a.filter=function(d){for(var e=[],h,g,i,j=0,l=a.length;j<l;j++){g=a[j];e.push(h=[]);h.parentNode=g.parentNode;h.parentData=g.parentData;for(var p=0,r=g.length;p<r;p++)if((i=g[p])&&d.call(i,i.__data__,p))h.push(i)}return O(e)};a.data=function(d,e){function h(k,o){function q(Ga){return k.parentNode.appendChild(Ga)}
var m=0,t=k.length,u=o.length,s=Math.min(t,u),v=Math.max(t,u),z=[],A=[],w=[],B,C;if(e){s={};v=[];var D;C=o.length;for(m=0;m<t;m++){D=e.nodeKey(B=k[m]);if(D in s)w[C++]=k[m];else{s[D]=B;v.push(D)}}for(m=0;m<u;m++){if(B=s[D=e.dataKey(C=o[m])]){B.__data__=C;z[m]=B;A[m]=w[m]=n}else{A[m]={appendChild:q,__data__:C};z[m]=w[m]=n}delete s[D]}for(m=0;m<t;m++)if(v[m]in s)w[m]=k[m]}else{for(;m<s;m++){B=k[m];C=o[m];if(B){B.__data__=C;z[m]=B;A[m]=w[m]=n}else{A[m]={appendChild:q,__data__:C};z[m]=w[m]=n}}for(;m<
u;m++){A[m]={appendChild:q,__data__:o[m]};z[m]=w[m]=n}for(;m<v;m++){w[m]=k[m];A[m]=z[m]=n}}A.parentNode=z.parentNode=w.parentNode=k.parentNode;A.parentData=z.parentData=w.parentData=k.parentData;l.push(A);p.push(z);r.push(w)}var g=-1,i=a.length,j,l=[],p=[],r=[];if(typeof e=="string")e=xa(e);if(typeof d=="function")for(;++g<i;)h(j=a[g],d.call(j,j.parentData,g));else for(;++g<i;)h(j=a[g],d);g=O(p);g.enter=function(k){return O(l).append(k)};g.exit=function(){return O(r)};return g};a.each=function(d){for(var e=
0,h=a.length;e<h;e++)for(var g=a[e],i=0,j=g.length;i<j;i++){var l=g[i];l&&d.call(l,l.__data__,i)}return a};a.node=function(){return f(function(){return this})};a.attr=function(d,e){function h(){this.removeAttribute(d)}function g(){this.removeAttributeNS(d.space,d.local)}function i(){this.setAttribute(d,e)}function j(){this.setAttributeNS(d.space,d.local,e)}function l(){var r=e.apply(this,arguments);r==n?this.removeAttribute(d):this.setAttribute(d,r)}function p(){var r=e.apply(this,arguments);r==n?
this.removeAttributeNS(d.space,d.local):this.setAttributeNS(d.space,d.local,r)}d=d3.ns.qualify(d);if(arguments.length<2)return f(d.local?function(){return this.getAttributeNS(d.space,d.local)}:function(){return this.getAttribute(d)});return a.each(e==n?d.local?g:h:typeof e=="function"?d.local?p:l:d.local?j:i)};a.classed=function(d,e){function h(){var l=this.className;j.lastIndex=0;if(!j.test(l))this.className=E(l+" "+d)}function g(){var l=E(this.className.replace(j," "));this.className=l.length?l:
n}function i(){(e.apply(this,arguments)?h:g).call(this)}var j=RegExp("(^|\\s+)"+d3.requote(d)+"(\\s+|$)","g");if(arguments.length<2)return f(function(){j.lastIndex=0;return j.test(this.className)});return a.each(typeof e=="function"?i:e?h:g)};a.style=function(d,e,h){function g(){this.style.removeProperty(d)}function i(){this.style.setProperty(d,e,h)}function j(){var l=e.apply(this,arguments);l==n?this.style.removeProperty(d):this.style.setProperty(d,l,h)}if(arguments.length<3)h=n;if(arguments.length<
2)return f(function(){return window.getComputedStyle(this,n).getPropertyValue(d)});return a.each(e==n?g:typeof e=="function"?j:i)};a.property=function(d,e){function h(){delete this[d]}function g(){this[d]=e}function i(){var j=e.apply(this,arguments);if(j==n)delete this[d];else this[d]=j}d=d3.ns.qualify(d);if(arguments.length<2)return f(function(){return this[d]});return a.each(e==n?h:typeof e=="function"?i:g)};a.text=function(d){function e(){this.appendChild(document.createTextNode(d))}function h(){var g=
d.apply(this,arguments);g!=n&&this.appendChild(document.createTextNode(g))}if(arguments.length<1)return f(function(){return this.textContent});a.each(function(){for(;this.lastChild;)this.removeChild(this.lastChild)});return d==n?a:a.each(typeof d=="function"?h:e)};a.html=function(d){function e(){this.innerHTML=d}function h(){this.innerHTML=d.apply(this,arguments)}if(arguments.length<1)return f(function(){return this.innerHTML});return a.each(typeof d=="function"?h:e)};a.append=function(d){function e(g){return g.appendChild(document.createElement(d))}
function h(g){return g.appendChild(document.createElementNS(d.space,d.local))}d=d3.ns.qualify(d);return b(d.local?h:e)};a.remove=function(){return b(function(d){var e=d.parentNode;e.removeChild(d);return e})};a.sort=function(d){d=ya.apply(this,arguments);for(var e=0,h=a.length;e<h;e++){var g=a[e];g.sort(d);for(var i=1,j=g.length,l=g[0];i<j;i++){var p=g[i];if(p){l&&l.parentNode.insertBefore(p,l.nextSibling);l=p}}}return a};a.on=function(d,e){d="on"+d;return a.each(function(h,g){this[d]=function(i){var j=
d3.event;d3.event=i;try{e.call(this,h,g)}finally{d3.event=j}}})};a.transition=function(){return Q(a)};a.call=ba;return a}function xa(a){return{nodeKey:function(b){return b.getAttribute(a)},dataKey:function(b){return b[a]}}}function ya(a){if(!arguments.length)a=d3.u;return function(b,c){return a(b&&b.__data__,c&&c.__data__)}}d3.transition=P.transition;var za=0,R=0;
function Q(a){function b(k){var o=true,q=-1;a.each(function(){if(i[++q]!=2){var m=(k-j[q])/l[q],t=this.__transition__,u,s,v=e[q];if(m<1){o=false;if(m<0)return}else m=1;if(i[q]){if(t.d!=f){i[q]=2;return}}else if(!t||t.d>f){i[q]=2;return}else{i[q]=1;g.start.dispatch.apply(this,arguments);v=e[q]={};t.d=f;for(s in d)v[s]=d[s].apply(this,arguments)}u=r(m);for(s in d)v[s].call(this,u);if(m==1){i[q]=2;if(t.d==f){m=t.o;if(m==f){delete this.__transition__;h&&this.parentNode.removeChild(this)}R=f;g.end.dispatch.apply(this,
arguments);R=0;t.o=m}}}});return o}var c={},f=R||++za,d={},e=[],h=false,g=d3.dispatch("start","end"),i=[],j=[],l=[],p,r=d3.ease("cubic-in-out");a.each(function(){(this.__transition__||(this.__transition__={})).o=f});c.delay=function(k){var o=Infinity,q=-1;if(typeof k=="function")a.each(function(){var m=j[++q]=+k.apply(this,arguments);if(m<o)o=m});else{o=+k;a.each(function(){j[++q]=o})}Aa(b,o);return c};c.duration=function(k){var o=-1;if(typeof k=="function"){p=0;a.each(function(){var q=l[++o]=+k.apply(this,
arguments);if(q>p)p=q})}else{p=+k;a.each(function(){l[++o]=p})}return c};c.ease=function(k){r=typeof k=="string"?d3.ease(k):k;return c};c.attrTween=function(k,o){function q(t,u){var s=o.call(this,t,u,this.getAttribute(k));return function(v){this.setAttribute(k,s(v))}}function m(t,u){var s=o.call(this,t,u,this.getAttributeNS(k.space,k.local));return function(v){this.setAttributeNS(k.space,k.local,s(v))}}d["attr."+k]=k.local?m:q;return c};c.attr=function(k,o){return c.attrTween(k,Ba(o))};c.styleTween=
function(k,o,q){d["style."+k]=function(m,t){var u=o.call(this,m,t,window.getComputedStyle(this,n).getPropertyValue(k));return function(s){this.style.setProperty(k,u(s),q)}};return c};c.style=function(k,o,q){return c.styleTween(k,Ba(o),q)};c.select=function(k){var o;k=Q(a.select(k)).ease(r);o=-1;k.delay(function(){return j[++o]});o=-1;k.duration(function(){return l[++o]});return k};c.selectAll=function(k){var o;k=Q(a.selectAll(k)).ease(r);o=-1;k.delay(function(q,m){return j[m?o:++o]});o=-1;k.duration(function(q,
m){return l[m?o:++o]});return k};c.remove=function(){h=true;return c};c.each=function(k,o){g[k].add(o);return c};c.call=ba;return c.delay(0).duration(250)}var S=n,T=0,U;function Aa(a,b){var c=Date.now(),f=false,d=c+b,e=S;if(isFinite(b)){for(;e;){if(e.n==a){e.j=c;e.delay=b;f=true}else{var h=e.j+e.delay;if(h<d)d=h}e=e.next}f||(S={n:a,j:c,delay:b,next:S});if(!U){clearTimeout(T);T=setTimeout(Ca,Math.max(24,d-c))}}}function Ca(){U=setInterval(Da,24);T=0}
function Da(){for(var a,b=Date.now(),c=S;c;){a=b-c.j;if(a>c.delay)c.t=c.n(a);c=c.next}a=n;for(b=S;b;)b=b.t?a?a.next=b.next:S=b.next:(a=b).next;a||(U=clearInterval(U))}function Ba(a){return typeof a=="function"?function(b,c,f){return d3.interpolate(f,a.call(this,b,c))}:function(b,c,f){return d3.interpolate(f,a)}}d3.scale={};
d3.scale.linear=function(){function a(j){return i((j-c)*h)}function b(j){var l=Math.min(c,f),p=Math.max(c,f),r=p-l,k=Math.pow(10,Math.floor(Math.log(r/j)/Math.LN10));j=j/(r/k);if(j<=0.15)k*=10;else if(j<=0.35)k*=5;else if(j<=0.75)k*=2;return{start:Math.ceil(l/k)*k,stop:Math.floor(p/k)*k+k*0.5,q:k}}var c=0,f=1,d=0,e=1,h=1/(f-c),g=(f-c)/(e-d),i=d3.interpolate(d,e);a.invert=function(j){return(j-d)*g+c};a.domain=function(j){if(!arguments.length)return[c,f];c=j[0];f=j[1];h=1/(f-c);g=(f-c)/(e-d);return a};
a.range=function(j){if(!arguments.length)return[d,e];d=j[0];e=j[1];g=(f-c)/(e-d);i=d3.interpolate(d,e);return a};a.ticks=function(j){j=b(j);return d3.range(j.start,j.stop,j.q)};a.tickFormat=function(j){return d3.format(",."+Math.max(0,-Math.floor(Math.log(b(j).q)/Math.LN10+0.01))+"f")};return a};
d3.scale.log=function(){function a(d){return Math.log(d)/Math.LN10}function b(d){return Math.pow(10,d)}function c(d){return f(a(d))}var f=d3.scale.linear();c.invert=function(d){return b(f.invert(d))};c.domain=function(d){if(!arguments.length)return f.domain().map(b);f.domain(d.map(a));return c};c.range=function(){var d=f.range.apply(f,arguments);return arguments.length?c:d};c.ticks=function(){var d=f.domain(),e=Math.floor(d[0]),h=Math.ceil(d[1]),g=[];if(d.every(isFinite)){for(;++e<=h;)for(d=1;d<10;d++)g.push(b(e)*
d);g.push(b(e))}return g};c.tickFormat=function(){return function(d){return d.toPrecision(1)}};return c};
d3.scale.pow=function(){function a(h){return Math.pow(h,d)}function b(h){return Math.pow(h,e)}function c(h){return f(a(h))}var f=d3.scale.linear(),d=1,e=1/d;c.invert=function(h){return b(f.invert(h))};c.domain=function(h){if(!arguments.length)return f.domain().map(b);f.domain(h.map(a));return c};c.range=function(){var h=f.range.apply(f,arguments);return arguments.length?c:h};c.ticks=function(h){return d3.scale.linear().domain(c.domain()).ticks(h)};c.tickFormat=function(h){return d3.scale.linear().domain(c.domain()).tickFormat(h)};
c.exponent=function(h){if(!arguments.length)return d;var g=c.domain();d=h;e=1/h;return c.domain(g)};return c};d3.scale.sqrt=function(){return d3.scale.pow().exponent(0.5)};
d3.scale.ordinal=function(){function a(e){e=e in c?c[e]:c[e]=b.push(e)-1;return f[e%f.length]}var b=[],c={},f=[],d=0;a.domain=function(e){if(!arguments.length)return b;b=e;c={};for(var h=-1,g=-1,i=b.length;++h<i;){e=b[h];e in c||(c[e]=++g)}return a};a.range=function(e){if(!arguments.length)return f;f=e;return a};a.rangePoints=function(e,h){if(arguments.length<2)h=0;var g=e[0],i=e[1],j=(i-g)/(b.length-1+h);f=b.length==1?[(g+i)/2]:d3.range(g+j*h/2,i+j/2,j);d=0;return a};a.rangeBands=function(e,h){if(arguments.length<
2)h=0;var g=e[0],i=e[1],j=(i-g)/(b.length+h);f=d3.range(g+j*h,i,j);d=j*(1-h);return a};a.rangeBand=function(){return d};return a};d3.scale.category10=function(){return d3.scale.ordinal().range(Ea)};d3.scale.category20=function(){return d3.scale.ordinal().range(Fa)};d3.scale.category20b=function(){return d3.scale.ordinal().range(Ha)};d3.scale.category20c=function(){return d3.scale.ordinal().range(Ia)};
function O(a){function c(d){for(var b=[],h,g,i,j,l=0,p=a.length;l<p;l++){i=a[l];b.push(h=[]);h.parentNode=i.parentNode;h.parentData=i.parentData;for(var r=0,k=i.length;r<k;r++)if(j=i[r]){h.push(g=d(j));if(g&&"__data__"in j)g.__data__=j.__data__}else h.push(n)}return O(b)}function e(d){for(var b=[],h,g,i,j=0,l=a.length;j<l;j++){g=a[j];for(var p=0,r=g.length;p<r;p++)if(i=g[p]){b.push(h=d(i));h.parentNode=i;h.parentData=i.__data__}}return O(b)}function f(d){for(var b=0,h=a.length;b<h;b++)for(var g=a[b],
i=0,j=g.length;i<j;i++){var l=g[i];if(l)return d.call(l,l.__data__,i)}return n}a.select=function(d){return c(function(b){return b.querySelector(d)})};a.selectAll=function(d){return e(function(b){return x(b.querySelectorAll(d))})};a.filter=function(d){for(var b=[],h,g,i,j=0,l=a.length;j<l;j++){g=a[j];b.push(h=[]);h.parentNode=g.parentNode;h.parentData=g.parentData;for(var p=0,r=g.length;p<r;p++)if((i=g[p])&&d.call(i,i.__data__,p))h.push(i)}return O(b)};a.data=function(d,b){function h(k,o){function q(Ga){return k.parentNode.appendChild(Ga)}
var m=0,t=k.length,u=o.length,s=Math.min(t,u),v=Math.max(t,u),z=[],A=[],w=[],B,C;if(b){s={};v=[];var D;C=o.length;for(m=0;m<t;m++){D=b.nodeKey(B=k[m]);if(D in s)w[C++]=k[m];else{s[D]=B;v.push(D)}}for(m=0;m<u;m++){if(B=s[D=b.dataKey(C=o[m])]){B.__data__=C;z[m]=B;A[m]=w[m]=n}else{A[m]={appendChild:q,__data__:C};z[m]=w[m]=n}delete s[D]}for(m=0;m<t;m++)if(v[m]in s)w[m]=k[m]}else{for(;m<s;m++){B=k[m];C=o[m];if(B){B.__data__=C;z[m]=B;A[m]=w[m]=n}else{A[m]={appendChild:q,__data__:C};z[m]=w[m]=n}}for(;m<
u;m++){A[m]={appendChild:q,__data__:o[m]};z[m]=w[m]=n}for(;m<v;m++){w[m]=k[m];A[m]=z[m]=n}}A.parentNode=z.parentNode=w.parentNode=k.parentNode;A.parentData=z.parentData=w.parentData=k.parentData;l.push(A);p.push(z);r.push(w)}var g=-1,i=a.length,j,l=[],p=[],r=[];if(typeof b=="string")b=xa(b);if(typeof d=="function")for(;++g<i;)h(j=a[g],d.call(j,j.parentData,g));else for(;++g<i;)h(j=a[g],d);g=O(p);g.enter=function(k){return O(l).append(k)};g.exit=function(){return O(r)};return g};a.each=function(d){for(var b=
0,h=a.length;b<h;b++)for(var g=a[b],i=0,j=g.length;i<j;i++){var l=g[i];l&&d.call(l,l.__data__,i)}return a};a.node=function(){return f(function(){return this})};a.attr=function(d,b){function h(){this.removeAttribute(d)}function g(){this.removeAttributeNS(d.space,d.local)}function i(){this.setAttribute(d,b)}function j(){this.setAttributeNS(d.space,d.local,b)}function l(){var r=b.apply(this,arguments);r==n?this.removeAttribute(d):this.setAttribute(d,r)}function p(){var r=b.apply(this,arguments);r==n?
this.removeAttributeNS(d.space,d.local):this.setAttributeNS(d.space,d.local,r)}d=d3.ns.qualify(d);if(arguments.length<2)return f(d.local?function(){return this.getAttributeNS(d.space,d.local)}:function(){return this.getAttribute(d)});return a.each(b==n?d.local?g:h:typeof b=="function"?d.local?p:l:d.local?j:i)};a.classed=function(d,b){function h(){var l=this.className;j.lastIndex=0;if(!j.test(l))this.className=E(l+" "+d)}function g(){var l=E(this.className.replace(j," "));this.className=l.length?l:
n}function i(){(b.apply(this,arguments)?h:g).call(this)}var j=RegExp("(^|\\s+)"+d3.requote(d)+"(\\s+|$)","g");if(arguments.length<2)return f(function(){j.lastIndex=0;return j.test(this.className)});return a.each(typeof b=="function"?i:b?h:g)};a.style=function(d,b,h){function g(){this.style.removeProperty(d)}function i(){this.style.setProperty(d,b,h)}function j(){var l=b.apply(this,arguments);l==n?this.style.removeProperty(d):this.style.setProperty(d,l,h)}if(arguments.length<3)h=n;if(arguments.length<
2)return f(function(){return window.getComputedStyle(this,n).getPropertyValue(d)});return a.each(b==n?g:typeof b=="function"?j:i)};a.property=function(d,b){function h(){delete this[d]}function g(){this[d]=b}function i(){var j=b.apply(this,arguments);if(j==n)delete this[d];else this[d]=j}d=d3.ns.qualify(d);if(arguments.length<2)return f(function(){return this[d]});return a.each(b==n?h:typeof b=="function"?i:g)};a.text=function(d){function b(){this.appendChild(document.createTextNode(d))}function h(){var g=
d.apply(this,arguments);g!=n&&this.appendChild(document.createTextNode(g))}if(arguments.length<1)return f(function(){return this.textContent});a.each(function(){for(;this.lastChild;)this.removeChild(this.lastChild)});return d==n?a:a.each(typeof d=="function"?h:b)};a.html=function(d){function b(){this.innerHTML=d}function h(){this.innerHTML=d.apply(this,arguments)}if(arguments.length<1)return f(function(){return this.innerHTML});return a.each(typeof d=="function"?h:b)};a.append=function(d){function b(g){return g.appendChild(document.createElement(d))}
function h(g){return g.appendChild(document.createElementNS(d.space,d.local))}d=d3.ns.qualify(d);return c(d.local?h:b)};a.remove=function(){return c(function(d){var b=d.parentNode;b.removeChild(d);return b})};a.sort=function(d){d=ya.apply(this,arguments);for(var b=0,h=a.length;b<h;b++){var g=a[b];g.sort(d);for(var i=1,j=g.length,l=g[0];i<j;i++){var p=g[i];if(p){l&&l.parentNode.insertBefore(p,l.nextSibling);l=p}}}return a};a.on=function(d,b){d="on"+d;return a.each(function(h,g){this[d]=function(i){var j=
d3.event;d3.event=i;try{b.call(this,h,g)}finally{d3.event=j}}})};a.transition=function(){return Q(a)};a.call=ba;return a}function xa(a){return{nodeKey:function(c){return c.getAttribute(a)},dataKey:function(c){return c[a]}}}function ya(a){if(!arguments.length)a=d3.u;return function(c,e){return a(c&&c.__data__,e&&e.__data__)}}d3.transition=P.transition;var za=0,R=0;
function Q(a){function c(k){var o=true,q=-1;a.each(function(){if(i[++q]!=2){var m=(k-j[q])/l[q],t=this.__transition__,u,s,v=b[q];if(m<1){o=false;if(m<0)return}else m=1;if(i[q]){if(t.d!=f){i[q]=2;return}}else if(!t||t.d>f){i[q]=2;return}else{i[q]=1;g.start.dispatch.apply(this,arguments);v=b[q]={};t.d=f;for(s in d)v[s]=d[s].apply(this,arguments)}u=r(m);for(s in d)v[s].call(this,u);if(m==1){i[q]=2;if(t.d==f){m=t.o;if(m==f){delete this.__transition__;h&&this.parentNode.removeChild(this)}R=f;g.end.dispatch.apply(this,
arguments);R=0;t.o=m}}}});return o}var e={},f=R||++za,d={},b=[],h=false,g=d3.dispatch("start","end"),i=[],j=[],l=[],p,r=d3.ease("cubic-in-out");a.each(function(){(this.__transition__||(this.__transition__={})).o=f});e.delay=function(k){var o=Infinity,q=-1;if(typeof k=="function")a.each(function(){var m=j[++q]=+k.apply(this,arguments);if(m<o)o=m});else{o=+k;a.each(function(){j[++q]=o})}Aa(c,o);return e};e.duration=function(k){var o=-1;if(typeof k=="function"){p=0;a.each(function(){var q=l[++o]=+k.apply(this,
arguments);if(q>p)p=q})}else{p=+k;a.each(function(){l[++o]=p})}return e};e.ease=function(k){r=typeof k=="string"?d3.ease(k):k;return e};e.attrTween=function(k,o){function q(t,u){var s=o.call(this,t,u,this.getAttribute(k));return function(v){this.setAttribute(k,s(v))}}function m(t,u){var s=o.call(this,t,u,this.getAttributeNS(k.space,k.local));return function(v){this.setAttributeNS(k.space,k.local,s(v))}}d["attr."+k]=k.local?m:q;return e};e.attr=function(k,o){return e.attrTween(k,Ba(o))};e.styleTween=
function(k,o,q){d["style."+k]=function(m,t){var u=o.call(this,m,t,window.getComputedStyle(this,n).getPropertyValue(k));return function(s){this.style.setProperty(k,u(s),q)}};return e};e.style=function(k,o,q){return e.styleTween(k,Ba(o),q)};e.select=function(k){var o;k=Q(a.select(k)).ease(r);o=-1;k.delay(function(){return j[++o]});o=-1;k.duration(function(){return l[++o]});return k};e.selectAll=function(k){var o;k=Q(a.selectAll(k)).ease(r);o=-1;k.delay(function(q,m){return j[m?o:++o]});o=-1;k.duration(function(q,
m){return l[m?o:++o]});return k};e.remove=function(){h=true;return e};e.each=function(k,o){g[k].add(o);return e};e.call=ba;return e.delay(0).duration(250)}var S=n,T=0,U;function Aa(a,c){var e=Date.now(),f=false,d=e+c,b=S;if(isFinite(c)){for(;b;){if(b.n==a){b.j=e;b.delay=c;f=true}else{var h=b.j+b.delay;if(h<d)d=h}b=b.next}f||(S={n:a,j:e,delay:c,next:S});if(!U){clearTimeout(T);T=setTimeout(Ca,Math.max(24,d-e))}}}function Ca(){U=setInterval(Da,24);T=0}
function Da(){for(var a,c=Date.now(),e=S;e;){a=c-e.j;if(a>e.delay)e.t=e.n(a);e=e.next}a=n;for(c=S;c;)c=c.t?a?a.next=c.next:S=c.next:(a=c).next;a||(U=clearInterval(U))}function Ba(a){return typeof a=="function"?function(c,e,f){return d3.interpolate(f,a.call(this,c,e))}:function(c,e,f){return d3.interpolate(f,a)}}d3.scale={};
d3.scale.linear=function(){function a(j){return i((j-e)*h)}function c(j){var l=Math.min(e,f),p=Math.max(e,f),r=p-l,k=Math.pow(10,Math.floor(Math.log(r/j)/Math.LN10));j=j/(r/k);if(j<=0.15)k*=10;else if(j<=0.35)k*=5;else if(j<=0.75)k*=2;return{start:Math.ceil(l/k)*k,stop:Math.floor(p/k)*k+k*0.5,q:k}}var e=0,f=1,d=0,b=1,h=1/(f-e),g=(f-e)/(b-d),i=d3.interpolate(d,b);a.invert=function(j){return(j-d)*g+e};a.domain=function(j){if(!arguments.length)return[e,f];e=j[0];f=j[1];h=1/(f-e);g=(f-e)/(b-d);return a};
a.range=function(j){if(!arguments.length)return[d,b];d=j[0];b=j[1];g=(f-e)/(b-d);i=d3.interpolate(d,b);return a};a.ticks=function(j){j=c(j);return d3.range(j.start,j.stop,j.q)};a.tickFormat=function(j){return d3.format(",."+Math.max(0,-Math.floor(Math.log(c(j).q)/Math.LN10+0.01))+"f")};return a};
d3.scale.log=function(){function a(d){return Math.log(d)/Math.LN10}function c(d){return Math.pow(10,d)}function e(d){return f(a(d))}var f=d3.scale.linear();e.invert=function(d){return c(f.invert(d))};e.domain=function(d){if(!arguments.length)return f.domain().map(c);f.domain(d.map(a));return e};e.range=function(){var d=f.range.apply(f,arguments);return arguments.length?e:d};e.ticks=function(){var d=f.domain(),b=Math.floor(d[0]),h=Math.ceil(d[1]),g=[];if(d.every(isFinite)){for(;++b<=h;)for(d=1;d<10;d++)g.push(c(b)*
d);g.push(c(b))}return g};e.tickFormat=function(){return function(d){return d.toPrecision(1)}};return e};
d3.scale.pow=function(){function a(h){return Math.pow(h,d)}function c(h){return Math.pow(h,b)}function e(h){return f(a(h))}var f=d3.scale.linear(),d=1,b=1/d;e.invert=function(h){return c(f.invert(h))};e.domain=function(h){if(!arguments.length)return f.domain().map(c);f.domain(h.map(a));return e};e.range=function(){var h=f.range.apply(f,arguments);return arguments.length?e:h};e.ticks=function(h){return d3.scale.linear().domain(e.domain()).ticks(h)};e.tickFormat=function(h){return d3.scale.linear().domain(e.domain()).tickFormat(h)};
e.exponent=function(h){if(!arguments.length)return d;var g=e.domain();d=h;b=1/h;return e.domain(g)};return e};d3.scale.sqrt=function(){return d3.scale.pow().exponent(0.5)};
d3.scale.ordinal=function(){function a(b){b=b in e?e[b]:e[b]=c.push(b)-1;return f[b%f.length]}var c=[],e={},f=[],d=0;a.domain=function(b){if(!arguments.length)return c;c=b;e={};for(var h=-1,g=-1,i=c.length;++h<i;){b=c[h];b in e||(e[b]=++g)}return a};a.range=function(b){if(!arguments.length)return f;f=b;return a};a.rangePoints=function(b,h){if(arguments.length<2)h=0;var g=b[0],i=b[1],j=(i-g)/(c.length-1+h);f=c.length==1?[(g+i)/2]:d3.range(g+j*h/2,i+j/2,j);d=0;return a};a.rangeBands=function(b,h){if(arguments.length<
2)h=0;var g=b[0],i=b[1],j=(i-g)/(c.length+h);f=d3.range(g+j*h,i,j);d=j*(1-h);return a};a.rangeBand=function(){return d};return a};d3.scale.category10=function(){return d3.scale.ordinal().range(Ea)};d3.scale.category20=function(){return d3.scale.ordinal().range(Fa)};d3.scale.category20b=function(){return d3.scale.ordinal().range(Ha)};d3.scale.category20c=function(){return d3.scale.ordinal().range(Ia)};
var Ea=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Fa=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Ha=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd",
"#de9ed6"],Ia=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.svg={};
d3.svg.arc=function(){function a(e,h){var g=b.call(this,e,h),i=c.call(this,e,h),j=f.call(this,e,h)+V,l=d.call(this,e,h)+V,p=l-j,r=Math.cos(j);j=Math.sin(j);var k=Math.cos(l);l=Math.sin(l);return"M"+i*r+","+i*j+"A"+i+","+i+" 0 "+(p<Math.PI?"0":"1")+",1 "+i*k+","+i*l+"L"+g*k+","+g*l+"A"+g+","+g+" 0 "+(p<Math.PI?"0":"1")+",0 "+g*r+","+g*j+"Z"}var b=Ja,c=Ka,f=La,d=Ma;a.innerRadius=function(e){if(!arguments.length)return b;b=y(e);return a};a.outerRadius=function(e){if(!arguments.length)return c;c=y(e);
return a};a.startAngle=function(e){if(!arguments.length)return f;f=y(e);return a};a.endAngle=function(e){if(!arguments.length)return d;d=y(e);return a};return a};var V=-Math.PI/2;function Ja(a){return a.innerRadius}function Ka(a){return a.outerRadius}function La(a){return a.startAngle}function Ma(a){return a.endAngle}
d3.svg.line=function(){function a(e){return e.length<1?n:"M"+d(W(this,e,b,c))}var b=Na,c=Oa,f="linear",d=X[f];a.x=function(e){if(!arguments.length)return b;b=e;return a};a.y=function(e){if(!arguments.length)return c;c=e;return a};a.interpolate=function(e){if(!arguments.length)return f;d=X[f=e];return a};return a};
function W(a,b,c,f){var d=[],e=-1,h=b.length,g=typeof c=="function",i=typeof f=="function",j;if(g&&i)for(;++e<h;)d.push([c.call(a,j=b[e],e),f.call(a,j,e)]);else if(g)for(;++e<h;)d.push([c.call(a,b[e],e),f]);else if(i)for(;++e<h;)d.push([c,f.call(a,b[e],e)]);else for(;++e<h;)d.push([c,f]);return d}function Na(a){return a.x}function Oa(a){return a.y}var X={linear:Pa,basis:Qa};
function Pa(a){if(a.length<1)return n;var b=[],c=0,f=a.length,d=a[0];for(b.push(d[0],",",d[1]);++c<f;)b.push("L",(d=a[c])[0],",",d[1]);return b.join("")}function Qa(a){if(a.length<3)return Pa(a);var b=[],c=1,f=a.length,d=a[0],e=d[0],h=d[1],g=[e,e,e,(d=a[1])[0]],i=[h,h,h,d[1]];b.push(e,",",h);for(Y(b,g,i);++c<f;){d=a[c];g.shift();g.push(d[0]);i.shift();i.push(d[1]);Y(b,g,i)}for(c=-1;++c<2;){g.shift();g.push(d[0]);i.shift();i.push(d[1]);Y(b,g,i)}return b.join("")}
function Z(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}var Ra=[0,2/3,1/3,0],Sa=[0,1/3,2/3,0],Ta=[0,1/6,2/3,1/6];function Y(a,b,c){a.push("C",Z(Ra,b),",",Z(Ra,c),",",Z(Sa,b),",",Z(Sa,c),",",Z(Ta,b),",",Z(Ta,c))}
d3.svg.area=function(){function a(h){return h.length<1?n:"M"+e(W(this,h,b,f))+"L"+e(W(this,h,b,c).reverse())+"Z"}var b=Na,c=Ua,f=Oa,d="linear",e=X[d];a.x=function(h){if(!arguments.length)return b;b=h;return a};a.y0=function(h){if(!arguments.length)return c;c=h;return a};a.y1=function(h){if(!arguments.length)return f;f=h;return a};a.interpolate=function(h){if(!arguments.length)return d;e=X[d=h];return a};return a};function Ua(){return 0}
d3.svg.chord=function(){function a(g,i){var j=b(this,c,g,i),l=b(this,f,g,i);return"M"+j.c+("A"+j.r+","+j.r+" 0 0,1 "+j.p)+(j.k==l.k&&j.m==l.m?"Q 0,0 "+j.c:"Q 0,0 "+l.c+("A"+l.r+","+l.r+" 0 0,1 "+l.p)+("Q 0,0 "+j.c))+"Z"}function b(g,i,j,l){var p=i.call(g,j,l);i=d.call(g,p,l);j=e.call(g,p,l)+V;g=h.call(g,p,l)+V;return{r:i,k:j,m:g,c:[i*Math.cos(j),i*Math.sin(j)],p:[i*Math.cos(g),i*Math.sin(g)]}}var c=Va,f=Wa,d=Xa,e=La,h=Ma;a.radius=function(g){if(!arguments.length)return d;d=y(g);return a};a.source=
function(g){if(!arguments.length)return c;c=y(g);return a};a.target=function(g){if(!arguments.length)return f;f=y(g);return a};a.startAngle=function(g){if(!arguments.length)return e;e=y(g);return a};a.endAngle=function(g){if(!arguments.length)return h;h=y(g);return a};return a};function Va(a){return a.source}function Wa(a){return a.target}function Xa(a){return a.radius}
d3.svg.mouse=function(a){var b=(a.ownerSVGElement||a).createSVGPoint();if($<0&&(window.scrollX||window.scrollY)){var c=d3.select(document.body).append("svg:svg").style("position","absolute").style("top",0).style("left",0),f=c[0][0].getScreenCTM();$=!(f.f||f.e);c.remove()}if($){b.x=d3.event.pageX;b.y=d3.event.pageY}else{b.x=d3.event.clientX;b.y=d3.event.clientY}b=b.matrixTransform(a.getScreenCTM().inverse());return[b.x,b.y]};var $=/WebKit/.test(navigator.userAgent)?-1:0;})()
d3.svg.arc=function(){function a(b,h){var g=c.call(this,b,h),i=e.call(this,b,h),j=f.call(this,b,h)+V,l=d.call(this,b,h)+V,p=l-j,r=Math.cos(j);j=Math.sin(j);var k=Math.cos(l);l=Math.sin(l);return"M"+i*r+","+i*j+"A"+i+","+i+" 0 "+(p<Math.PI?"0":"1")+",1 "+i*k+","+i*l+"L"+g*k+","+g*l+"A"+g+","+g+" 0 "+(p<Math.PI?"0":"1")+",0 "+g*r+","+g*j+"Z"}var c=Ja,e=Ka,f=La,d=Ma;a.innerRadius=function(b){if(!arguments.length)return c;c=y(b);return a};a.outerRadius=function(b){if(!arguments.length)return e;e=y(b);
return a};a.startAngle=function(b){if(!arguments.length)return f;f=y(b);return a};a.endAngle=function(b){if(!arguments.length)return d;d=y(b);return a};return a};var V=-Math.PI/2;function Ja(a){return a.innerRadius}function Ka(a){return a.outerRadius}function La(a){return a.startAngle}function Ma(a){return a.endAngle}
d3.svg.line=function(){function a(b){return b.length<1?n:"M"+d(W(this,b,c,e))}var c=Na,e=Oa,f="linear",d=X[f];a.x=function(b){if(!arguments.length)return c;c=b;return a};a.y=function(b){if(!arguments.length)return e;e=b;return a};a.interpolate=function(b){if(!arguments.length)return f;d=X[f=b];return a};return a};
function W(a,c,e,f){var d=[],b=-1,h=c.length,g=typeof e=="function",i=typeof f=="function",j;if(g&&i)for(;++b<h;)d.push([e.call(a,j=c[b],b),f.call(a,j,b)]);else if(g)for(;++b<h;)d.push([e.call(a,c[b],b),f]);else if(i)for(;++b<h;)d.push([e,f.call(a,c[b],b)]);else for(;++b<h;)d.push([e,f]);return d}function Na(a){return a.x}function Oa(a){return a.y}var X={linear:Pa,basis:Qa};
function Pa(a){if(a.length<1)return n;var c=[],e=0,f=a.length,d=a[0];for(c.push(d[0],",",d[1]);++e<f;)c.push("L",(d=a[e])[0],",",d[1]);return c.join("")}function Qa(a){if(a.length<3)return Pa(a);var c=[],e=1,f=a.length,d=a[0],b=d[0],h=d[1],g=[b,b,b,(d=a[1])[0]],i=[h,h,h,d[1]];c.push(b,",",h);for(Y(c,g,i);++e<f;){d=a[e];g.shift();g.push(d[0]);i.shift();i.push(d[1]);Y(c,g,i)}for(e=-1;++e<2;){g.shift();g.push(d[0]);i.shift();i.push(d[1]);Y(c,g,i)}return c.join("")}
function Z(a,c){return a[0]*c[0]+a[1]*c[1]+a[2]*c[2]+a[3]*c[3]}var Ra=[0,2/3,1/3,0],Sa=[0,1/3,2/3,0],Ta=[0,1/6,2/3,1/6];function Y(a,c,e){a.push("C",Z(Ra,c),",",Z(Ra,e),",",Z(Sa,c),",",Z(Sa,e),",",Z(Ta,c),",",Z(Ta,e))}
d3.svg.area=function(){function a(h){return h.length<1?n:"M"+b(W(this,h,c,f))+"L"+b(W(this,h,c,e).reverse())+"Z"}var c=Na,e=Ua,f=Oa,d="linear",b=X[d];a.x=function(h){if(!arguments.length)return c;c=h;return a};a.y0=function(h){if(!arguments.length)return e;e=h;return a};a.y1=function(h){if(!arguments.length)return f;f=h;return a};a.interpolate=function(h){if(!arguments.length)return d;b=X[d=h];return a};return a};function Ua(){return 0}
d3.svg.chord=function(){function a(g,i){var j=c(this,e,g,i),l=c(this,f,g,i);return"M"+j.c+("A"+j.r+","+j.r+" 0 0,1 "+j.p)+(j.k==l.k&&j.m==l.m?"Q 0,0 "+j.c:"Q 0,0 "+l.c+("A"+l.r+","+l.r+" 0 0,1 "+l.p)+("Q 0,0 "+j.c))+"Z"}function c(g,i,j,l){var p=i.call(g,j,l);i=d.call(g,p,l);j=b.call(g,p,l)+V;g=h.call(g,p,l)+V;return{r:i,k:j,m:g,c:[i*Math.cos(j),i*Math.sin(j)],p:[i*Math.cos(g),i*Math.sin(g)]}}var e=Va,f=Wa,d=Xa,b=La,h=Ma;a.radius=function(g){if(!arguments.length)return d;d=y(g);return a};a.source=
function(g){if(!arguments.length)return e;e=y(g);return a};a.target=function(g){if(!arguments.length)return f;f=y(g);return a};a.startAngle=function(g){if(!arguments.length)return b;b=y(g);return a};a.endAngle=function(g){if(!arguments.length)return h;h=y(g);return a};return a};function Va(a){return a.source}function Wa(a){return a.target}function Xa(a){return a.radius}d3.svg.path=function(a){return"M"+a.join("L")+"Z"};
d3.svg.cardinal=function(a,c){if(a.length<=2)return"";if(c==undefined)c=0.8;var e="M"+a[0],f=c,d=a,b=d.length-1;if(d[0][0]==d[b][0]&&d[0][1]==d[b][1]){d=[a[b-1]].concat(a);d.push(a[1])}b=[];f=(1-f)/2;for(var h=d[0],g=d[1],i=d[2],j=3;j<d.length;j++){b.push([f*(i[0]-h[0]),f*(i[1]-h[1])]);h=g;g=i;i=d[j]}b.push([f*(i[0]-h[0]),f*(i[1]-h[1])]);if(b.length<1||a.length!=b.length&&a.length!=b.length+2)b="";else{g=a.length!=b.length;d="";j=a[0];f=a[1];var l=b[0];h=l;i=1;if(g){d+="Q"+(f[0]-l[0]*2/3)+","+(f[1]-
l[1]*2/3)+","+f[0]+","+f[1];j=a[1];i=2}if(b.length>1){h=b[1];f=a[i];i++;d+="C"+(j[0]+l[0])+","+(j[1]+l[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(j=2;j<b.length;j++,i++){f=a[i];h=b[j];d+="S"+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1]}}if(g){b=a[i];d+="Q"+(f[0]+h[0]*2/3)+","+(f[1]+h[1]*2/3)+","+b[0]+","+b[1]}b=d}return e+b};
d3.svg.mouse=function(a){var c=(a.ownerSVGElement||a).createSVGPoint();if($<0&&(window.scrollX||window.scrollY)){var e=d3.select(document.body).append("svg:svg").style("position","absolute").style("top",0).style("left",0),f=e[0][0].getScreenCTM();$=!(f.f||f.e);e.remove()}if($){c.x=d3.event.pageX;c.y=d3.event.pageY}else{c.x=d3.event.clientX;c.y=d3.event.clientY}c=c.matrixTransform(a.getScreenCTM().inverse());return[c.x,c.y]};var $=/WebKit/.test(navigator.userAgent)?-1:0;})()

288
examples/force/cluster.html Normal file
Просмотреть файл

@ -0,0 +1,288 @@
<!DOCTYPE html>
<html>
<head>
<title>Clustered Network</title>
<script type="text/javascript" src="../../d3.min.js"></script>
<script type="text/javascript" src="../../d3.geom.min.js"></script>
<script type="text/javascript" src="force.js"></script>
<style type="text/css">
svg {
border: 1px solid #ccc;
}
body {
font: 10px sans-serif;
}
circle.node {
fill: lightsteelblue;
}
circle.leaf {
fill: white;
stroke: black;
}
path.hull {
fill: lightsteelblue;
opacity: 0.3;
}
line.link {
stroke: #333;
opacity: 0.5;
}
</style>
</head>
<body>
<script type="text/javascript">
var w = 960, // svg width
h = 600, // svg height
dr = 4, // default point radius
off = 15, // cluster hull offset
expand = {}, // expanded clusters
data, net, force, hullg, hull, linkg, link, nodeg, node;
function noop() { return false; }
function nodeid(n) {
return n.size ? "_g_"+n.group : n.name;
}
function linkid(l) {
var u = nodeid(l.source),
v = nodeid(l.target);
return u<v ? u+"|"+v : v+"|"+u;
}
var nodeKeys = {
nodeKey: function(n) { return n.getAttribute("id"); },
dataKey: nodeid
}
var linkKeys = {
nodeKey: function(n) { return n.getAttribute("id"); },
dataKey: linkid
}
function getGroup(n) { return n.group; }
// constructs the network to visualize
function network(data, prev, index, expand) {
expand = expand || {};
var gm = {}, // group map
nm = {}, // node map
lm = {}, // link map
gn = {}, // previous group nodes
gc = {}, // previous group centroids
nodes = [], // output nodes
links = []; // output links
// process previous nodes for reuse or centroid calculation
if (prev) {
prev.nodes.forEach(function(n) {
var i = index(n), o;
if (n.size > 0) {
gn[i] = n;
n.size = 0;
} else {
o = gc[i] || (gc[i] = {x:0,y:0,count:0});
o.x += n.x;
o.y += n.y;
o.count += 1;
}
});
}
// determine nodes
for (var k=0; k<data.nodes.length; ++k) {
var n = data.nodes[k],
i = index(n);
if (expand[i]) {
// the node should be directly visible
nm[n.name] = nodes.length;
nodes.push(n);
if (gn[i]) {
// place new nodes at cluster location (plus jitter)
n.x = gn[i].x + Math.random();
n.y = gn[i].y + Math.random();
}
} else {
// the node is part of a collapsed cluster
var l = gm[i] || (gm[i]=gn[i]) || (gm[i]={group:i, size:0, nodes:[]});
if (l.size == 0) {
// if new cluster, add to set and position at centroid of leaf nodes
nm[i] = nodes.length;
nodes.push(l);
if (gc[i]) {
l.x = gc[i].x / gc[i].count;
l.y = gc[i].y / gc[i].count;
}
}
l.size += 1;
l.nodes.push(n);
}
}
// determine links
for (k=0; k<data.links.length; ++k) {
var e = data.links[k],
u = index(e.source),
v = index(e.target);
u = expand[u] ? nm[e.source.name] : nm[u];
v = expand[v] ? nm[e.target.name] : nm[v];
var i = (u<v ? u+"|"+v : v+"|"+u),
l = lm[i] || (lm[i] = {source:u, target:v, size:0});
l.size += 1;
}
for (i in lm) { links.push(lm[i]); }
return {nodes: nodes, links: links};
}
function convexHulls(nodes, index, offset) {
var h = {};
// create point sets
for (var k=0; k<nodes.length; ++k) {
var n = nodes[k];
if (n.size) continue;
var i = index(n),
l = h[i] || (h[i] = []);
l.push([n.x-offset, n.y-offset]);
l.push([n.x-offset, n.y+offset]);
l.push([n.x+offset, n.y-offset]);
l.push([n.x+offset, n.y+offset]);
}
// create convex hulls
var hulls = [];
for (i in h) {
var p = d3.geom.hull(h[i]);
p.push(p[0]); // close the loop
hulls.push({group: i, path: p});
}
return hulls;
}
function drawCluster(d) {
return d3.svg.cardinal(d.path, 0.8);
}
function drag(n) {
var active = null;
n.on("mouseover", function(d) { if (d != active) d.fixed = true; })
.on("mouseout", function(d) { if (d != active) d.fixed = false; })
.on("mousedown", function(d) {
if (event.preventDefault) { event.preventDefault(); }
active = d;
// unregister drag listeners
body.on("mouseup", function(d) {
active = null;
body.on("mouseup", noop)
.on("mousemove", noop);
});
// update node position on drag
body.on("mousemove", function() {
if (active == null) return false;
var m = d3.svg.mouse(vis[0][0]);
active.x = m[0];
active.y = m[1];
});
return false;
});
}
// --------------------------------------------------------
var body = d3.select("body");
var vis = body.append("svg:svg")
.attr("width", w)
.attr("height", h);
d3.json("miserables.json", function(json) {
data = json;
for (var i=0; i<data.links.length; ++i) {
o = data.links[i];
o.source = data.nodes[o.source];
o.target = data.nodes[o.target];
}
hullg = vis.append("svg:g");
linkg = vis.append("svg:g");
nodeg = vis.append("svg:g");
init();
vis.attr("opacity", 0)
.transition()
.duration(1000)
.attr("opacity", 1);
});
function init() {
if (force) force.stop();
net = network(data, net, getGroup, expand);
force = layout_force()
.nodes(net.nodes)
.links(net.links)
.size({x: w, y: h})
.nodeDistance(100)
.linkDistance(60)
.start();
hullg.selectAll("path.hull").remove();
hull = hullg.selectAll("path.hull")
.data(convexHulls(net.nodes, getGroup, off))
.enter("svg:path")
.attr("class", "hull")
.attr("d", drawCluster)
.on("dblclick", function(d) { expand[d.group] = false; init(); });
link = linkg.selectAll("line.link").data(net.links, linkKeys);
link.exit().remove();
link.enter("svg:line")
.attr("id", linkid)
.attr("class", "link")
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; })
.style("stroke-width", function(d) { return d.size || 1; });
link = linkg.selectAll("line.link").data(net.links, linkKeys);
node = nodeg.selectAll("circle.node").data(net.nodes, nodeKeys);
node.exit().remove();
node.enter("svg:circle")
.attr("id", nodeid)
.attr("class", function(d) { return "node" + (d.size?"":" leaf"); })
.attr("r", function(d) { return d.size ? d.size + dr : dr+1; })
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.call(drag)
.on("dblclick", function(d) {
if (d.size) { expand[d.group] = true; init(); }
});
node = nodeg.selectAll("circle.node").data(net.nodes, nodeKeys);
force.on("tick", function() {
if (hull) {
hull.data(convexHulls(net.nodes, getGroup, off))
.attr("d", drawCluster);
}
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
}
</script>
</body>
</html>

Просмотреть файл

@ -37,10 +37,19 @@ function layout_force() {
l = alpha * (l - nodeDistance) / l;
x *= l;
y *= l;
s.x += x;
s.y += y;
t.x -= x;
t.y -= y;
if (s.fixed) {
if (t.fixed) continue;
t.x -= x;
t.y -= y;
} else if (t.fixed) {
s.x += x;
s.y += y;
} else {
s.x += x;
s.y += y;
t.x -= x;
t.y -= y;
}
}
}
}
@ -53,13 +62,23 @@ function layout_force() {
x = t.x - s.x;
y = t.y - s.y;
l = Math.sqrt(x * x + y * y);
if (l <= 0) l = 0.01;
l = alpha * (l - linkDistance) / l;
x *= l;
y *= l;
s.x += x;
s.y += y;
t.x -= x;
t.y -= y;
if (s.fixed) {
if (t.fixed) continue;
t.x -= x;
t.y -= y;
} else if (t.fixed) {
s.x += x;
s.y += y;
} else {
s.x += x;
s.y += y;
t.x -= x;
t.y -= y;
}
}
event.tick.dispatch({type: "tick"});
@ -88,6 +107,18 @@ function layout_force() {
return force;
};
force.nodeDistance = function(d) {
if (!arguments.length) return nodeDistance;
nodeDistance = d;
return force;
};
force.linkDistance = function(d) {
if (!arguments.length) return linkDistance;
linkDistance = d;
return force;
};
force.start = function() {
var i,
n = nodes.length,
@ -97,8 +128,9 @@ function layout_force() {
o;
for (i = 0; i < n; ++i) {
o = nodes[i];
o.x = Math.random() * w;
o.y = Math.random() * h;
o.x = o.x || Math.random() * w;
o.y = o.y || Math.random() * h;
o.fixed = 0;
}
for (i = 0; i < m; ++i) {
o = links[i];
@ -110,6 +142,12 @@ function layout_force() {
return force;
};
force.resume = function() {
if (interval) clearInterval(interval);
interval = setInterval(tick, 24);
return force;
};
force.stop = function() {
interval = clearInterval(interval);
return force;

80
src/svg/curve.js Normal file
Просмотреть файл

@ -0,0 +1,80 @@
d3["svg"]["path"] = function(points) {
return "M" + points.join("L") + "Z";
}
d3["svg"]["cardinal"] = function(points, tension) {
if (points.length <= 2) return "";
if (tension == undefined) tension = 0.8;
return "M" + points[0] + d3_svg_curveHermite(points,
d3_svg_curveCardinalTangents(points, tension));
}
function d3_svg_curveCardinalTangents(points, tension) {
var pts = points,
N = pts.length-1;
// if closed shape, adjust endpoints to get all tangents
if (pts[0][0] == pts[N][0] && pts[0][1] == pts[N][1]) {
pts = [points[N-1]].concat(points);
pts.push(points[1]);
}
var tangents = [],
a = (1 - tension) / 2,
p0 = pts[0],
p1 = pts[1],
p2 = pts[2];
for (var i = 3; i < pts.length; i++) {
tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]);
p0 = p1;
p1 = p2;
p2 = pts[i];
}
tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]);
return tangents;
}
function d3_svg_curveHermite(points, tangents) {
if (tangents.length < 1
|| (points.length != tangents.length
&& points.length != tangents.length + 2)) return "";
var quad = points.length != tangents.length,
path = "",
p0 = points[0],
p = points[1],
t0 = tangents[0],
t = t0,
pi = 1;
if (quad) {
path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3)
+ "," + p[0] + "," + p[1];
p0 = points[1];
pi = 2;
}
if (tangents.length > 1) {
t = tangents[1];
p = points[pi];
pi++;
path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1])
+ "," + (p[0] - t[0]) + "," + (p[1] - t[1])
+ "," + p[0] + "," + p[1];
for (var i = 2; i < tangents.length; i++, pi++) {
p = points[pi];
t = tangents[i];
path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1])
+ "," + p[0] + "," + p[1];
}
}
if (quad) {
var lp = points[pi];
path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + ","
+ lp[0] + "," + lp[1];
}
return path;
}