Что вам нужно сделать, это остановить силу и применить преобразование существующих узлов к xy, полученному из другого макета.Таким образом, ваша функция будет выглядеть следующим образом:
force.stop();
d3.selectAll("g.nodes").transtion().duration(500)
.attr("translate","transform("+newLayoutX+","+newLayoutY+")"
Затем выполните итерацию по массиву узлов и установите значения x
, y
, px
, py
для отражения новых X
иY
.Это позволит вашим узлам знать текущую позицию x
и y
для раскладки сил при запуске force.start()
. Вы можете взглянуть на функцию plotLayout()
в этом примере:
https://gist.github.com/emeeks/4588962
Однако это не зависит от второго d3.layout.Проблема, с которой вы столкнетесь, заключается в том, что вам нужен иерархический набор данных для макета дерева, который требует от вас преобразования ваших узлов и данных ребер в массив node.children, как и ожидалось в иерархических макетах.Я бы сделал это, скопировав набор данных и вручную выровняв его, но может быть более элегантное решение, о котором я не знаю.