body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
<script src="d3.js"></script>
<svg height="200px" width="200px"></svg>
var nodes1 = [{a: "a"}, {a: "b"}, {a: "c"}]
var nodes2 = [{a: "d"}, {a: "e"}, {a: "f"}]
.selectAll('circle.nodes1')
.data(simulation1.nodes())
.attr('transform', function(d) {
return 'translate(' + d.x + ',' + d.y + ')';
.selectAll('circle.nodes2')
.data(simulation2.nodes())
.attr('transform', function(d) {
return 'translate(' + d.x + ',' + d.y + ')';
var simulation1 = d3.forceSimulation(nodes1);
var simulation2 = d3.forceSimulation(nodes2);
var simulation3 = d3.forceSimulation(nodes1.concat(nodes2));
.force('collision', d3.forceCollide().radius(40))
.force('collision', d3.forceCollide().radius(40))
.force('link', d3.forceLink(links))
.force("center", d3.forceCenter(100, 100))
.force('xposition', d3.forceX(100).strength(0.1))
.force('yposition', d3.forceY(100).strength(0.1))
.selectAll('circle.nodes1')
.data(simulation1.nodes())
.selectAll('circle.nodes2')
.data(simulation2.nodes())
simulation1.on('tick', tick1)
simulation2.on('tick', tick2)
simulation3.on('tick', function() {
.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; });