Force Directed Graph с расширением и свертыванием (d3.js)

Я пытаюсь создать сеть Force Directed, используя d3. Набор данных представляет собой список альянсов между компаниями и выглядит следующим образом:

[ { "company1":"Microsoft", "company2":"Qualcomm Inc." }, { "company1": "Microsoft", "company2": "Qualcomm Inc." },...]

К ключевым функциям визуализации относятся:

  1. Двойной щелчок по узлу (например, по компании) должен развернуть/свернуть его сеть. (Расширенные узлы обозначены синим цветом, а нерасширенные узлы — серым).
  2. При наведении курсора на узел выделяется узел и его партнеры.
  3. При сворачивании узла, если у партнера есть другие активные ссылки на экране или он развернут, эта ссылка не должна прерываться, а этот партнер не должен удаляться.

Что у меня работает: все функции, упомянутые выше.

В чем проблема? В настоящее время я обновляю всю визуализацию и перерисовываю ее каждый раз, когда добавляется или разворачивается/сворачивается новый узел. При этом некоторые узлы перемещаются в верхний левый угол экрана, и я продолжаю получать сообщение об ошибке:

error: Invalid value for <g> attribute transform="translate(NaN,NaN)" d3.v3.min.js:1    
Error: Invalid value for <line> attribute x2="NaN" d3.v3.min.js:1    
Error: Invalid value for <line> attribute y2="NaN" d3.v3.min.js:1    
Error: Invalid value for <g> attribute transform="translate(NaN,NaN)"....

Я ссылался на другие вопросы по этой проблеме, но, к сожалению, не могу понять, почему именно это происходит в моем случае. Я заметил, что обычно это происходит, когда текущие узлы на экране все еще движутся, и я добавляю/удаляю узлы на экране.

Вот ссылка на скрипку для работающего кода: http://jsfiddle.net/bmp7qnx0/4/

(Я понимаю, что «обновление» визуализации - неправильный способ сделать это, и я работаю над кодом для реализации без перезапуска, и у меня также возникают некоторые проблемы с этим кодом - я опубликую ссылку скрипки для того же, если скоро понадобится). Я использовал 5-секундный тайм-аут в качестве обходного пути, основываясь на своих наблюдениях за этой проблемой.

На данный момент, если бы кто-нибудь мог сослаться на скрипку, которую я предоставил, и сказать мне, что именно вызывает ошибку, и если есть какой-то способ заставить визуализацию работать без нарушения логики «перерисовки», я был бы очень признателен.


person arjun010    schedule 10.11.2014    source источник


Ответы (1)


Решение:

На всякий случай это поможет любому, кто сталкивается с подобной проблемой: я повторно использовал свой объект силового макета, когда загружал новые узлы/ссылки. Оказывается, таймер тиков все еще срабатывал. Вызов force.stop() для отключения при загрузке новых данных решил проблему.

person arjun010    schedule 10.11.2014