First pass at some shape utilities.

This commit is contained in:
Michael Bostock 2010-10-24 17:05:59 -07:00
Родитель a0f2a670b2
Коммит d16d06ef36
9 изменённых файлов: 316 добавлений и 112 удалений

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

@ -32,6 +32,9 @@ SRC_FILES = \
src/transition.js \
src/timer.js \
src/tween.js \
src/arc.js \
src/line.js \
src/area.js \
src/end.js
all: d3.js d3.min.js

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

@ -1457,4 +1457,121 @@ function d3_tween(b) {
? function(d, i, a) { return d3.interpolate(a, b.call(this, d, i)); }
: function(d, i, a) { return d3.interpolate(a, b); };
}
d3.arc = function() {
var innerRadius = function(d) { return d.innerRadius; },
outerRadius = function(d) { return d.outerRadius; },
startAngle = function(d) { return d.startAngle; },
endAngle = function(d) { return d.endAngle; };
function arc(d) {
var r0 = innerRadius(d),
r1 = outerRadius(d),
a0 = startAngle(d) - Math.PI / 2,
a1 = endAngle(d) - Math.PI / 2,
da = a1 - a0,
c0 = Math.cos(a0),
s0 = Math.sin(a0),
c1 = Math.cos(a1),
s1 = Math.sin(a1);
return "M" + r1 * c0 + "," + r1 * s0
+ "A" + r1 + "," + r1 + " 0 "
+ ((da < Math.PI) ? "0" : "1") + ",1 "
+ r1 * c1 + "," + r1 * s1
+ "L" + r0 * c1 + "," + r0 * s1
+ "A" + r0 + "," + r0 + " 0 "
+ ((da < Math.PI) ? "0" : "1") + ",0 "
+ r0 * c0 + "," + r0 * s0 + "Z";
}
arc.innerRadius = function(value) {
innerRadius = typeof value == "function"
? value
: function() { return value; };
return arc;
};
arc.outerRadius = function(value) {
outerRadius = typeof value == "function"
? value
: function() { return value; };
return arc;
};
arc.startAngle = function(value) {
startAngle = typeof value == "function"
? value
: function() { return value; };
return arc;
};
arc.endAngle = function(value) {
endAngle = typeof value == "function"
? value
: function() { return value; };
return arc;
};
return arc;
};
d3.line = function() {
var x = function(d, i) { return d.x; },
y = function(d, i) { return d.y; };
function line(d) {
var a = [],
i = 0,
p = d[0];
a.push("M", x.call(this, p, i), ",", y.call(this, p, i));
while (p = d[++i]) a.push("L", x.call(this, p, i), ",", y.call(this, p, i));
return a.join("");
}
line.x = function(value) {
x = value;
return line;
};
line.y = function(value) {
y = value;
return line;
};
return line;
};
d3.area = function() {
var x = function(d, i) { return d.x; },
y0 = 0,
y1 = function(d, i) { return d.y1; };
// TODO interpolators
// TODO variable y0
// TODO horizontal / vertical orientation
function area(d) {
var a = [],
i = 0,
p = d[0];
a.push("M", x.call(this, p, i), "," + y0 + "V", y1.call(this, p, i));
while (p = d[++i]) a.push("L", x.call(this, p, i), ",", y1.call(this, p, i));
a.push("V" + y0 + "Z");
return a.join("");
}
area.x = function(value) {
x = value;
return area;
};
area.y0 = function(value) {
y0 = value;
return area;
};
area.y1 = function(value) {
y1 = value;
return area;
};
return area;
};
})(this);

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

