2

Я построил диаграмму d3 sankey, адаптированную из this example, чтобы показать поток предпосылок для курсов в моей программе. Однако, вместо того, чтобы позволить библиотеке Auto-позиционные узлы, я вручную установить их x и y координаты минимизируют крестов с этой короткой кусочке кода перед вызовом update();Почему эта диаграмма d3 визуализируется с помощью крестов, а затем избавляется от них при перемещении узла?

if (!AUTO_POSITION) { 
    exampleNodes.forEach((r, i) => { 
     r.x = r.xPos; 
     r.y = r.yPos; 
    }); 
} 

Диаграмма первоначально визуализирует как это (примечание линия пересекает около МАТЕМАТИКА 100, МАТЕМАТИКА 101, 101, PHYS PHYS 102, ELEC 211, ELEC 311 и т.д.):

enter image description here

Однако при нажатии и перетащить любой один узел, схема подстраивается это (обратите внимание, что большинство крестов исчезает):

enter image description here

Почему программа это сделать? И как я могу получить диаграмму для рендеринга без крестов при загрузке?

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

var evt = document.createEvent("MouseEvents"); 
evt.initEvent("mouseup", true, true); 
evt.initEvent("mousedown", true, true); 
document.querySelector("g.node").dispatchEvent(evt); 

Полный код для моего примера в этом JSFiddle. Благодарю.

+0

Код около 1500 строк! Не могли бы вы создать минимальный код, представляющий вашу проблему, без лишних деталей? – Mehraban

ответ

1

Одно решение было бы сделать функцию тайм-аут, как это:

setTimeout(function() { 
    //does the relayout 
    biHiSankey.relayout(); 
    //update all the nodes with new height 
    svg.selectAll(".node").selectAll("rect").attr("height", 
    function (d) { 
     return d.height; 
    }); 
    //update all the path 
    link.attr("d", path); 
    }, TRANSITION_DURATION +450); 

Внутри функции update.

Это будет активировано после завершения перехода.

Рабочий код here

+0

Спасибо! Это, похоже, работает для обновления ссылок, однако размер узла не обновляется в соответствии с новыми ссылками. Знаете ли вы, как их обновлять? –

+0

сделано! проверьте мой ответ. Я обновил узлы своей новой высотой. Также обновил скрипку. – Cyril

+0

Спасибо! Все еще не уверен, почему это делается для начала, но это исправляет. –

0

Если я прав, это потому, что порядок данных в вашем массиве не соответствует порядку их положения. Кажется, что порядок массива определяет, в каком порядке показаны зависимости, если вы не измените какой-либо из элементов, что приведет к реинжинирингу.

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

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