xxxxxxxxxx
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
</style>
</head>
<body>
<script>
/*if we just want to link nodes and position them,
don't use force link, instead create a link function and use focusX and focusY and force collide*/
// Feel free to change or delete any of the code you see in this editor!
var width = 960;
var height = 500;
var radius = 5;
var colors =d3.scaleOrdinal(d3.schemeCategory10);
var drag = d3.drag()
.on('start', function() {
if(!d3.event.active){
simulations.alphaTarget(0.35).restart();
}
})
.on('drag', function(){
d3.event.subject.fx = d3.event.x;
d3.event.subject.fy = d3.event.y;
})
.on('end', function(){
simulations.alphaTarget(0);
d3.event.subject.fx = null;
de.event.subject.fy = null;
});
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
d3.json('miserables.json', function(err, data){
// console.log(data.links);
//position node with their group
var perRow = 2;
data.nodes.forEach(function(node){
node.focusX = (node.group % perRow)* 100;
node.focusY = Math.floor(node.group/ perRow) * 100;
});
data.links.forEach(function(link) {
link.source = data.nodes.find(function(node) {return node.id === link.source});
link.target = data.nodes.find(function(node) {return node.id === link.target});
});
// one tick it's one iteration
var simulations = d3.forceSimulation(data.nodes)
.force('center', d3.forceCenter(width/2, height/2))
.force('collide', d3.forceCollide(radius + 1))
// .force('attraction', d3.forceManyBody().strength(100).distanceMin(150))
// .force('repulsion', d3.forceManyBody().strength(-100).distanceMax(150))
.force('x', d3.forceX().x(function(d){
return d.focusX
}))
.force('y', d3.forceY().y(function(d){
return d.focusY }))
// .force('links', d3.forceLink(data.links)
// .id(function(d){return d.id})
// .strength(function(d){})
.on('tick', ticked);
//create circle for each node, there's x and y got calculated each tick
var links = svg.selectAll('line')
.data(data.links, function(d){return d.source.id + ',' + d.target.id})
.enter().append('line')
.attr('stroke', '#ccc');
var circles = svg.selectAll('circle')
.data(data.nodes, function(d){return d.id})
.enter().append('circle')
.attr('r', radius)
.attr('fill', function(d){return colors(d.group)})
.call(drag)
function ticked() {
circles
.attr('cx', function(d) {return d.x})
.attr('cy', function(d) {return d.y});
links.attr('x1', function(d) {return d.source.x})
.attr('x2', function(d){return d.target.x})
.attr('y1', function(d) {return d.source.y})
.attr('y2', function(d){return d.target.y})
}
})
</script>
</body>
https://d3js.org/d3.v4.min.js