@ -1,37 +1,40 @@
if(!Date.now)Date.now=function(){return+new Date};if(!Object.create)Object.create=function(I){function E(){}E.prototype=I;return new E};
(function(I){function E(){var a={},b=[];a.add=function(e){for(var f=0;f<b.length;f++)if(b[f].listener==e)return a;b.push({listener:e,on:true});return a};a.remove=function(e){for(var f=0;f<b.length;f++){var d=b[f];if(d.listener==e){d.on=false;b=b.slice(0,f).concat(b.slice(f+1));break}}return a};a.dispatch=function(){for(var e=b,f=0,d=e.length;f<d;f++){var c=e[f];c.on&&c.listener.apply(this,arguments)}};return a}function Q(a){return function(b){return 1-a(1-b)}}function R(a){return function(b){return 0.5*
(b<0.5?a(2*b):2-a(2-2*b))}}function U(a){return a}function J(a){return function(b){return Math.pow(b,a)}}function V(a){return 1-Math.cos(a*Math.PI/2)}function W(a){return a?Math.pow(2,10*(a-1))-0.0010:0}function X(a){return 1-Math.sqrt(1-a*a)}function Y(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}function Z(a){return{nodeKey:function(b){return b.getAttribute(a)},dataKey:function(b){return b[a]}}}function K(a){var b,
e,f,d,c;if(d=/([a-z]+)\((.*)\)/i.exec(a)){c=d[2].split(",");switch(d[1]){case "hsl":return S(parseFloat(c[0]),parseFloat(c[1])/100,parseFloat(c[2])/100);case "rgb":return{r:L(c[0]),g:L(c[1]),b:L(c[2])}}}if(d=B[a])return d;if(a==null)return B.black;if(a.charAt(0)=="#"){if(a.length==4){b=a.charAt(1);b+=b;e=a.charAt(2);e+=e;f=a.charAt(3);f+=f}else if(a.length==7){b=a.substring(1,3);e=a.substring(3,5);f=a.substring(5,7)}b=parseInt(b,16);e=parseInt(e,16);f=parseInt(f,16)}return{r:b,g:e,b:f}}function S(a,
b,e){function f(h){if(h>360)h-=360;else if(h<0)h+=360;if(h<60)return d+(c-d)*h/60;if(h<180)return c;if(h<240)return d+(c-d)*(240-h)/60;return d}var d,c;a%=360;if(a<0)a+=360;b=b<0?0:b>1?1:b;e=e<0?0:e>1?1:e;c=e<=0.5?e*(1+b):e+b-e*b;d=2*e-c;return{r:Math.round(f(a+120)*255),g:Math.round(f(a)*255),b:Math.round(f(a-120)*255)}}function L(a){var b=parseFloat(a);return a.charAt(a.length-1)=="%"?Math.round(b*2.55):b}function z(a){function b(d){for(var c=[],h,i,g,n,p=0,j=a.length;p<j;p++){g=a[p];c.push(h=[]);
h.parentNode=g.parentNode;h.parentData=g.parentData;for(var k=0,o=g.length;k<o;k++)if(n=g[k]){h.push(i=d(n));if(i)i.__data__=n.__data__}else h.push(null)}return z(c)}function e(d){for(var c=[],h,i,g,n=0,p=a.length;n<p;n++){i=a[n];for(var j=0,k=i.length;j<k;j++)if(g=i[j]){c.push(h=d(g));h.parentNode=g;h.parentData=g.__data__}}return z(c)}function f(d){for(var c=0,h=a.length;c<h;c++)for(var i=a[c],g=0,n=i.length;g<n;g++){var p=i[g];if(p)return d.call(p,p.__data__,g)}return null}a.select=function(d){return b(function(c){return c.querySelector(d)})};
a.selectAll=function(d){return e(function(c){c=c.querySelectorAll(d);return Array.prototype.slice.call(c)})};a.data=function(d,c){function h(o,q){function v($){return o.parentNode.appendChild($)}var m=0,s=o.length,A=q.length,r=Math.min(s,A),t=Math.max(s,A),w=[],x=[],u=[],y,C;if(c){r={};t=[];var F;for(m=0;m<s;m++){r[F=c.nodeKey(y=o[m])]=y;t.push(F)}for(m=0;m<A;m++){if(y=r[F=c.dataKey(C=q[m])]){y.__data__=C;w[m]=y;x[m]=u[m]=null}else{x[m]={appendChild:v,__data__:C};w[m]=u[m]=null}delete r[F]}for(m=
0;m<s;m++)if(t[m]in r)u[m]=o[m]}else{for(;m<r;m++){y=o[m];C=q[m];if(y){y.__data__=C;w[m]=y;x[m]=u[m]=null}else{x[m]={appendChild:v,__data__:C};w[m]=u[m]=null}}for(;m<A;m++){x[m]={appendChild:v,__data__:q[m]};w[m]=u[m]=null}for(;m<t;m++){u[m]=o[m];x[m]=w[m]=null}}x.parentNode=w.parentNode=u.parentNode=o.parentNode;x.parentData=w.parentData=u.parentData=o.parentData;p.push(x);j.push(w);k.push(u)}var i=-1,g=a.length,n,p=[],j=[],k=[];if(typeof c=="string")c=Z(c);if(typeof d=="function")for(;++i<g;)h(n=
a[i],d.call(n,n.parentData,i));else for(;++i<g;)h(n=a[i],d);i=z(j);i.enter=function(o){return z(p).append(o)};i.exit=function(){return z(k)};return i};a.each=function(d){for(var c=0,h=a.length;c<h;c++)for(var i=a[c],g=0,n=i.length;g<n;g++){var p=i[g];p&&d.call(p,p.__data__,g)}return a};a.attr=function(d,c){function h(){this.removeAttribute(d)}function i(){this.removeAttributeNS(d.space,d.local)}function g(){this.setAttribute(d,c)}function n(){this.setAttributeNS(d.space,d.local,c)}function p(){var k=
c.apply(this,arguments);k==null?this.removeAttribute(d):this.setAttribute(d,k)}function j(){var k=c.apply(this,arguments);k==null?this.removeAttributeNS(d.space,d.local):this.setAttributeNS(d.space,d.local,k)}d=l.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(c==null?d.local?i:h:typeof c=="function"?d.local?j:p:d.local?n:g)};a.style=function(d,c,h){function i(){this.style.removeProperty(d)}
function g(){this.style.setProperty(d,c,h)}function n(){var p=c.apply(this,arguments);p==null?this.style.removeProperty(d):this.style.setProperty(d,p,h)}if(arguments.length<3)h=null;if(arguments.length<2)return f(function(){return window.getComputedStyle(this,null).getPropertyValue(d)});return a.each(c==null?i:typeof c=="function"?n:g)};a.text=function(d){function c(){this.appendChild(document.createTextNode(d))}function h(){var i=d.apply(this,arguments);i!=null&&this.appendChild(document.createTextNode(i))}
if(arguments.length<1)return f(function(){return this.textContent});a.each(function(){for(;this.lastChild;)this.removeChild(this.lastChild)});return d==null?a:a.each(typeof d=="function"?h:c)};a.html=function(d){function c(){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:c)};a.append=function(d){function c(i){return i.appendChild(document.createElement(d))}function h(i){return i.appendChild(document.createElementNS(d.space,
d.local))}d=l.ns.qualify(d);return b(d.local?h:c)};a.remove=function(){return b(function(d){var c=d.parentNode;c.removeChild(d);return c})};a.on=function(d,c){d="on"+d;return a.each(function(h,i){this[d]=function(g){l.event=g;try{c.call(this,h,i)}finally{l.event=null}}})};a.transition=function(d){return M(a,d)};return a}function M(a,b){function e(j){var k=true,o=-1;a.each(function(){if(h[++o]!=2){var q=(j-i[o])/g[o];if(q>=1)q=1;else{k=false;if(q<0)return;if(!h[o]){h[o]=1;c.start.dispatch.apply(this,
arguments)}}var v=p(q),m;for(m in d)d[m].call(this,v,o);if(q==1){h[o]=2;c.end.dispatch.apply(this,arguments)}}});return k}var f={},d={},c=l.dispatch("start","end"),h=[],i=[],g=[],n,p=l.ease("cubic-in-out");f.delay=function(j){var k=Infinity,o=-1;if(typeof j=="function")a.each(function(){var q=i[++o]=+j.apply(this,arguments);if(q<k)k=q});else{k=+j;a.each(function(){i[++o]=k})}aa(e,k);return f};f.duration=function(j){var k=-1;if(typeof j=="function"){n=0;a.each(function(){var o=g[++k]=+j.apply(this,
arguments);if(o>n)n=o})}else{n=+j;a.each(function(){g[++k]=n})}return f};f.ease=function(j){p=typeof j=="string"?l.ease(j):j;return f};f.attrTween=function(j,k){function o(r,t){s[++A]=k.call(this,r,t,this.getAttribute(j))}function q(r,t){s[++A]=k.call(this,r,t,this.getAttributeNS(j.space,j.local))}function v(r,t){this.setAttribute(j,s[t](r))}function m(r,t){this.setAttributeNS(j.space,j.local,s[t](r))}var s=[],A=-1;j=l.ns.qualify(j);a.each(j.local?q:o);d["attr."+j]=j.local?m:v;return f};f.attr=function(j,
k){return f.attrTween(j,T(k))};f.styleTween=function(j,k,o){var q=[],v=-1;a.each(function(m,s){q[++v]=k.call(this,m,s,window.getComputedStyle(this,null).getPropertyValue(j))});d["style."+j]=function(m,s){this.style.setProperty(j,q[s](m),o)};return f};f.style=function(j,k,o){return f.styleTween(j,T(k),o)};f.select=function(j){var k;j=M(a.select(j),b).ease(p);k=-1;j.delay(function(){return i[++k]});k=-1;j.duration(function(){return g[++k]});return j};f.selectAll=function(j){var k;j=M(a.selectAll(j),
b).ease(p);k=-1;j.delay(function(o,q){return i[q?k:++k]});k=-1;j.duration(function(o,q){return g[q?k:++k]});return j};f.each=function(j,k){c[j].add(k);return f};return f.delay(0).duration(250)}function aa(a,b){for(var e=Date.now(),f=false,d=e+b,c=D;c;){if(c.callback==a){c.then=e;c.delay=b;f=true}else{var h=c.then+c.delay;if(h<d)d=h}c=c.next}f||(D={callback:a,then:e,delay:b,next:D});if(!G){clearTimeout(N);N=setTimeout(ba,Math.min(24,d-e))}}function ba(){G=setInterval(ca,24);N=0}function ca(){for(var a,
b=Date.now(),e=D;e;){a=b-e.then;if(a>e.delay)e.flush=e.callback(a);e=e.next}a=null;for(b=D;b;)b=b.flush?a?a.next=b.next:D=b.next:(a=b).next;a||(G=clearInterval(G))}function T(a){return typeof a=="function"?function(b,e,f){return l.interpolate(f,a.call(this,b,e))}:function(b,e,f){return l.interpolate(f,a)}}var l=I.d3={};l.version="0.1.0";l.range=function(a,b,e){if(arguments.length==1){b=a;a=0}if(e==null)e=1;if((b-a)/e==Infinity)throw Error("infinite range");var f=[],d=-1,c;if(e<0)for(;(c=a+e*++d)>
b;)f.push(c);else for(;(c=a+e*++d)<b;)f.push(c);return f};l.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:l.ns.prefix[a.substring(0,b)],local:a.substring(b+1)}}};l.dispatch=function(){for(var a={},b,e=0,f=arguments.length;e<f;e++){b=arguments[e];a[b]=E(b)}return a};var da=J(2),ea=J(3),
fa={linear:function(){return U},poly:J,quad:function(){return da},cubic:function(){return ea},sin:function(){return V},exp:function(){return W},circle:function(){return X},elastic:function(a,b){var e;if(arguments.length<2)b=0.45;if(arguments.length<1){a=1;e=b/4}else e=b/(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/b)}},back:function(a){a||(a=1.70158);return function(b){return b*b*((a+1)*b-a)}},bounce:function(){return Y}},ga={"in":function(a){return a},
out:Q,"in-out":R,"out-int":function(a){return R(Q(a))}};l.ease=function(a){var b=a.indexOf("-"),e=b>=0?a.substring(0,b):a;b=b>=0?a.substring(b+1):"in";return ga[b](fa[e].apply(null,Array.prototype.slice.call(arguments,1)))};l.event=null;l.interpolate=function(a,b){if(typeof b=="number")return l.interpolateNumber(+a,b);if(typeof b=="string")return b in B||/^(#|rgb\(|hsl\()/.test(b)?l.interpolateRgb(String(a),b):l.interpolateString(String(a),b);if(b instanceof Array)return l.interpolateArray(a,b);return l.interpolateObject(a,
b)};l.interpolateNumber=function(a,b){b-=a;return function(e){return a+b*e}};l.interpolateString=function(a,b){var e,f,d=0,c=[],h=[],i,g;for(f=0;e=O.exec(b);++f){e.index&&c.push(b.substring(d,e.index));h.push({i:c.length,x:e[0]});c.push(null);d=O.lastIndex}d<b.length&&c.push(b.substring(d));f=0;for(i=h.length;(e=O.exec(a))&&f<i;++f){g=h[f];if(g.x==e[0]){if(g.i)if(c[g.i+1]==null){c[g.i-1]+=g.x;c.splice(g.i,1);for(e=f+1;e<i;++e)h[e].i--}else{c[g.i-1]+=g.x+c[g.i+1];c.splice(g.i,2);for(e=f+1;e<i;++e)h[e].i-=
2}else if(c[g.i+1]==null)c[g.i]=g.x;else{c[g.i]=g.x+c[g.i+1];c.splice(g.i+1,1);for(e=f+1;e<i;++e)h[e].i--}h.splice(f,1);i--;f--}else g.x=l.interpolateNumber(parseFloat(e[0]),parseFloat(g.x))}for(;f<i;){g=h.pop();if(c[g.i+1]==null)c[g.i]=g.x;else{c[g.i]=g.x+c[g.i+1];c.splice(g.i+1,1)}i--}if(c.length==1)return c[0]==null?h[0].x:function(){return b};return function(n){for(f=0;f<i;++f)c[(g=h[f]).i]=g.x(n);return c.join("")}};l.interpolateRgb=function(a,b){a=K(a);b=K(b);var e=a.r,f=a.g,d=a.b,c=b.r-e,h=
b.g-f,i=b.b-d;return function(g){return"rgb("+Math.round(e+c*g)+","+Math.round(f+h*g)+","+Math.round(d+i*g)+")"}};l.interpolateArray=function(a,b){var e=[],f=[],d=a.length,c=b.length,h=Math.min(a.length,b.length),i;for(i=0;i<h;++i)e.push(l.interpolate(a[i],b[i]));for(;i<d;++i)f[i]=a[i];for(;i<c;++i)f[i]=b[i];return function(g){for(i=0;i<h;++i)f[i]=e[i](g);return f}};l.interpolateObject=function(a,b){var e={},f={},d;for(d in a)if(d in b)e[d]=(d in ha||/\bcolor\b/.test(d)?l.interpolateRgb:l.interpolate)(a[d],
b[d]);else f[d]=a[d];for(d in b)d in a||(f[d]=b[d]);return function(c){for(d in e)f[d]=e[d](c);return f}};var O=/[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g,ha={background:1,fill:1,stroke:1},B={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",
(function(I){function E(){var a={},c=[];a.add=function(e){for(var f=0;f<c.length;f++)if(c[f].listener==e)return a;c.push({listener:e,on:true});return a};a.remove=function(e){for(var f=0;f<c.length;f++){var d=c[f];if(d.listener==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.listener.apply(this,arguments)}};return a}function Q(a){return function(c){return 1-a(1-c)}}function R(a){return function(c){return 0.5*
(c<0.5?a(2*c):2-a(2-2*c))}}function U(a){return a}function J(a){return function(c){return Math.pow(c,a)}}function V(a){return 1-Math.cos(a*Math.PI/2)}function W(a){return a?Math.pow(2,10*(a-1))-0.0010:0}function X(a){return 1-Math.sqrt(1-a*a)}function Y(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}function Z(a){return{nodeKey:function(c){return c.getAttribute(a)},dataKey:function(c){return c[a]}}}function K(a){var c,
e,f,d,b;if(d=/([a-z]+)\((.*)\)/i.exec(a)){b=d[2].split(",");switch(d[1]){case "hsl":return S(parseFloat(b[0]),parseFloat(b[1])/100,parseFloat(b[2])/100);case "rgb":return{r:L(b[0]),g:L(b[1]),b:L(b[2])}}}if(d=B[a])return d;if(a==null)return B.black;if(a.charAt(0)=="#"){if(a.length==4){c=a.charAt(1);c+=c;e=a.charAt(2);e+=e;f=a.charAt(3);f+=f}else if(a.length==7){c=a.substring(1,3);e=a.substring(3,5);f=a.substring(5,7)}c=parseInt(c,16);e=parseInt(e,16);f=parseInt(f,16)}return{r:c,g:e,b:f}}function S(a,
c,e){function f(g){if(g>360)g-=360;else if(g<0)g+=360;if(g<60)return d+(b-d)*g/60;if(g<180)return b;if(g<240)return d+(b-d)*(240-g)/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{r:Math.round(f(a+120)*255),g:Math.round(f(a)*255),b:Math.round(f(a-120)*255)}}function L(a){var c=parseFloat(a);return a.charAt(a.length-1)=="%"?Math.round(c*2.55):c}function z(a){function c(d){for(var b=[],g,i,h,n,o=0,j=a.length;o<j;o++){h=a[o];b.push(g=[]);
g.parentNode=h.parentNode;g.parentData=h.parentData;for(var k=0,p=h.length;k<p;k++)if(n=h[k]){g.push(i=d(n));if(i)i.__data__=n.__data__}else g.push(null)}return z(b)}function e(d){for(var b=[],g,i,h,n=0,o=a.length;n<o;n++){i=a[n];for(var j=0,k=i.length;j<k;j++)if(h=i[j]){b.push(g=d(h));g.parentNode=h;g.parentData=h.__data__}}return z(b)}function f(d){for(var b=0,g=a.length;b<g;b++)for(var i=a[b],h=0,n=i.length;h<n;h++){var o=i[h];if(o)return d.call(o,o.__data__,h)}return null}a.select=function(d){return c(function(b){return b.querySelector(d)})};
a.selectAll=function(d){return e(function(b){b=b.querySelectorAll(d);return Array.prototype.slice.call(b)})};a.data=function(d,b){function g(p,q){function v($){return p.parentNode.appendChild($)}var m=0,s=p.length,A=q.length,r=Math.min(s,A),t=Math.max(s,A),w=[],x=[],u=[],y,C;if(b){r={};t=[];var F;for(m=0;m<s;m++){r[F=b.nodeKey(y=p[m])]=y;t.push(F)}for(m=0;m<A;m++){if(y=r[F=b.dataKey(C=q[m])]){y.__data__=C;w[m]=y;x[m]=u[m]=null}else{x[m]={appendChild:v,__data__:C};w[m]=u[m]=null}delete r[F]}for(m=
0;m<s;m++)if(t[m]in r)u[m]=p[m]}else{for(;m<r;m++){y=p[m];C=q[m];if(y){y.__data__=C;w[m]=y;x[m]=u[m]=null}else{x[m]={appendChild:v,__data__:C};w[m]=u[m]=null}}for(;m<A;m++){x[m]={appendChild:v,__data__:q[m]};w[m]=u[m]=null}for(;m<t;m++){u[m]=p[m];x[m]=w[m]=null}}x.parentNode=w.parentNode=u.parentNode=p.parentNode;x.parentData=w.parentData=u.parentData=p.parentData;o.push(x);j.push(w);k.push(u)}var i=-1,h=a.length,n,o=[],j=[],k=[];if(typeof b=="string")b=Z(b);if(typeof d=="function")for(;++i<h;)g(n=
a[i],d.call(n,n.parentData,i));else for(;++i<h;)g(n=a[i],d);i=z(j);i.enter=function(p){return z(o).append(p)};i.exit=function(){return z(k)};return i};a.each=function(d){for(var b=0,g=a.length;b<g;b++)for(var i=a[b],h=0,n=i.length;h<n;h++){var o=i[h];o&&d.call(o,o.__data__,h)}return a};a.attr=function(d,b){function g(){this.removeAttribute(d)}function i(){this.removeAttributeNS(d.space,d.local)}function h(){this.setAttribute(d,b)}function n(){this.setAttributeNS(d.space,d.local,b)}function o(){var k=
b.apply(this,arguments);k==null?this.removeAttribute(d):this.setAttribute(d,k)}function j(){var k=b.apply(this,arguments);k==null?this.removeAttributeNS(d.space,d.local):this.setAttributeNS(d.space,d.local,k)}d=l.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==null?d.local?i:g:typeof b=="function"?d.local?j:o:d.local?n:h)};a.style=function(d,b,g){function i(){this.style.removeProperty(d)}
function h(){this.style.setProperty(d,b,g)}function n(){var o=b.apply(this,arguments);o==null?this.style.removeProperty(d):this.style.setProperty(d,o,g)}if(arguments.length<3)g=null;if(arguments.length<2)return f(function(){return window.getComputedStyle(this,null).getPropertyValue(d)});return a.each(b==null?i:typeof b=="function"?n:h)};a.text=function(d){function b(){this.appendChild(document.createTextNode(d))}function g(){var i=d.apply(this,arguments);i!=null&&this.appendChild(document.createTextNode(i))}
if(arguments.length<1)return f(function(){return this.textContent});a.each(function(){for(;this.lastChild;)this.removeChild(this.lastChild)});return d==null?a:a.each(typeof d=="function"?g:b)};a.html=function(d){function b(){this.innerHTML=d}function g(){this.innerHTML=d.apply(this,arguments)}if(arguments.length<1)return f(function(){return this.innerHTML});return a.each(typeof d=="function"?g:b)};a.append=function(d){function b(i){return i.appendChild(document.createElement(d))}function g(i){return i.appendChild(document.createElementNS(d.space,
d.local))}d=l.ns.qualify(d);return c(d.local?g:b)};a.remove=function(){return c(function(d){var b=d.parentNode;b.removeChild(d);return b})};a.on=function(d,b){d="on"+d;return a.each(function(g,i){this[d]=function(h){l.event=h;try{b.call(this,g,i)}finally{l.event=null}}})};a.transition=function(d){return M(a,d)};return a}function M(a,c){function e(j){var k=true,p=-1;a.each(function(){if(g[++p]!=2){var q=(j-i[p])/h[p];if(q>=1)q=1;else{k=false;if(q<0)return;if(!g[p]){g[p]=1;b.start.dispatch.apply(this,
arguments)}}var v=o(q),m;for(m in d)d[m].call(this,v,p);if(q==1){g[p]=2;b.end.dispatch.apply(this,arguments)}}});return k}var f={},d={},b=l.dispatch("start","end"),g=[],i=[],h=[],n,o=l.ease("cubic-in-out");f.delay=function(j){var k=Infinity,p=-1;if(typeof j=="function")a.each(function(){var q=i[++p]=+j.apply(this,arguments);if(q<k)k=q});else{k=+j;a.each(function(){i[++p]=k})}aa(e,k);return f};f.duration=function(j){var k=-1;if(typeof j=="function"){n=0;a.each(function(){var p=h[++k]=+j.apply(this,
arguments);if(p>n)n=p})}else{n=+j;a.each(function(){h[++k]=n})}return f};f.ease=function(j){o=typeof j=="string"?l.ease(j):j;return f};f.attrTween=function(j,k){function p(r,t){s[++A]=k.call(this,r,t,this.getAttribute(j))}function q(r,t){s[++A]=k.call(this,r,t,this.getAttributeNS(j.space,j.local))}function v(r,t){this.setAttribute(j,s[t](r))}function m(r,t){this.setAttributeNS(j.space,j.local,s[t](r))}var s=[],A=-1;j=l.ns.qualify(j);a.each(j.local?q:p);d["attr."+j]=j.local?m:v;return f};f.attr=function(j,
k){return f.attrTween(j,T(k))};f.styleTween=function(j,k,p){var q=[],v=-1;a.each(function(m,s){q[++v]=k.call(this,m,s,window.getComputedStyle(this,null).getPropertyValue(j))});d["style."+j]=function(m,s){this.style.setProperty(j,q[s](m),p)};return f};f.style=function(j,k,p){return f.styleTween(j,T(k),p)};f.select=function(j){var k;j=M(a.select(j),c).ease(o);k=-1;j.delay(function(){return i[++k]});k=-1;j.duration(function(){return h[++k]});return j};f.selectAll=function(j){var k;j=M(a.selectAll(j),
c).ease(o);k=-1;j.delay(function(p,q){return i[q?k:++k]});k=-1;j.duration(function(p,q){return h[q?k:++k]});return j};f.each=function(j,k){b[j].add(k);return f};return f.delay(0).duration(250)}function aa(a,c){for(var e=Date.now(),f=false,d=e+c,b=D;b;){if(b.callback==a){b.then=e;b.delay=c;f=true}else{var g=b.then+b.delay;if(g<d)d=g}b=b.next}f||(D={callback:a,then:e,delay:c,next:D});if(!G){clearTimeout(N);N=setTimeout(ba,Math.min(24,d-e))}}function ba(){G=setInterval(ca,24);N=0}function ca(){for(var a,
c=Date.now(),e=D;e;){a=c-e.then;if(a>e.delay)e.flush=e.callback(a);e=e.next}a=null;for(c=D;c;)c=c.flush?a?a.next=c.next:D=c.next:(a=c).next;a||(G=clearInterval(G))}function T(a){return typeof a=="function"?function(c,e,f){return l.interpolate(f,a.call(this,c,e))}:function(c,e,f){return l.interpolate(f,a)}}var l=I.d3={};l.version="0.1.0";l.range=function(a,c,e){if(arguments.length==1){c=a;a=0}if(e==null)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};l.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:l.ns.prefix[a.substring(0,c)],local:a.substring(c+1)}}};l.dispatch=function(){for(var a={},c,e=0,f=arguments.length;e<f;e++){c=arguments[e];a[c]=E(c)}return a};var da=J(2),ea=J(3),
fa={linear:function(){return U},poly:J,quad:function(){return da},cubic:function(){return ea},sin:function(){return V},exp:function(){return W},circle:function(){return X},elastic:function(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)}},back:function(a){a||(a=1.70158);return function(c){return c*c*((a+1)*c-a)}},bounce:function(){return Y}},ga={"in":function(a){return a},
out:Q,"in-out":R,"out-int":function(a){return R(Q(a))}};l.ease=function(a){var c=a.indexOf("-"),e=c>=0?a.substring(0,c):a;c=c>=0?a.substring(c+1):"in";return ga[c](fa[e].apply(null,Array.prototype.slice.call(arguments,1)))};l.event=null;l.interpolate=function(a,c){if(typeof c=="number")return l.interpolateNumber(+a,c);if(typeof c=="string")return c in B||/^(#|rgb\(|hsl\()/.test(c)?l.interpolateRgb(String(a),c):l.interpolateString(String(a),c);if(c instanceof Array)return l.interpolateArray(a,c);return l.interpolateObject(a,
c)};l.interpolateNumber=function(a,c){c-=a;return function(e){return a+c*e}};l.interpolateString=function(a,c){var e,f,d=0,b=[],g=[],i,h;for(f=0;e=O.exec(c);++f){e.index&&b.push(c.substring(d,e.index));g.push({i:b.length,x:e[0]});b.push(null);d=O.lastIndex}d<c.length&&b.push(c.substring(d));f=0;for(i=g.length;(e=O.exec(a))&&f<i;++f){h=g[f];if(h.x==e[0]){if(h.i)if(b[h.i+1]==null){b[h.i-1]+=h.x;b.splice(h.i,1);for(e=f+1;e<i;++e)g[e].i--}else{b[h.i-1]+=h.x+b[h.i+1];b.splice(h.i,2);for(e=f+1;e<i;++e)g[e].i-=
2}else if(b[h.i+1]==null)b[h.i]=h.x;else{b[h.i]=h.x+b[h.i+1];b.splice(h.i+1,1);for(e=f+1;e<i;++e)g[e].i--}g.splice(f,1);i--;f--}else h.x=l.interpolateNumber(parseFloat(e[0]),parseFloat(h.x))}for(;f<i;){h=g.pop();if(b[h.i+1]==null)b[h.i]=h.x;else{b[h.i]=h.x+b[h.i+1];b.splice(h.i+1,1)}i--}if(b.length==1)return b[0]==null?g[0].x:function(){return c};return function(n){for(f=0;f<i;++f)b[(h=g[f]).i]=h.x(n);return b.join("")}};l.interpolateRgb=function(a,c){a=K(a);c=K(c);var e=a.r,f=a.g,d=a.b,b=c.r-e,g=
c.g-f,i=c.b-d;return function(h){return"rgb("+Math.round(e+b*h)+","+Math.round(f+g*h)+","+Math.round(d+i*h)+")"}};l.interpolateArray=function(a,c){var e=[],f=[],d=a.length,b=c.length,g=Math.min(a.length,c.length),i;for(i=0;i<g;++i)e.push(l.interpolate(a[i],c[i]));for(;i<d;++i)f[i]=a[i];for(;i<b;++i)f[i]=c[i];return function(h){for(i=0;i<g;++i)f[i]=e[i](h);return f}};l.interpolateObject=function(a,c){var e={},f={},d;for(d in a)if(d in c)e[d]=(d in ha||/\bcolor\b/.test(d)?l.interpolateRgb:l.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 O=/[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g,ha={background:1,fill:1,stroke:1},B={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"},P;for(P in B)B[P]=K(B[P]);l.hsl=function(a,b,e){a=S(a,b,e);return"rgb("+a.r+","+a.g+","+a.b+")"};l.linear=function(){function a(g){return i((g-e)*h)}function b(g){var n=Math.min(e,f),p=Math.max(e,f),j=p-n,k=Math.pow(10,Math.floor(Math.log(j/g)/Math.LN10));g=g/(j/k);if(g<=0.15)k*=10;else if(g<=0.35)k*=5;else if(g<=0.75)k*=2;return{start:Math.ceil(n/k)*k,stop:Math.floor(p/k)*k+k*0.5,step:k}}var e=0,f=1,d=0,c=1,h=1/(f-e),i=
l.interpolate(d,c);a.invert=function(g){return(g-d)/h+e};a.domain=function(g){if(!arguments.length)return[e,f];e=g[0];f=g[1];h=1/(f-e);return a};a.range=function(g){if(!arguments.length)return[d,c];d=g[0];c=g[1];i=l.interpolate(d,c);return a};a.ticks=function(g){g=b(g);return l.range(g.start,g.stop,g.step)};a.tickFormat=function(g){var n=Math.max(0,-Math.floor(Math.log(b(g).step)/Math.LN10+0.01));return function(p){return p.toFixed(n)}};return a};l.log=function(){function a(e){return b(Math.log(e))}
var b=l.linear();a.invert=function(e){return Math.exp(b.invert(e))};a.domain=function(e){if(!arguments.length)return b.domain().map(Math.exp);b.domain(e.map(Math.log));return a};a.range=function(){var e=b.range.apply(b,arguments);return arguments.length?a:e};return a};l.pow=function(){function a(h){return Math.pow(h,d)}function b(h){return Math.pow(h,c)}function e(h){return f(a(h))}var f=l.linear(),d=1,c=1/d;e.invert=function(h){return b(f.invert(h))};e.domain=function(h){if(!arguments.length)return f.domain().map(b);
f.domain(h.map(a));return e};e.range=function(){var h=f.range.apply(f,arguments);return arguments.length?e:h};e.exponent=function(h){if(!arguments.length)return d;var i=e.domain();d=h;c=1/h;return e.domain(i)};return e};l.sqrt=function(){return l.pow().exponent(0.5)};l.ordinal=function(){function a(c){c=c in e?e[c]:e[c]=b.push(c)-1;return f[c%f.length]}var b=[],e={},f=[],d=0;a.domain=function(c){if(!arguments.length)return b;b=c;e={};for(var h=-1,i=-1,g=b.length;++h<g;){c=b[h];c in e||(e[c]=++i)}return a};
a.range=function(c){if(!arguments.length)return f;f=c;return a};a.rangePoints=function(c,h){if(arguments.length<2)h=0;var i=c[0],g=c[1],n=(g-i)/(b.length-1+h);f=b.length==1?[(i+g)/2]:l.range(i+n*h/2,g+n/2,n);d=0;return a};a.rangeBands=function(c,h){if(arguments.length<2)h=0;var i=c[0],g=c[1],n=(g-i)/(b.length+h);f=l.range(i+n*h,g,n);d=n*(1-h);return a};a.rangeBand=function(){return d};return a};l.category10=function(){return l.ordinal().range(ia)};l.category19=function(){return l.ordinal().range(ja)};
white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},P;for(P in B)B[P]=K(B[P]);l.hsl=function(a,c,e){a=S(a,c,e);return"rgb("+a.r+","+a.g+","+a.b+")"};l.linear=function(){function a(h){return i((h-e)*g)}function c(h){var n=Math.min(e,f),o=Math.max(e,f),j=o-n,k=Math.pow(10,Math.floor(Math.log(j/h)/Math.LN10));h=h/(j/k);if(h<=0.15)k*=10;else if(h<=0.35)k*=5;else if(h<=0.75)k*=2;return{start:Math.ceil(n/k)*k,stop:Math.floor(o/k)*k+k*0.5,step:k}}var e=0,f=1,d=0,b=1,g=1/(f-e),i=
l.interpolate(d,b);a.invert=function(h){return(h-d)/g+e};a.domain=function(h){if(!arguments.length)return[e,f];e=h[0];f=h[1];g=1/(f-e);return a};a.range=function(h){if(!arguments.length)return[d,b];d=h[0];b=h[1];i=l.interpolate(d,b);return a};a.ticks=function(h){h=c(h);return l.range(h.start,h.stop,h.step)};a.tickFormat=function(h){var n=Math.max(0,-Math.floor(Math.log(c(h).step)/Math.LN10+0.01));return function(o){return o.toFixed(n)}};return a};l.log=function(){function a(e){return c(Math.log(e))}
var c=l.linear();a.invert=function(e){return Math.exp(c.invert(e))};a.domain=function(e){if(!arguments.length)return c.domain().map(Math.exp);c.domain(e.map(Math.log));return a};a.range=function(){var e=c.range.apply(c,arguments);return arguments.length?a:e};return a};l.pow=function(){function a(g){return Math.pow(g,d)}function c(g){return Math.pow(g,b)}function e(g){return f(a(g))}var f=l.linear(),d=1,b=1/d;e.invert=function(g){return c(f.invert(g))};e.domain=function(g){if(!arguments.length)return f.domain().map(c);
f.domain(g.map(a));return e};e.range=function(){var g=f.range.apply(f,arguments);return arguments.length?e:g};e.exponent=function(g){if(!arguments.length)return d;var i=e.domain();d=g;b=1/g;return e.domain(i)};return e};l.sqrt=function(){return l.pow().exponent(0.5)};l.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 g=-1,i=-1,h=c.length;++g<h;){b=c[g];b in e||(e[b]=++i)}return a};
a.range=function(b){if(!arguments.length)return f;f=b;return a};a.rangePoints=function(b,g){if(arguments.length<2)g=0;var i=b[0],h=b[1],n=(h-i)/(c.length-1+g);f=c.length==1?[(i+h)/2]:l.range(i+n*g/2,h+n/2,n);d=0;return a};a.rangeBands=function(b,g){if(arguments.length<2)g=0;var i=b[0],h=b[1],n=(h-i)/(c.length+g);f=l.range(i+n*g,h,n);d=n*(1-g);return a};a.rangeBand=function(){return d};return a};l.category10=function(){return l.ordinal().range(ia)};l.category19=function(){return l.ordinal().range(ja)};
l.category20=function(){return l.ordinal().range(ka)};var ia=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],ja=["#9c9ede","#7375b5","#4a5584","#cedb9c","#b5cf6b","#8ca252","#637939","#e7cb94","#e7ba52","#bd9e39","#8c6d31","#e7969c","#d6616b","#ad494a","#843c39","#de9ed6","#ce6dbd","#a55194","#7b4173"],ka=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2",
"#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],H=z([[document]]);H[0].parentNode=document.documentElement;l.select=function(a){return typeof a=="string"?H.select(a):z([[a]])};l.selectAll=function(a){return typeof a=="string"?H.selectAll(a):z([Array.prototype.slice.call(a)])};l.transition=H.transition;var D=null,N=0,G})(this);
"#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],H=z([[document]]);H[0].parentNode=document.documentElement;l.select=function(a){return typeof a=="string"?H.select(a):z([[a]])};l.selectAll=function(a){return typeof a=="string"?H.selectAll(a):z([Array.prototype.slice.call(a)])};l.transition=H.transition;var D=null,N=0,G;l.arc=function(){function a(b){var g=c(b),i=e(b),h=f(b)-Math.PI/2,n=d(b)-Math.PI/2;b=n-h;var o=Math.cos(h);h=Math.sin(h);var j=Math.cos(n);n=Math.sin(n);return"M"+i*o+","+
i*h+"A"+i+","+i+" 0 "+(b<Math.PI?"0":"1")+",1 "+i*j+","+i*n+"L"+g*j+","+g*n+"A"+g+","+g+" 0 "+(b<Math.PI?"0":"1")+",0 "+g*o+","+g*h+"Z"}var c=function(b){return b.innerRadius},e=function(b){return b.outerRadius},f=function(b){return b.startAngle},d=function(b){return b.endAngle};a.innerRadius=function(b){c=typeof b=="function"?b:function(){return b};return a};a.outerRadius=function(b){e=typeof b=="function"?b:function(){return b};return a};a.startAngle=function(b){f=typeof b=="function"?b:function(){return b};
return a};a.endAngle=function(b){d=typeof b=="function"?b:function(){return b};return a};return a};l.line=function(){function a(f){var d=[],b=0,g=f[0];for(d.push("M",c.call(this,g,b),",",e.call(this,g,b));g=f[++b];)d.push("L",c.call(this,g,b),",",e.call(this,g,b));return d.join("")}var c=function(f){return f.x},e=function(f){return f.y};a.x=function(f){c=f;return a};a.y=function(f){e=f;return a};return a};l.area=function(){function a(d){var b=[],g=0,i=d[0];for(b.push("M",c.call(this,i,g),","+e+"V",
f.call(this,i,g));i=d[++g];)b.push("L",c.call(this,i,g),",",f.call(this,i,g));b.push("V"+e+"Z");return b.join("")}var c=function(d){return d.x},e=0,f=function(d){return d.y1};a.x=function(d){c=d;return a};a.y0=function(d){e=d;return a};a.y1=function(d){f=d;return a};return a}})(this);

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

