--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/toolkit/javascript/d3/examples/chord/chord.js Thu Apr 10 14:20:23 2014 +0200
@@ -0,0 +1,98 @@
+// From http://mkweb.bcgsc.ca/circos/guide/tables/
+var chord = d3.layout.chord()
+ .padding(.05)
+ .sortSubgroups(d3.descending)
+ .matrix([
+ [11975, 5871, 8916, 2868],
+ [ 1951, 10048, 2060, 6171],
+ [ 8010, 16145, 8090, 8045],
+ [ 1013, 990, 940, 6907]
+ ]);
+
+var w = 600,
+ h = 600,
+ r0 = Math.min(w, h) * .41,
+ r1 = r0 * 1.1;
+
+var fill = d3.scale.ordinal()
+ .domain(d3.range(4))
+ .range(["#000000", "#FFDD89", "#957244", "#F26223"]);
+
+var svg = d3.select("#chart")
+ .append("svg:svg")
+ .attr("width", w)
+ .attr("height", h)
+ .append("svg:g")
+ .attr("transform", "translate(" + w / 2 + "," + h / 2 + ")");
+
+svg.append("svg:g")
+ .selectAll("path")
+ .data(chord.groups)
+ .enter().append("svg:path")
+ .style("fill", function(d) { return fill(d.index); })
+ .style("stroke", function(d) { return fill(d.index); })
+ .attr("d", d3.svg.arc().innerRadius(r0).outerRadius(r1))
+ .on("mouseover", fade(.1))
+ .on("mouseout", fade(1));
+
+var ticks = svg.append("svg:g")
+ .selectAll("g")
+ .data(chord.groups)
+ .enter().append("svg:g")
+ .selectAll("g")
+ .data(groupTicks)
+ .enter().append("svg:g")
+ .attr("transform", function(d) {
+ return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")"
+ + "translate(" + r1 + ",0)";
+ });
+
+ticks.append("svg:line")
+ .attr("x1", 1)
+ .attr("y1", 0)
+ .attr("x2", 5)
+ .attr("y2", 0)
+ .style("stroke", "#000");
+
+ticks.append("svg:text")
+ .attr("x", 8)
+ .attr("dy", ".35em")
+ .attr("text-anchor", function(d) {
+ return d.angle > Math.PI ? "end" : null;
+ })
+ .attr("transform", function(d) {
+ return d.angle > Math.PI ? "rotate(180)translate(-16)" : null;
+ })
+ .text(function(d) { return d.label; });
+
+svg.append("svg:g")
+ .attr("class", "chord")
+ .selectAll("path")
+ .data(chord.chords)
+ .enter().append("svg:path")
+ .style("fill", function(d) { return fill(d.target.index); })
+ .attr("d", d3.svg.chord().radius(r0))
+ .style("opacity", 1);
+
+/** Returns an array of tick angles and labels, given a group. */
+function groupTicks(d) {
+ var k = (d.endAngle - d.startAngle) / d.value;
+ return d3.range(0, d.value, 1000).map(function(v, i) {
+ return {
+ angle: v * k + d.startAngle,
+ label: i % 5 ? null : v / 1000 + "k"
+ };
+ });
+}
+
+/** Returns an event handler for fading a given chord group. */
+function fade(opacity) {
+ return function(g, i) {
+ svg.selectAll("g.chord path")
+ .filter(function(d) {
+ return d.source.index != i && d.target.index != i;
+ })
+ .transition()
+ .style("opacity", opacity);
+ };
+}