Я пытаюсь изменить свой сценарий визуализации, чтобы больше походить на Modifying a Force Layout Example. Поскольку у меня нет фиксированных узлов, например a, b and c
, я добавляю json file
для заполнения массива nodes
и links
.Невозможно визуализировать узлы в макете d3 force
d3.json("mock.json", function(error, json) {
if (error)
throw error;
nodes = nodes.concat(json.nodes);
links = links.concat(json.links);
start();
});
nodes
и links
имеют правильный размер, то есть узлы, содержит 26 nodes
и ссылки 37 links
. Теперь я хочу просто визуализировать их, используя line
и circle
элементов.
function start() {
link = link.data(force.links(), function(d) { return d.source.id + "-" + d.target.id; });
link.enter().append("line").attr("class", "link");
link.exit().remove();
node = node.data(force.nodes(), function(d) { return d.id;});
node.enter().append("circle").attr("class", "node").attr("r", 8);
node.exit().remove();
force.start();
}
Это очень похоже на пример, и я не совсем понимаю, почему это не сработает. Я даю a demo с макетом. Есть проблема, потому что я использую concat()
, а не push()
или что-то еще не так?
Jup, работает сейчас, но почему я должен использовать 'force.nodes (nodes); '? В этом примере он работает без него, но я подумал, как он узнал об узлах и ссылках. –
yes, потому что 'nodes.concat (json.nodes)' будет возвращать новый объект, в то время как 'force.nodes()' будет удерживать старый объект..так, когда вы делаете force.nodes() в своем коде, он возвращает пустой массив, из-за чего вы ничего не видите. – Cyril
Спасибо! :) Теперь это имеет смысл для меня. 'push()' в этом случае не работал для меня, потому что он только толкал массив внутри другого массива. –