diff --git a/d3/d3-tests.ts b/d3/d3-tests.ts index 36ac355fe8..389eaa4c4e 100644 --- a/d3/d3-tests.ts +++ b/d3/d3-tests.ts @@ -1,129 +1,487 @@ -/// - -d3.selectAll("p").style("color", "white"); -d3.select("body").style("background-color", "black"); -d3.selectAll("p").style("color", function () { - return "hsl(" + Math.random() * 360 + ",100%,50%)"; -}); -d3.selectAll("p").style("color", function (d, i) { - return i % 2 ? "#fff" : "#eee"; -}); -d3.selectAll("p") - .data([4, 8, 15, 16, 23, 42]) - .style("font-size", function (d) { return d + "px"; }); -d3.select("body").selectAll("p") - .data([4, 8, 15, 16, 23, 42]) - .enter().append("p") - .text(function (d) { return "I’m number " + d + "!"; }); -var p = d3.select("body").selectAll("p") - .data([4, 8, 15, 16, 23, 42]) - .text(String); -p.enter().append("p") - .text(String); -p.exit().remove(); -d3.select("body").transition() - .style("background-color", "black"); -d3.selectAll("circle").transition() - .duration(750) - .delay(function (d, i) { return i * 10; }) - .attr("r", function (d) { return Math.sqrt(d * scale); }); - -function testOrdinalScale() { - var x = d3.scale.ordinal().range(["foo", "bar"]); - x.domain([0, 1]); - var result = x(0); - - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangePoints([120, 0]); - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangePoints([120, 0], 1); - - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeBands([120, 0]); - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeBands([120, 0], .2); - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeBands([120, 0], .2, .1); - - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 100]); - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 100], .2); - var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeRoundBands([120, 0], .2, .1); -} - - -function testKeys() { - var x = d3.keys({ a: 1, b: 1 }); - - function abc() { - this.a = 1; - this.b = 2; - } - var x = d3.keys(new abc()); -} - -function testSVGArc() { - var a = d3.svg.arc().innerRadius(100).outerRadius(200); - var a = d3.svg.arc().outerRadius(100).startAngle(0).endAngle(Math.PI); - - var f = function () => { - return 42; - } - var a = d3.svg.arc().innerRadius(0).outerRadius(f).startAngle(f).endAngle(f() * 2) - - var str = a(); - var str = a({ outerRadius: 50 }); - var str = a.outerRadius(100)(); - var str = a.endAngle(Math.PI / 2)() - var str = a({ startAngle: Math.PI / 2 }); - - var c = d3.svg.arc().innerRadius(0).outerRadius(100).startAngle(0).endAngle(2 * Math.PI).centroid(); - var num = c[0]; -} - -function testPieLayout() { - var p = d3.layout.pie().sort(null).value(function (d) { return d.value; }); - var data = [1, 2, 3, 4]; - var arcs = p(data); -} - -//Example from http://bl.ocks.org/3887235 -function testPieChart() { - var width = 960, - height = 500, - radius = Math.min(width, height) / 2; - - var color = d3.scale.ordinal() - .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); - - var arc = d3.svg.arc() - .outerRadius(radius - 10) - .innerRadius(0); - - var pie = d3.layout.pie() - .sort(null) - .value(function (d) { return d.population; }); - - var svg = d3.select("body").append("svg") - .attr("width", width) - .attr("height", height) - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); - - d3.csv("data.csv", function (error, data) { - - data.forEach(function (d) { - d.population = +d.population; - }); - - var g = svg.selectAll(".arc") - .data(pie(data)) - .enter().append("g") - .attr("class", "arc"); - - g.append("path") - .attr("d", arc) - .style("fill", function (d) { return color(d.data.age); }); - - g.append("text") - .attr("transform", function (d) { return "translate(" + arc.centroid(d) + ")"; }) - .attr("dy", ".35em") - .style("text-anchor", "middle") - .text(function (d) { return d.data.age; }); - - }); -} +/// + +//Example from http://bl.ocks.org/3887235 +function testPieChart() { + var width = 960, + height = 500, + radius = Math.min(width, height) / 2; + + var color = d3.scale.ordinal() + .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); + + var arc = d3.svg.arc() + .outerRadius(radius - 10) + .innerRadius(0); + + var pie = d3.layout.pie() + .sort(null) + .value(function (d) { return d.population; }); + + var svg = d3.select("body").append("svg") + .attr("width", width) + .attr("height", height) + .append("g") + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + + d3.csv("data.csv", function (error, data) { + + data.forEach(function (d) { + d.population = +d.population; + }); + + var g = svg.selectAll(".arc") + .data(pie(data)) + .enter().append("g") + .attr("class", "arc"); + + g.append("path") + .attr("d", arc) + .style("fill", function (d) { return color(d.data.age); }); + + g.append("text") + .attr("transform", function (d) { return "translate(" + arc.centroid(d) + ")"; }) + .attr("dy", ".35em") + .style("text-anchor", "middle") + .text(function (d) { return d.data.age; }); + + }); +} + +//Example from http://bl.ocks.org/3887051 +function groupedBarChart() => { + var margin = { top: 20, right: 20, bottom: 30, left: 40 }, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + var x0 = d3.scale.ordinal() + .rangeRoundBands([0, width], .1); + + var x1 = d3.scale.ordinal(); + + var y = d3.scale.linear() + .range([height, 0]); + + var color = d3.scale.ordinal() + .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); + + var xAxis = d3.svg.axis() + .scale(x0) + .orient("bottom"); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left") + .tickFormat(d3.format(".2s")); + + var svg = d3.select("body").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + d3.csv("data.csv", function (error, data) { + var ageNames = d3.keys(data[0]).filter(function (key) { return key !== "State"; }); + + data.forEach(function (d) { + d.ages = ageNames.map(function (name) { return { name: name, value: +d[name] }; }); + }); + + x0.domain(data.map(function (d) { return d.State; })); + x1.domain(ageNames).rangeRoundBands([0, x0.rangeBand()]); + y.domain([0, d3.max(data, function (d) { return d3.max(d.ages, function (d) { return d.value; }); })]); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Population"); + + var state = svg.selectAll(".state") + .data(data) + .enter().append("g") + .attr("class", "g") + .attr("transform", function (d) { return "translate(" + x0(d.State) + ",0)"; }); + + state.selectAll("rect") + .data(function (d) { return d.ages; }) + .enter().append("rect") + .attr("width", x1.rangeBand()) + .attr("x", function (d) { return x1(d.name); }) + .attr("y", function (d) { return y(d.value); }) + .attr("height", function (d) { return height - y(d.value); }) + .style("fill", function (d) { return color(d.name); }); + + var legend = svg.selectAll(".legend") + .data(ageNames.reverse()) + .enter().append("g") + .attr("class", "legend") + .attr("transform", function (d, i) { return "translate(0," + i * 20 + ")"; }); + + legend.append("rect") + .attr("x", width - 18) + .attr("width", 18) + .attr("height", 18) + .style("fill", color); + + legend.append("text") + .attr("x", width - 24) + .attr("y", 9) + .attr("dy", ".35em") + .style("text-anchor", "end") + .text(function (d) { return d; }); + + }); +} + +//Example from http://bl.ocks.org/3886208 +function stackedBarChart() { + var margin = { top: 20, right: 20, bottom: 30, left: 40 }, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + var x = d3.scale.ordinal() + .rangeRoundBands([0, width], .1); + + var y = d3.scale.linear() + .rangeRound([height, 0]); + + var color = d3.scale.ordinal() + .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom"); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left") + .tickFormat(d3.format(".2s")); + + var svg = d3.select("body").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + d3.csv("data.csv", function (error, data) { + color.domain(d3.keys(data[0]).filter(function (key) { return key !== "State"; })); + + data.forEach(function (d) { + var y0 = 0; + d.ages = color.domain().map(function (name) { return { name: name, y0: y0, y1: y0 += +d[name] }; }); + d.total = d.ages[d.ages.length - 1].y1; + }); + + data.sort(function (a, b) { return b.total - a.total; }); + + x.domain(data.map(function (d) { return d.State; })); + y.domain([0, d3.max(data, function (d) { return d.total; })]); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Population"); + + var state = svg.selectAll(".state") + .data(data) + .enter().append("g") + .attr("class", "g") + .attr("transform", function (d) { return "translate(" + x(d.State) + ",0)"; }); + + state.selectAll("rect") + .data(function (d) { return d.ages; }) + .enter().append("rect") + .attr("width", x.rangeBand()) + .attr("y", function (d) { return y(d.y1); }) + .attr("height", function (d) { return y(d.y0) - y(d.y1); }) + .style("fill", function (d) { return color(d.name); }); + + var legend = svg.selectAll(".legend") + .data(color.domain().reverse()) + .enter().append("g") + .attr("class", "legend") + .attr("transform", function (d, i) { return "translate(0," + i * 20 + ")"; }); + + legend.append("rect") + .attr("x", width - 18) + .attr("width", 18) + .attr("height", 18) + .style("fill", color); + + legend.append("text") + .attr("x", width - 24) + .attr("y", 9) + .attr("dy", ".35em") + .style("text-anchor", "end") + .text(function (d) { return d; }); + + }); +} + +// example from http://bl.ocks.org/3886394 +function normalizedBarChart() { + var margin = { top: 20, right: 100, bottom: 30, left: 40 }, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + var x = d3.scale.ordinal() + .rangeRoundBands([0, width], .1); + + var y = d3.scale.linear() + .rangeRound([height, 0]); + + var color = d3.scale.ordinal() + .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom"); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left") + .tickFormat(d3.format(".0%")); + + var svg = d3.select("body").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + d3.csv("data.csv", function (error, data) { + color.domain(d3.keys(data[0]).filter(function (key) { return key !== "State"; })); + + data.forEach(function (d) { + var y0 = 0; + d.ages = color.domain().map(function (name) { return { name: name, y0: y0, y1: y0 += +d[name] }; }); + d.ages.forEach(function (d) { d.y0 /= y0; d.y1 /= y0; }); + }); + + data.sort(function (a, b) { return b.ages[0].y1 - a.ages[0].y1; }); + + x.domain(data.map(function (d) { return d.State; })); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .call(yAxis); + + var state = svg.selectAll(".state") + .data(data) + .enter().append("g") + .attr("class", "state") + .attr("transform", function (d) { return "translate(" + x(d.State) + ",0)"; }); + + state.selectAll("rect") + .data(function (d) { return d.ages; }) + .enter().append("rect") + .attr("width", x.rangeBand()) + .attr("y", function (d) { return y(d.y1); }) + .attr("height", function (d) { return y(d.y0) - y(d.y1); }) + .style("fill", function (d) { return color(d.name); }); + + var legend = svg.select(".state:last-child").selectAll(".legend") + .data(function (d) { return d.ages; }) + .enter().append("g") + .attr("class", "legend") + .attr("transform", function (d) { return "translate(" + x.rangeBand() / 2 + "," + y((d.y0 + d.y1) / 2) + ")"; }); + + legend.append("line") + .attr("x2", 10); + + legend.append("text") + .attr("x", 13) + .attr("dy", ".35em") + .text(function (d) { return d.name; }); + + }); +} + +// example from http://bl.ocks.org/3885705 +function sortablebarChart() { + var margin = { top: 20, right: 20, bottom: 30, left: 40 }, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + var formatPercent = d3.format(".0%"); + + var x = d3.scale.ordinal() + .rangeRoundBands([0, width], .1, 1); + + var y = d3.scale.linear() + .range([height, 0]); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom"); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left") + .tickFormat(formatPercent); + + var svg = d3.select("body").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + d3.tsv("data.tsv", function (error, data) { + + data.forEach(function (d) { + d.frequency = +d.frequency; + }); + + x.domain(data.map(function (d) { return d.letter; })); + y.domain([0, d3.max(data, function (d) { return d.frequency; })]); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Frequency"); + + svg.selectAll(".bar") + .data(data) + .enter().append("rect") + .attr("class", "bar") + .attr("x", function (d) { return x(d.letter); }) + .attr("width", x.rangeBand()) + .attr("y", function (d) { return y(d.frequency); }) + .attr("height", function (d) { return height - y(d.frequency); }); + + d3.select("input").on("change", change); + + var sortTimeout = setTimeout(function () { + d3.select("input").property("checked", true).each(change); + }, 2000); + + function change() { + clearTimeout(sortTimeout); + + var x0 = x.domain(data.sort(this.checked + ? function (a, b) { return b.frequency - a.frequency; } + : function (a, b) { return d3.ascending(a.letter, b.letter); }) + .map(function (d) { return d.letter; })) + .copy(); + + var transition = svg.transition().duration(750), + delay = function (d, i) { return i * 50; }; + + transition.selectAll(".bar") + .delay(delay) + .attr("x", function (d) { return x0(d.letter); }); + + transition.select(".x.axis") + .call(xAxis) + .selectAll("g") + .delay(delay); + } + }); +} + +//example from http://bl.ocks.org/4063318 +function callenderView() { + var width = 960, + height = 136, + cellSize = 17; // cell size + + var day = d3.time.format("%w"), + week = d3.time.format("%U"), + percent = d3.format(".1%"), + format = d3.time.format("%Y-%m-%d"); + + var color = d3.scale.quantize() + .domain([-.05, .05]) + .range(d3.range(11).map(function (d) { return "q" + d + "-11"; })); + + var svg = d3.select("body").selectAll("svg") + .data(d3.range(1990, 2011)) + .enter().append("svg") + .attr("width", width) + .attr("height", height) + .attr("class", "RdYlGn") + .append("g") + .attr("transform", "translate(" + ((width - cellSize * 53) / 2) + "," + (height - cellSize * 7 - 1) + ")"); + + svg.append("text") + .attr("transform", "translate(-6," + cellSize * 3.5 + ")rotate(-90)") + .style("text-anchor", "middle") + .text(function (d) { return d; }); + + var rect = svg.selectAll(".day") + .data(function (d) { return d3.time.days(new Date(d, 0, 1), new Date(d + 1, 0, 1)); }) + .enter().append("rect") + .attr("class", "day") + .attr("width", cellSize) + .attr("height", cellSize) + .attr("x", function (d) { return parseInt(week(d)) * cellSize; }) + .attr("y", function (d) { return parseInt(day(d)) * cellSize; }) + .datum(format); + + rect.append("title") + .text(function (d) { return d; }); + + svg.selectAll(".month") + .data(function (d) { return d3.time.months(new Date(d, 0, 1), new Date(d + 1, 0, 1)); }) + .enter().append("path") + .attr("class", "month") + .attr("d", monthPath); + + d3.csv("dji.csv", function (error, csv) { + var data = d3.nest() + .key(function (d) { return d.Date; }) + .rollup(function (d) { return (d[0].Close - d[0].Open) / d[0].Open; }) + .map(csv); + + rect.filter(function (d) { return d in data; }) + .attr("class", function (d) { return "day " + color(data[d]); }) + .select("title") + .text(function (d) { return d + ": " + percent(data[d]); }); + }); + + function monthPath(t0) { + var t1 = new Date(t0.getFullYear(), t0.getMonth() + 1, 0), + d0 = +day(t0), w0 = +week(t0), + d1 = +day(t1), w1 = +week(t1); + return "M" + (w0 + 1) * cellSize + "," + d0 * cellSize + + "H" + w0 * cellSize + "V" + 7 * cellSize + + "H" + w1 * cellSize + "V" + (d1 + 1) * cellSize + + "H" + (w1 + 1) * cellSize + "V" + 0 + + "H" + (w0 + 1) * cellSize + "Z"; + } + + d3.select(self.frameElement).style("height", "2910px"); +} diff --git a/d3/d3.d.ts b/d3/d3.d.ts index 10b084d8c6..64e4b6f84b 100644 --- a/d3/d3.d.ts +++ b/d3/d3.d.ts @@ -1,387 +1,464 @@ -interface ID3Selectors { - select: (selector: string) => ID3Selection; - selectAll: (selector: string) => ID3Selection; -} - -interface ID3behavior -{ - drag: () => any; - zoom: () => any; -} - -interface ID3event -{ - dx: number; - dy: number; - clientX: number; - clientY: number; - translate:number[]; - scale: number; - sourceEvent: ID3event; -} - -interface ID3Base extends ID3Selectors { - // behavior - behavior: ID3behavior; - event: ID3event; - // Array Helpers - ascending: (a: number, b: number) => number; - descending: (a: number, b: number) => number; - min: (arr: any[], map?: (v: any) => any ) => any; - max: (arr: any[], map?: (v: any) => any ) => any; - extent: (arr: any[], map?: (v: any) => any ) => any[]; - quantile: (arr: number[], p: number) => number; - bisectLeft: (arr: any[], x: any, low?: number, high?: number) => number; - bisect: (arr: any[], x: any, low?: number, high?: number) => number; - bisectRight: (arr: any[], x: any, low?: number, high?: number) => number; - first: (arr: any[], comparator: (a: any, b: any) => any ) => any; - last: (arr: any[], comparator: (a: any, b:any) => any ) => any; - - // Loading resources - xhr: { - (url: string, callback: (xhr: XMLHttpRequest) => void): void; - (url: string, mime: string, callback: (xhr: XMLHttpRequest) => void): void; - }; - text: { - (url: string, callback: (response: string) => void): void; - (url: string, mime: string, callback: (response: string) => void): void; - }; - json: (url: string, callback: (response: any) => void) => void; - xml: { - (url: string, callback: (response: Document) => void): void; - (url: string, mime: string, callback: (response: Document) => void): void; - }; - html: (url: string, callback: (response: DocumentFragment) => void) => void; - csv: { - (url: string, callback: (error: any, response: any[]) => void); - parse(string: string): any[]; - parseRows(string: string, accessor: (row: any[], index: number) => any): any; - format(rows: any[]): string; - }; - - time: ID3Time; - scale: { - linear(): ID3LinearScale; - ordinal(): ID3OrdinalScale; - category10(): ID3OrdinalScale; - category20(): ID3OrdinalScale; - category20b(): ID3OrdinalScale; - category20c(): ID3OrdinalScale; - }; - interpolate: ID3BaseInterpolate; - interpolateNumber: ID3BaseInterpolate; - interpolateRound: ID3BaseInterpolate; - interpolateString: ID3BaseInterpolate; - interpolateRgb: ID3BaseInterpolate; - interpolateHsl: ID3BaseInterpolate; - interpolateArray: ID3BaseInterpolate; - interpolateObject: ID3BaseInterpolate; - interpolateTransform: ID3BaseInterpolate; - layout: ID3Layout; - svg: ID3Svg; - random: ID3Random; - keys(map: Object): any[]; -} - -interface ID3Selection extends ID3Selectors { - attr: { - (name: string): string; - (name: string, value: any): ID3Selection; - (name: string, valueFunction: (data: any, index: number) => any): ID3Selection; - }; - - classed: { - (name: string): string; - (name: string, value: any): ID3Selection; - (name: string, valueFunction: (data: any, index: number) => any): ID3Selection; - }; - - style: { - (name: string): string; - (name: string, value: any, priority?: string): ID3Selection; - (name: string, valueFunction: (data: any, index: number) => any, priority?: string): ID3Selection; - }; - - property: { - (name: string): void; - (name: string, value: any): ID3Selection; - (name: string, valueFunction: (data: any, index: number) => any): ID3Selection; - }; - - text: { - (): string; - (value: any): ID3Selection; - (valueFunction: (data: any, index: number) => any): ID3Selection; - }; - - html: { - (): string; - (value: any): ID3Selection; - (valueFunction: (data: any, index: number) => any): ID3Selection; - }; - - append: (name: string) => ID3Selection; - insert: (name: string, before: string) => ID3Selection; - remove: () => ID3Selection; - - data: { - (values: (data: any, index: number) => any) : any; - (values: any[], key?: (data: any, index: number) => any): ID3UpdateSelection; - }; - - call(callback: (selection: ID3Selection) => void): ID3Selection; -} - -interface ID3EnterSelection { - append: (name: string) => ID3Selection; - insert: (name: string, before: string) => ID3Selection; - select: (selector: string) => ID3Selection; - empty: () => bool; - node: () => Node; -} - -interface ID3UpdateSelection extends ID3Selection { - enter: () => ID3EnterSelection; - update: () => ID3Selection; - exit: () => ID3Selection; -} - -interface ID3Time { - second: ID3Interval; - minute: ID3Interval; - hour: ID3Interval; - day: ID3Interval; - week: ID3Interval; - sunday: ID3Interval; - monday: ID3Interval; - tuesday: ID3Interval; - wednesday: ID3Interval; - thursday: ID3Interval; - friday: ID3Interval; - saturday: ID3Interval; - month: ID3Interval; - year: ID3Interval; - - seconds: ID3Range; - minutes: ID3Range; - hours: ID3Range; - days: ID3Range; - weeks: ID3Range; - months: ID3Range; - years: ID3Range; - - sundays: ID3Range; - mondays: ID3Range; - tuesdays: ID3Range; - wednesdays: ID3Range; - thursdays: ID3Range; - fridays: ID3Range; - saturdays: ID3Range; - format: { - - (specifier: string): ID3TimeFormat; - utc: (specifier: string) => ID3TimeFormat; - iso: ID3TimeFormat; - }; - - scale(): ID3TimeScale; -} - -interface ID3Range { - (start: Date, end: Date, step?: number): Date[]; -} - -interface ID3Interval { - (date: Date): Date; - floor: (date: Date) => Date; - round: (date: Date) => Date; - ceil: (date: Date) => Date; - range: ID3Range; - offset: (date: Date, step: number) => Date; - utc: ID3Interval; -} - -interface ID3TimeFormat { - (date: Date): string; - parse: (string: string) => Date; -} - -interface ID3LinearScale { - (value: number): number; - invert(value: number): number; - domain(numbers: any[]): ID3LinearScale; - range: { - (values: any[]): ID3LinearScale; - (): any[]; - }; - rangeRound: (values: any[]) => ID3LinearScale; - interpolate: { - (): ID3Interpolate; - (factory: ID3Interpolate): ID3LinearScale; - }; - clamp(clamp: bool): ID3LinearScale; - nice(): ID3LinearScale; - ticks(count: number): any[]; - tickFormat(count: number): (n: number) => string; - copy: ID3LinearScale; -} - -interface ID3OrdinalScale { - (value: any): any; - domain(values: any[]): ID3OrdinalScale; - range: { - (values: any[]): ID3OrdinalScale; - (): any[]; - }; - rangePoints(interval: any[], padding?: number): ID3OrdinalScale; - rangeBands(interval: any[], padding?: number, outerPadding?: number): ID3OrdinalScale; - rangeRoundBands(interval: any[], padding?: number, outerPadding?: number): ID3OrdinalScale; - rangeBand(): any[]; - rangeExtent(): any[]; - copy: ID3OrdinalScale; -} - -interface ID3TimeScale { - (value: Date): number; - invert(value: number): Date; - domain(numbers: any[]): ID3TimeScale; - range: { - (values: any[]): ID3TimeScale; - (): any[]; - }; - rangeRound: (values: any[]) => ID3TimeScale; - interpolate: { - (): ID3Interpolate; - (factory: ID3InterpolateFactory): ID3TimeScale; - }; - clamp(clamp: bool): ID3TimeScale; - ticks: { - (count: number): any[]; - (range: ID3Range, count: number): any[]; - }; - tickFormat(count: number): (n: number) => string; - copy(): ID3TimeScale; -} - -interface ID3InterpolateFactory { - (a: any, b: any): ID3BaseInterpolate; -} -interface ID3BaseInterpolate { - (a: any, b: any): ID3Interpolate; -} - -interface ID3Interpolate { - (t: number): number; -} - -interface ID3Layout { - stack(): ID3StackLayout; - pie(): ID3PieLayout; -} - -interface ID3StackLayout { - (layers: any[], index?: number): any[]; - values(accessor?: (d: any) => any): ID3StackLayout; - offset(offset: string): ID3StackLayout; -} - -interface ID3PieLayout { - (values: any[], index?: number): ID3ArcDescriptor[]; - value: { - (): (d: any, index: number) => number; - (accessor: (d: any, index: number) => number): ID3PieLayout; - }; - sort: { - (): (d1: any, d2: any) => number; - (comparator: (d1: any, d2: any) => number): ID3PieLayout; - }; - startAngle: { - (): number; - (angle: number): ID3SvgArc; - (angle: () => number): ID3SvgArc; - }; - endAngle: { - (): number; - (angle: number): ID3SvgArc; - (angle: () => number): ID3SvgArc; - }; -} - -interface ID3ArcDescriptor { - value: any; - data: any; - startAngle: number; - endAngle: number; -} - -interface ID3SVGSymbol -{ - type: (string) => ID3SVGSymbol; - size: (number) => ID3SVGSymbol; -} - -interface ID3Svg { - symbol: ()=> ID3SVGSymbol; - axis(): ID3SvgAxis; - arc(): ID3SvgArc; -} - -interface ID3SvgAxis { - (selection: ID3Selection): void; - scale: { - (): any; - (scale: any): ID3SvgAxis; - }; - - orient: { - (): string; - (orientation: string): ID3SvgAxis; - }; - - ticks: { - (count: number): ID3SvgAxis; - (range: ID3Range, count?: number): ID3SvgAxis; - }; - - tickSubdivide(count: number): ID3SvgAxis; - tickSize(major?: number, minor?: number, end?: number): ID3SvgAxis; - tickFormat(formatter: (value: any) => string): ID3SvgAxis; -} - -interface ID3SvgArc { - (options?: ID3SvgArcOptions): string; - innerRadius: { - (): number; - (radius: number): ID3SvgArc; - (radius: () => number): ID3SvgArc; - }; - outerRadius: { - (): number; - (radius: number): ID3SvgArc; - (radius: () => number): ID3SvgArc; - }; - startAngle: { - (): number; - (angle: number): ID3SvgArc; - (angle: () => number): ID3SvgArc; - }; - endAngle: { - (): number; - (angle: number): ID3SvgArc; - (angle: () => number): ID3SvgArc; - }; - centroid(options?: ID3SvgArcOptions): number[]; -} - -interface ID3SvgArcOptions { - innerRadius?: number; - outerRadius?: number; - startAngle?: number; - endAngle?: number; -} - -interface ID3Random { - normal(mean?: number, deviation?: number): () => number; -} - -declare var d3: ID3Base; +interface ID3Selectors { + select: { + (selector: string): ID3Selection; + (element: Element): ID3Selection; + }; + selectAll: { + (selector: string): ID3Selection; + (elements: Element[]): ID3Selection; + }; +} + +interface ID3behavior +{ + drag: () => any; + zoom: () => any; +} + +interface ID3event +{ + dx: number; + dy: number; + clientX: number; + clientY: number; + translate:number[]; + scale: number; + sourceEvent: ID3event; +} + +interface ID3Base extends ID3Selectors { + // behavior + behavior: ID3behavior; + event: ID3event; + // Array Helpers + ascending: (a: number, b: number) => number; + descending: (a: number, b: number) => number; + min: (arr: any[], map?: (v: any) => any ) => any; + max: (arr: any[], map?: (v: any) => any ) => any; + extent: (arr: any[], map?: (v: any) => any ) => any[]; + quantile: (arr: number[], p: number) => number; + bisectLeft: (arr: any[], x: any, low?: number, high?: number) => number; + bisect: (arr: any[], x: any, low?: number, high?: number) => number; + bisectRight: (arr: any[], x: any, low?: number, high?: number) => number; + first: (arr: any[], comparator: (a: any, b: any) => any ) => any; + last: (arr: any[], comparator: (a: any, b: any) => any) => any; + range:(start: number, stop?: number, step?: number) => number[]; + + // Loading resources + xhr: { + (url: string, callback: (xhr: XMLHttpRequest) => void): void; + (url: string, mime: string, callback: (xhr: XMLHttpRequest) => void): void; + }; + text: { + (url: string, callback: (response: string) => void): void; + (url: string, mime: string, callback: (response: string) => void): void; + }; + json: (url: string, callback: (response: any) => void) => void; + xml: { + (url: string, callback: (response: Document) => void): void; + (url: string, mime: string, callback: (response: Document) => void): void; + }; + html: (url: string, callback: (response: DocumentFragment) => void) => void; + csv: { + (url: string, callback: (error: any, response: any[]) => void); + parse(string: string): any[]; + parseRows(string: string, accessor: (row: any[], index: number) => any): any; + format(rows: any[]): string; + }; + tsv: { + (url: string, callback: (error: any, response: any[]) => void ); + parse(string: string): any[]; + parseRows(string: string, accessor: (row: any[], index: number) => any): any; + format(rows: any[]): string; + }; + + time: ID3Time; + scale: { + linear(): ID3LinearScale; + ordinal(): ID3OrdinalScale; + quantize(): ID3QuantizeScale; + category10(): ID3OrdinalScale; + category20(): ID3OrdinalScale; + category20b(): ID3OrdinalScale; + category20c(): ID3OrdinalScale; + }; + interpolate: ID3BaseInterpolate; + interpolateNumber: ID3BaseInterpolate; + interpolateRound: ID3BaseInterpolate; + interpolateString: ID3BaseInterpolate; + interpolateRgb: ID3BaseInterpolate; + interpolateHsl: ID3BaseInterpolate; + interpolateArray: ID3BaseInterpolate; + interpolateObject: ID3BaseInterpolate; + interpolateTransform: ID3BaseInterpolate; + layout: ID3Layout; + svg: ID3Svg; + random: ID3Random; + keys(map: Object): any[]; + + format(specifier: string): (value: number) => string; + + nest(): ID3Nest; +} + +interface ID3Selection extends ID3Selectors { + attr: { + (name: string): string; + (name: string, value: any): ID3Selection; + (name: string, valueFunction: (data: any, index: number) => any): ID3Selection; + }; + + classed: { + (name: string): string; + (name: string, value: any): ID3Selection; + (name: string, valueFunction: (data: any, index: number) => any): ID3Selection; + }; + + style: { + (name: string): string; + (name: string, value: any, priority?: string): ID3Selection; + (name: string, valueFunction: (data: any, index: number) => any, priority?: string): ID3Selection; + }; + + property: { + (name: string): void; + (name: string, value: any): ID3Selection; + (name: string, valueFunction: (data: any, index: number) => any): ID3Selection; + }; + + text: { + (): string; + (value: any): ID3Selection; + (valueFunction: (data: any, index: number) => any): ID3Selection; + }; + + html: { + (): string; + (value: any): ID3Selection; + (valueFunction: (data: any, index: number) => any): ID3Selection; + }; + + append: (name: string) => ID3Selection; + insert: (name: string, before: string) => ID3Selection; + remove: () => ID3Selection; + + data: { + (values: (data: any, index: number) => any): ID3UpdateSelection; + (values: any[], key?: (data: any, index: number) => any): ID3UpdateSelection; + }; + + datum: { + (values: (data: any, index: number) => any): ID3UpdateSelection; + (values: any): ID3UpdateSelection; + }; + + filter: { + (filter: (data: any, index: number) => bool): ID3UpdateSelection; + (filter: string): ID3UpdateSelection; + }; + + call(callback: (selection: ID3Selection) => void ): ID3Selection; + each(eachFunction: (data: any, index: number) => any): ID3Selection; + on: { + (type: string): (data: any, index: number) => any; + (type: string, listener: (data: any, index: number) => any, capture?: bool): ID3Selection; + }; + + transition: () => ID3Transition; +} + +interface ID3EnterSelection { + append: (name: string) => ID3Selection; + insert: (name: string, before: string) => ID3Selection; + select: (selector: string) => ID3Selection; + empty: () => bool; + node: () => Node; +} + +interface ID3UpdateSelection extends ID3Selection { + enter: () => ID3EnterSelection; + update: () => ID3Selection; + exit: () => ID3Selection; +} + +interface ID3Transition { + duration: { + (duration: number): ID3Transition; + (duration: (data: any, index: number) => any): ID3Transition; + }; + delay: { + (delay: number): ID3Transition; + (delay: (data: any, index: number) => any): ID3Transition; + }; + attr: { + (name: string): string; + (name: string, value: any): ID3Transition; + (name: string, valueFunction: (data: any, index: number) => any): ID3Transition; + }; + call(callback: (selection: ID3Selection) => void ): ID3Transition; + + select: (selector: string) => ID3Transition; + selectAll: (selector: string) => ID3Transition; +} + +interface ID3Nest { + key(keyFunction: (data: any, index: number) => any): ID3Nest; + rollup(rollupFunction: (data: any, index: number) => any): ID3Nest; + map(values: any[]): ID3Nest; +} + +interface ID3Time { + second: ID3Interval; + minute: ID3Interval; + hour: ID3Interval; + day: ID3Interval; + week: ID3Interval; + sunday: ID3Interval; + monday: ID3Interval; + tuesday: ID3Interval; + wednesday: ID3Interval; + thursday: ID3Interval; + friday: ID3Interval; + saturday: ID3Interval; + month: ID3Interval; + year: ID3Interval; + + seconds: ID3Range; + minutes: ID3Range; + hours: ID3Range; + days: ID3Range; + weeks: ID3Range; + months: ID3Range; + years: ID3Range; + + sundays: ID3Range; + mondays: ID3Range; + tuesdays: ID3Range; + wednesdays: ID3Range; + thursdays: ID3Range; + fridays: ID3Range; + saturdays: ID3Range; + format: { + + (specifier: string): ID3TimeFormat; + utc: (specifier: string) => ID3TimeFormat; + iso: ID3TimeFormat; + }; + + scale(): ID3TimeScale; +} + +interface ID3Range { + (start: Date, end: Date, step?: number): Date[]; +} + +interface ID3Interval { + (date: Date): Date; + floor: (date: Date) => Date; + round: (date: Date) => Date; + ceil: (date: Date) => Date; + range: ID3Range; + offset: (date: Date, step: number) => Date; + utc: ID3Interval; +} + +interface ID3TimeFormat { + (date: Date): string; + parse: (string: string) => Date; +} + +interface ID3LinearScale { + (value: number): number; + invert(value: number): number; + domain(numbers: any[]): ID3LinearScale; + range: { + (values: any[]): ID3LinearScale; + (): any[]; + }; + rangeRound: (values: any[]) => ID3LinearScale; + interpolate: { + (): ID3Interpolate; + (factory: ID3Interpolate): ID3LinearScale; + }; + clamp(clamp: bool): ID3LinearScale; + nice(): ID3LinearScale; + ticks(count: number): any[]; + tickFormat(count: number): (n: number) => string; + copy: ID3LinearScale; +} + +interface ID3OrdinalScale { + (value: any): any; + domain: { + (values: any[]): ID3OrdinalScale; + (): any[]; + }; + range: { + (values: any[]): ID3OrdinalScale; + (): any[]; + }; + rangePoints(interval: any[], padding?: number): ID3OrdinalScale; + rangeBands(interval: any[], padding?: number, outerPadding?: number): ID3OrdinalScale; + rangeRoundBands(interval: any[], padding?: number, outerPadding?: number): ID3OrdinalScale; + rangeBand(): number; + rangeExtent(): any[]; + copy: ID3OrdinalScale; +} + +interface ID3QuantizeScale { + (value: any): any; + domain: { + (values: number[]): ID3QuantizeScale; + (): any[]; + }; + range: { + (values: any[]): ID3QuantizeScale; + (): any[]; + }; + copy: ID3QuantizeScale; +} + +interface ID3TimeScale { + (value: Date): number; + invert(value: number): Date; + domain(numbers: any[]): ID3TimeScale; + range: { + (values: any[]): ID3TimeScale; + (): any[]; + }; + rangeRound: (values: any[]) => ID3TimeScale; + interpolate: { + (): ID3Interpolate; + (factory: ID3InterpolateFactory): ID3TimeScale; + }; + clamp(clamp: bool): ID3TimeScale; + ticks: { + (count: number): any[]; + (range: ID3Range, count: number): any[]; + }; + tickFormat(count: number): (n: number) => string; + copy(): ID3TimeScale; +} + +interface ID3InterpolateFactory { + (a: any, b: any): ID3BaseInterpolate; +} +interface ID3BaseInterpolate { + (a: any, b: any): ID3Interpolate; +} + +interface ID3Interpolate { + (t: number): number; +} + +interface ID3Layout { + stack(): ID3StackLayout; + pie(): ID3PieLayout; +} + +interface ID3StackLayout { + (layers: any[], index?: number): any[]; + values(accessor?: (d: any) => any): ID3StackLayout; + offset(offset: string): ID3StackLayout; +} + +interface ID3PieLayout { + (values: any[], index?: number): ID3ArcDescriptor[]; + value: { + (): (d: any, index: number) => number; + (accessor: (d: any, index: number) => number): ID3PieLayout; + }; + sort: { + (): (d1: any, d2: any) => number; + (comparator: (d1: any, d2: any) => number): ID3PieLayout; + }; + startAngle: { + (): number; + (angle: number): ID3SvgArc; + (angle: () => number): ID3SvgArc; + }; + endAngle: { + (): number; + (angle: number): ID3SvgArc; + (angle: () => number): ID3SvgArc; + }; +} + +interface ID3ArcDescriptor { + value: any; + data: any; + startAngle: number; + endAngle: number; +} + +interface ID3SVGSymbol +{ + type: (string) => ID3SVGSymbol; + size: (number) => ID3SVGSymbol; +} + +interface ID3Svg { + symbol: ()=> ID3SVGSymbol; + axis(): ID3SvgAxis; + arc(): ID3SvgArc; +} + +interface ID3SvgAxis { + (selection: ID3Selection): void; + scale: { + (): any; + (scale: any): ID3SvgAxis; + }; + + orient: { + (): string; + (orientation: string): ID3SvgAxis; + }; + + ticks: { + (count: number): ID3SvgAxis; + (range: ID3Range, count?: number): ID3SvgAxis; + }; + + tickSubdivide(count: number): ID3SvgAxis; + tickSize(major?: number, minor?: number, end?: number): ID3SvgAxis; + tickFormat(formatter: (value: any) => string): ID3SvgAxis; +} + +interface ID3SvgArc { + (options?: ID3SvgArcOptions): string; + innerRadius: { + (): number; + (radius: number): ID3SvgArc; + (radius: () => number): ID3SvgArc; + }; + outerRadius: { + (): number; + (radius: number): ID3SvgArc; + (radius: () => number): ID3SvgArc; + }; + startAngle: { + (): number; + (angle: number): ID3SvgArc; + (angle: () => number): ID3SvgArc; + }; + endAngle: { + (): number; + (angle: number): ID3SvgArc; + (angle: () => number): ID3SvgArc; + }; + centroid(options?: ID3SvgArcOptions): number[]; +} + +interface ID3SvgArcOptions { + innerRadius?: number; + outerRadius?: number; + startAngle?: number; + endAngle?: number; +} + +interface ID3Random { + normal(mean?: number, deviation?: number): () => number; +} + +declare var d3: ID3Base;