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>
var width = 960;
var height = 500;
var radius = 5;
var colors = d3.scaleOrdinal(d3.schemeCategory10);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
d3.json('miserables.json', function(err,data){
//position each node with group
var preRow = 4;
data.nodes.forEach(function(node){
node.focusX = (node.group % preRow) *100;
node.focusY = 0;
});
console.log(data.nodes)
var simulation = d3.forceSimulation(data.nodes)
.force('center', d3.forceCenter(width/2, height/2))
.force('attraction', d3.forceManyBody().strength(-5))
//.force('collide', d3.forceCollide(radius + .5))
.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}))
.on('tick', ticked);
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)});
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.source.y});
}
});
</script>
</body>
https://d3js.org/d3.v4.min.js