@ -48,13 +48,14 @@ var w = 450,
var vis = d3.select("body")
.append("svg:svg")
.data([data])
.attr("width", w + p * 2)
.attr("height", h + p * 2)
.append("svg:g")
.attr("transform", "translate(" + p + "," + p + ")");
var rules = vis.selectAll("g.rule")
.data(d3.range(0, 1.05, .1))
.data(x.ticks(10))
.enter("svg:g")
.attr("class", "rule");
@ -76,22 +77,27 @@ rules.append("svg:text")
.attr("y", h + 3)
.attr("dy", ".71em")
.attr("text-anchor", "middle")
.text(function(d) { return d.toFixed(1); });
.text(x.tickFormat(10));
rules.append("svg:text")
.attr("y", y)
.attr("x", -3)
.attr("dy", ".35em")
.attr("text-anchor", "end")
.text(function(d) { return d.toFixed(1); });
.text(y.tickFormat(10));
vis.append("svg:path")
.attr("class", "area")
.attr("d", area(data));
.attr("d", d3.area()
.x(function(d) { return x(d.x); })
.y0(h - 1)
.y1(function(d) { return y(d.y); }));
vis.append("svg:path")
.attr("class", "line")
.attr("d", line(data));
.attr("d", d3.line()
.x(function(d) { return x(d.x); })
.y(function(d) { return y(d.y); }));
vis.selectAll("circle.area")
.data(data)
@ -101,25 +107,6 @@ vis.selectAll("circle.area")
.attr("cy", function(d) { return y(d.y); })
.attr("r", 3.5);
function line(points) {
var d = [],
i = 1,
p = points[0];
d.push("M", x(p.x), ",", y(p.y));
while (p = points[i++]) d.push("L", x(p.x), ",", y(p.y));
return d.join("");
}
function area(points) {
var d = [],
i = 1,
p = points[0];
d.push("M", x(p.x), "," + (h - 1) + "V", y(p.y));
while (p = points[i++]) d.push("L", x(p.x), ",", y(p.y));
d.push("V" + (h - 1) + "Z");
return d.join("");
}
</script>
</body>
</html>

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

