// !preview r2d3 data = jsonlite::read_json("miserables.json"), d3_version = 4 // Based on: https://bl.ocks.org/mbostock/4063570 var width = 1500; var height = 500; var color = d3.scale.ordinal(d3.schemeCategory20); var radius = 5; var d3cola = cola.d3adaptor() .linkDistance(120) .avoidOverlaps(true) .size([width, height]); var simulation = d3.forceSimulation() .force("link", d3.forceLink().id(function(d) { return d.id; })) .force("charge", d3.forceManyBody()) .force("center", d3.forceCenter(width / 2, height / 2)); r2d3.onRender(function(graph, svg, width, height, options) { var groupMap = {}; graph.nodes.forEach(function (v, i) { var g = v.group; if (typeof groupMap[g] == 'undefined') { groupMap[g] = []; } groupMap[g].push(i); v.width = v.height = 10; }); var groups = []; for (var g in groupMap) { groups.push({ id: g, leaves: groupMap[g] }); } // simulation // .nodes(graph.nodes) // .links(graph.links) // .groups(groups) // .jaccardLinkLengths(40, 0.7) // .avoidOverlaps(true); // // .start(50, 0, 50); var group = svg.selectAll('.group') .data(groups) .enter().append('rect') .classed('group', true) .attr('rx',5) .attr('ry',5) .style("fill", function (d) { return color(d.id); }); // .call(cola.drag); var link = svg.selectAll(".link") .data(graph.links) .enter().append("line") .attr("class", "link") .style("stroke-width", function (d) { return Math.sqrt(d.value); }); var node = svg.selectAll(".node") .data(graph.nodes) .enter().append("circle") .attr("class", "node") .attr("r", 5) .style("fill", function (d) { return color(d.group); }); // .call(cola.drag); node.append("title") .text(function (d) { return d.name; }); // d3cola.on('tick', function () { // link.attr("x1", function (d) { return d.source.x; }) // .attr("y1", function (d) { return d.source.y; }) // .attr("x2", function (d) { return d.target.x; }) // .attr("y2", function (d) { return d.target.y; }); // node.attr("cx", function (d) { return d.x; }) // .attr("cy", function (d) { return d.y; }); // group // .attr('x', function (d) { return d.bounds.x }) // .attr('y', function (d) { return d.bounds.y }) // .attr('width', function (d) { return d.bounds.width() }) // .attr('height', function(d) { return d.bounds.height() }); // }); simulation .nodes(graph.nodes) .on("tick", ticked); simulation.force("link") .links(graph.links); function ticked() { //constrains the nodes to be within a box node .attr("cx", function(d) { return d.x = Math.max(radius, Math.min(width - radius, d.x)); }) .attr("cy", function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y)); }); link .attr("x1", function(d) { return d.source.x; }) .attr("y1", function(d) { return d.source.y; }) .attr("x2", function(d) { return d.target.x; }) .attr("y2", function(d) { return d.target.y; }); node .attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }); } }); // function dragstarted(d) { // if (!d3.event.active) simulation.alphaTarget(0.3).restart(); // d.fx = d.x; // d.fy = d.y; // } // // function dragged(d) { // d.fx = d3.event.x; // d.fy = d3.event.y; // } // // function dragended(d) { // if (!d3.event.active) simulation.alphaTarget(0); // d.fx = null; // d.fy = null; // }