|
|
|
@ -1,7 +1,8 @@ |
|
|
|
|
/* Define constants and size of the wheel */ |
|
|
|
|
/** Total width of the wheel (also counts for the height) */ |
|
|
|
|
|
|
|
|
|
$(document).ready(function() {
|
|
|
|
|
$(document).ready(function() { |
|
|
|
|
|
|
|
|
|
var w = 800, |
|
|
|
|
h = w, |
|
|
|
|
r = w / 2, |
|
|
|
@ -112,92 +113,88 @@ $(document).ready(function() { |
|
|
|
|
.text(function(d) { |
|
|
|
|
return d.depth ? d.name.split(" ")[1] || "" : ""; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
function click(d) { |
|
|
|
|
path.transition() |
|
|
|
|
.duration(duration) |
|
|
|
|
.attrTween("d", arcTween(d)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Somewhat of a hack as we rely on arcTween updating the scales.
|
|
|
|
|
text.style("visibility", function(e) { |
|
|
|
|
return isParentOf(d, e) ? null : d3.select(this).style("visibility"); |
|
|
|
|
}) |
|
|
|
|
.transition().duration(duration) |
|
|
|
|
.attrTween("text-anchor", function(d) { |
|
|
|
|
return function() { |
|
|
|
|
return x(d.x + d.dx / 2) > Math.PI ? "end" : "start"; |
|
|
|
|
}; |
|
|
|
|
}) |
|
|
|
|
.attrTween("transform", function(d) { |
|
|
|
|
var multiline = (d.name || "").split(" ").length > 1; |
|
|
|
|
return function() { |
|
|
|
|
var angle = x(d.x + d.dx / 2) * 180 / Math.PI - 90, |
|
|
|
|
rotate = angle + (multiline ? -.5 : 0); |
|
|
|
|
return "rotate(" + rotate + ")translate(" + (y(d.y) + p) + ")rotate(" + (angle > 90 ? -180 : 0) + ")"; |
|
|
|
|
}; |
|
|
|
|
}) |
|
|
|
|
.style("fill-opacity", function(e) { |
|
|
|
|
return isParentOf(d, e) ? 1 : 1e-6; |
|
|
|
|
}) |
|
|
|
|
.each("end", function(e) { |
|
|
|
|
d3.select(this).style("visibility", isParentOf(d, e) ? null : "hidden"); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Returns whether p is parent of c */ |
|
|
|
|
function isParentOf(p, c) { |
|
|
|
|
if (p === c) return true; |
|
|
|
|
if (p.children) { |
|
|
|
|
return p.children.some(function(d) { |
|
|
|
|
return isParentOf(d, c); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function click(d) { |
|
|
|
|
path.transition() |
|
|
|
|
.duration(duration) |
|
|
|
|
.attrTween("d", arcTween(d)); |
|
|
|
|
/* Generated random colour */ |
|
|
|
|
function colour(d) { |
|
|
|
|
if (d.children) { |
|
|
|
|
// There is a maximum of two children!
|
|
|
|
|
var colours = d.children.map(colour), |
|
|
|
|
a = d3.hsl(colours[0]), |
|
|
|
|
b = d3.hsl(colours[1]); |
|
|
|
|
// L*a*b* might be better here...
|
|
|
|
|
return d3.hsl((a.h + b.h) / 2, a.s * 1.2, a.l / 1.2); |
|
|
|
|
} |
|
|
|
|
return d.colour || "#fff"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Somewhat of a hack as we rely on arcTween updating the scales.
|
|
|
|
|
text.style("visibility", function(e) { |
|
|
|
|
return isParentOf(d, e) ? null : d3.select(this).style("visibility"); |
|
|
|
|
}) |
|
|
|
|
.transition().duration(duration) |
|
|
|
|
.attrTween("text-anchor", function(d) { |
|
|
|
|
return function() { |
|
|
|
|
return x(d.x + d.dx / 2) > Math.PI ? "end" : "start"; |
|
|
|
|
/* Interpolate the scales! */ |
|
|
|
|
function arcTween(d) { |
|
|
|
|
var my = maxY(d), |
|
|
|
|
xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]), |
|
|
|
|
yd = d3.interpolate(y.domain(), [d.y, my]), |
|
|
|
|
yr = d3.interpolate(y.range(), [d.y ? 20 : 0, r]); |
|
|
|
|
return function(d) { |
|
|
|
|
return function(t) { |
|
|
|
|
x.domain(xd(t)); |
|
|
|
|
y.domain(yd(t)).range(yr(t)); |
|
|
|
|
return arc(d); |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
}) |
|
|
|
|
.attrTween("transform", function(d) { |
|
|
|
|
var multiline = (d.name || "").split(" ").length > 1; |
|
|
|
|
return function() { |
|
|
|
|
var angle = x(d.x + d.dx / 2) * 180 / Math.PI - 90, |
|
|
|
|
rotate = angle + (multiline ? -.5 : 0); |
|
|
|
|
return "rotate(" + rotate + ")translate(" + (y(d.y) + p) + ")rotate(" + (angle > 90 ? -180 : 0) + ")"; |
|
|
|
|
}; |
|
|
|
|
}) |
|
|
|
|
.style("fill-opacity", function(e) { |
|
|
|
|
return isParentOf(d, e) ? 1 : 1e-6; |
|
|
|
|
}) |
|
|
|
|
.each("end", function(e) { |
|
|
|
|
d3.select(this).style("visibility", isParentOf(d, e) ? null : "hidden"); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Returns whether p is parent of c */ |
|
|
|
|
function isParentOf(p, c) { |
|
|
|
|
if (p === c) return true; |
|
|
|
|
if (p.children) { |
|
|
|
|
return p.children.some(function(d) { |
|
|
|
|
return isParentOf(d, c); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Generated random colour */ |
|
|
|
|
function colour(d) { |
|
|
|
|
if (d.children) { |
|
|
|
|
// There is a maximum of two children!
|
|
|
|
|
var colours = d.children.map(colour), |
|
|
|
|
a = d3.hsl(colours[0]), |
|
|
|
|
b = d3.hsl(colours[1]); |
|
|
|
|
// L*a*b* might be better here...
|
|
|
|
|
return d3.hsl((a.h + b.h) / 2, a.s * 1.2, a.l / 1.2); |
|
|
|
|
/* */ |
|
|
|
|
function maxY(d) { |
|
|
|
|
return d.children ? Math.max.apply(Math, d.children.map(maxY)) : d.y + d.dy; |
|
|
|
|
} |
|
|
|
|
return d.colour || "#fff"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Interpolate the scales! */ |
|
|
|
|
function arcTween(d) { |
|
|
|
|
var my = maxY(d), |
|
|
|
|
xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]), |
|
|
|
|
yd = d3.interpolate(y.domain(), [d.y, my]), |
|
|
|
|
yr = d3.interpolate(y.range(), [d.y ? 20 : 0, r]); |
|
|
|
|
return function(d) { |
|
|
|
|
return function(t) { |
|
|
|
|
x.domain(xd(t)); |
|
|
|
|
y.domain(yd(t)).range(yr(t)); |
|
|
|
|
return arc(d); |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* */ |
|
|
|
|
function maxY(d) { |
|
|
|
|
return d.children ? Math.max.apply(Math, d.children.map(maxY)) : d.y + d.dy; |
|
|
|
|
} |
|
|
|
|
/* Use a formula for contrasting colour |
|
|
|
|
http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
|
|
|
|
|
*/ |
|
|
|
|
function brightness(rgb) { |
|
|
|
|
return rgb.r * .299 + rgb.g * .587 + rgb.b * .114; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Use a formula for contrasting colour |
|
|
|
|
http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
|
|
|
|
|
*/ |
|
|
|
|
function brightness(rgb) { |
|
|
|
|
return rgb.r * .299 + rgb.g * .587 + rgb.b * .114; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|