forked from d3noob's block: IVR from JSON
Using the suggestions for creating circles from VividD on StackOverflow.
forked from kmbenitez's block: Sankey modifications
forked from kmbenitez's block: Sankey modifications
xxxxxxxxxx
<meta charset="utf-8">
<title>SANKEY Experiment</title>
<style>
.node rect {
cursor: move;
fill-opacity: .9;
shape-rendering: crispEdges;
}
.node text {
pointer-events: none;
text-shadow: 0 1px 0 #fff;
}
.link {
fill: none;
stroke: #000;
stroke-opacity: .2;
}
.link:hover {
stroke-opacity: .5;
}
</style>
<body>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>
<script src="sankey.js"></script>
<script>
var units = "calls";
// set the dimensions and margins of the graph
var margin = {top: 10, right: 10, bottom: 10, left: 10},
width = 2700 - margin.left - margin.right,
height = 2000 - margin.top - margin.bottom;
var formatNumber = d3.format(",.0f"), // zero decimal places
format = function(d) { return formatNumber(d) + " " + units; },
formatPercent = d3.format(",.5f"),
ratetoPercent = function(d) { return formatPercent(100 * d) + "%"; };
// append the svg object to the body of the page
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 + ")");
// Set the sankey diagram properties
var sankey = d3.sankey()
.nodeWidth(10)
.nodePadding(15)
.size([width, height]);
var path = function(d) {
return linkVertical({"x":d.source.x + sankey.nodeWidth() / 2,
"y":d.source.y + d.source.dy / 2},
{"x":d.target.x + sankey.nodeWidth() / 2,
"y":d.target.y + d.target.dy / 2});
};
// Creates a curved (diagonal) path from parent to the child nodes
function linkHorizontal(source, target) {
return "M" + source.x + "," + source.y
+ "C" + source.x + "," + (source.y + target.y) / 2
+ " " + target.x + "," + (source.y + target.y) / 2
+ " " + target.x + "," + target.y;
}
function linkVertical(source, target) {
return "M" + source.x + "," + source.y
+ "C" + (source.x + target.x) / 2 + "," + source.y
+ " " + (source.x + target.x) / 2 + "," + target.y
+ " " + target.x + "," + target.y;
}
//var path = sankey.link();
// load the data
d3.json("albany04.json", function(error, graph) {
sankey
.nodes(graph.nodes)
.links(graph.links)
.layout(56);
// add in the links
var link = svg.append("g").selectAll(".link")
.data(graph.links)
.enter().append("path")
.attr("class", "link")
.attr("d", path)
.style("stroke-width", function(d) { return Math.max(1, Math.sqrt(d.dy)); })
.sort(function(a, b) { return b.dy - a.dy; });
// add the link titles
link.append("title")
.text(function(d) {
return d.source.name + " → " +
d.target.name + "\n" + format(d.value) +
(d.capturedigit_digit == "0" ?
"" : ("\nKeypress: " + d.capturedigit_digit)); });
// add in the nodes
var node = svg.append("g").selectAll(".node")
.data(graph.nodes)
.enter().append("g")
.attr("class", "node")
.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")"; })
.call(d3.drag()
.subject(function(d) {
return d;
})
.on("start", function() {
this.parentNode.appendChild(this);
})
.on("drag", dragmove));
// add the circles for the nodes
node.append("circle")
.attr("cx", sankey.nodeWidth()/2)
.attr("cy", function(d) {
return d.dy/2;
})
.attr("r", function(d) {
return Math.sqrt(d.dy);
})
.style("fill", function(d) {
return d.color = d3.interpolateRdYlGn(1 - d.hanguprate); })
.style("stroke", function(d) {
return d3.rgb(d.color).darker(2); })
.append("title")
.text(function(d) {
return d.name + "\n" + format(d.value) + "\n" + ratetoPercent(d.repeatrate) +" repeated\n" + ratetoPercent(d.hanguprate) + " hung up";});
// add in the title for the nodes
node.append("text")
.attr("x", -6)
.attr("y", function(d) { return d.dy / 2; })
.attr("dy", ".35em")
.attr("text-anchor", "end")
.attr("transform", null)
.text(function(d) { return d.name; })
.filter(function(d) { return d.x < width / 2; })
.attr("x", function(d) { return 6 + sankey.nodeWidth() + Math.sqrt(d.dy);})
.attr("text-anchor", "start");
// the function for moving the nodes
function dragmove(d) {
d3.select(this)
.attr("transform",
"translate("
+ d.x + ","
+ (d.y = Math.max(
0, Math.min(height - d.dy, d3.event.y))
) + ")");
sankey.relayout();
link.attr("d", path);
}
});
</script>
</body>
https://d3js.org/d3.v4.min.js
https://d3js.org/d3-scale-chromatic.v1.min.js