@ -15,23 +15,24 @@ body {
var w = 400,
h = 400,
r = Math.min(w, h) / 2,
r1 = Math.min(w, h) / 2,
r0 = r1 * .6,
n = 10,
data = normalize(d3.range(n).map(Math.random)),
color = d3.category20();
data = arcs(d3.range(n).map(Math.random)),
color = d3.category20(),
arc = d3.arc();
var vis = d3.select("body")
.append("svg:svg")
.attr("width", w)
.attr("height", h);
var arcs = vis.selectAll("g.arc")
vis.selectAll("g.arc")
.data(data)
.enter("svg:g")
.attr("class", "arc")
.attr("transform", "translate(" + r + "," + r + ")");
arcs.append("svg:path")
.attr("transform", "translate(" + r1 + "," + r1 + ")")
.append("svg:path")
.attr("fill", function(d, i) { return color(i); })
.attr("d", arc);
@ -39,7 +40,7 @@ window.addEventListener("keypress", update, false);
function update() {
var prev = data,
next = data = normalize(d3.range(n).map(Math.random)),
next = data = arcs(d3.range(n).map(Math.random)),
i = 0;
for (; i < n; ++i) prev[i].next = next[i];
d3.selectAll("g.arc > path")
@ -52,8 +53,8 @@ function transitionSplit(d, i) {
d3.select(this)
.transition()
.attrTween("d", tweenArc({
innerRadius: i & 1 ? r * .6 : r * .8,
outerRadius: i & 1 ? r * .8 : r
innerRadius: i & 1 ? r0 : (r0 + r1) / 2,
outerRadius: i & 1 ? (r0 + r1) / 2 : r1
}))
.each("end", transitionRotate);
}
@ -102,39 +103,19 @@ function tweenArc(b) {
};
}
function normalize(array) {
var k = (2 * Math.PI) / array.reduce(function(p, d) { return p + d; }, 0),
function arcs(values) {
var k = (2 * Math.PI) / values.reduce(function(p, d) { return p + d; }, 0),
a = 0;
return array.map(function(d, i) {
return values.map(function(d, i) {
return {
innerRadius: r * .6,
outerRadius: r,
startAngle: a,
endAngle: a += d * k
endAngle: a += d * k,
innerRadius: r0,
outerRadius: r1
};
});
}
function arc(d) {
var r0 = d.innerRadius,
r1 = d.outerRadius,
a0 = d.startAngle - Math.PI / 2,
a1 = d.endAngle - Math.PI / 2,
da = a1 - a0,
c0 = Math.cos(a0),
s0 = Math.sin(a0),
c1 = Math.cos(a1),
s1 = Math.sin(a1);
return "M" + r1 * c0 + "," + r1 * s0
+ "A" + r1 + "," + r1 + " 0 "
+ ((da < Math.PI) ? "0" : "1") + ",1 "
+ r1 * c1 + "," + r1 * s1
+ "L" + r0 * c1 + "," + r0 * s1
+ "A" + r0 + "," + r0 + " 0 "
+ ((da < Math.PI) ? "0" : "1") + ",0 "
+ r0 * c0 + "," + r0 * s0 + "Z";
}
</script>
</body>
</html>

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

@ -38,9 +38,12 @@ var data = d3.range(20).map(function(i) {
var w = 450,
h = 275,
p = 20;
p = 20,
x = d3.linear().domain([0, 1]).range([0, w]),
y = d3.linear().domain([0, 1]).range([h, 0]);
var vis = d3.select("body")
.data([data])
.append("svg:svg")
.attr("width", w + p * 2)
.attr("height", h + p * 2)
@ -48,58 +51,51 @@ var vis = d3.select("body")
.attr("transform", "translate(" + p + "," + p + ")");
var rules = vis.selectAll("g.rule")
.data(d3.range(11))
.data(x.ticks(10))
.enter("svg:g")
.attr("class", "rule");
rules.append("svg:line")
.attr("x1", function(d) { return d / 10 * w; })
.attr("x2", function(d) { return d / 10 * w; })
.attr("x1", x)
.attr("x2", x)
.attr("y1", 0)
.attr("y2", h - 1);
rules.append("svg:line")
.attr("class", function(d) { return d ? null : "axis"; })
.attr("y1", function(d) { return (1 - d / 10) * h; })
.attr("y2", function(d) { return (1 - d / 10) * h; })
.attr("y1", y)
.attr("y2", y)
.attr("x1", 0)
.attr("x2", w + 1);
rules.append("svg:text")
.attr("x", function(d) { return d / 10 * w; })
.attr("x", x)
.attr("y", h + 3)
.attr("dy", ".71em")
.attr("text-anchor", "middle")
.text(function(d) { return (d / 10).toFixed(1); });
.text(x.tickFormat(10));
rules.append("svg:text")
.attr("y", function(d) { return (1 - d / 10) * h; })
.attr("y", y)
.attr("x", -3)
.attr("dy", ".35em")
.attr("text-anchor", "end")
.text(function(d) { return (d / 10).toFixed(1); });
.text(y.tickFormat(10));
vis.append("svg:path")
.attr("class", "line")
.attr("d", line(data));
.attr("d", d3.line()
.x(function(d) { return x(d.x); })
.y(function(d) { return y(d.y); }));
vis.selectAll("circle.line")
.data(data)
.enter("svg:circle")
.attr("class", "line")
.attr("cx", function(d) { return d.x * w; })
.attr("cy", function(d) { return (1 - d.y) * h; })
.attr("cx", function(d) { return x(d.x); })
.attr("cy", function(d) { return y(d.y); })
.attr("r", 3.5);
function line(points) {
var d = [],
i = 1,
p = points[0];
d.push("M", p.x * w, ",", (1 - p.y) * h);
while (p = points[i++]) d.push("L", p.x * w, ",", (1 - p.y) * h);
return d.join("");
}
</script>
</body>
</html>

56
src/arc.js Normal file
Просмотреть файл

@ -0,0 +1,56 @@
d3.arc = function() {
var innerRadius = function(d) { return d.innerRadius; },
outerRadius = function(d) { return d.outerRadius; },
startAngle = function(d) { return d.startAngle; },
endAngle = function(d) { return d.endAngle; };
function arc(d) {
var r0 = innerRadius(d),
r1 = outerRadius(d),
a0 = startAngle(d) - Math.PI / 2,
a1 = endAngle(d) - Math.PI / 2,
da = a1 - a0,
c0 = Math.cos(a0),
s0 = Math.sin(a0),
c1 = Math.cos(a1),
s1 = Math.sin(a1);
return "M" + r1 * c0 + "," + r1 * s0
+ "A" + r1 + "," + r1 + " 0 "
+ ((da < Math.PI) ? "0" : "1") + ",1 "
+ r1 * c1 + "," + r1 * s1
+ "L" + r0 * c1 + "," + r0 * s1
+ "A" + r0 + "," + r0 + " 0 "
+ ((da < Math.PI) ? "0" : "1") + ",0 "
+ r0 * c0 + "," + r0 * s0 + "Z";
}
arc.innerRadius = function(value) {
innerRadius = typeof value == "function"
? value
: function() { return value; };
return arc;
};
arc.outerRadius = function(value) {
outerRadius = typeof value == "function"
? value
: function() { return value; };
return arc;
};
arc.startAngle = function(value) {
startAngle = typeof value == "function"
? value
: function() { return value; };
return arc;
};
arc.endAngle = function(value) {
endAngle = typeof value == "function"
? value
: function() { return value; };
return arc;
};
return arc;
};

36
src/area.js Normal file
Просмотреть файл

@ -0,0 +1,36 @@
d3.area = function() {
var x = function(d, i) { return d.x; },
y0 = 0,
y1 = function(d, i) { return d.y1; };
// TODO interpolators
// TODO variable y0
// TODO horizontal / vertical orientation
function area(d) {
var a = [],
i = 0,
p = d[0];
a.push("M", x.call(this, p, i), "," + y0 + "V", y1.call(this, p, i));
while (p = d[++i]) a.push("L", x.call(this, p, i), ",", y1.call(this, p, i));
a.push("V" + y0 + "Z");
return a.join("");
}
area.x = function(value) {
x = value;
return area;
};
area.y0 = function(value) {
y0 = value;
return area;
};
area.y1 = function(value) {
y1 = value;
return area;
};
return area;
};

25
src/line.js Normal file
Просмотреть файл

@ -0,0 +1,25 @@
d3.line = function() {
var x = function(d, i) { return d.x; },
y = function(d, i) { return d.y; };
function line(d) {
var a = [],
i = 0,
p = d[0];
a.push("M", x.call(this, p, i), ",", y.call(this, p, i));
while (p = d[++i]) a.push("L", x.call(this, p, i), ",", y.call(this, p, i));
return a.join("");
}
line.x = function(value) {
x = value;
return line;
};
line.y = function(value) {
y = value;
return line;
};
return line;
};