2016-09-07 6 views
0

Я пытаюсь написать свою собственную функцию для взвешивания ссылок для d3 v4 Force, ориентированного графика.Как вы настраиваете силу связи d3 как функцию ссылок и узлов? (d3 v4)

Функция силы по умолчанию задана here и в соответствии с readme ее можно изменить, передав новую функцию в качестве аргумента. (Обратите внимание, что функция в readme немного отличается от функции в реальном коде).

Это часть кода, я хотел бы работать:

var simulation = d3.forceSimulation() 
      .force("link", d3.forceLink() 
        .distance(60) 
        .id(function (d) { return d.name;}) 
        .strength(function (link) {/* my code here */})) 

Я попытался заменить комментарий с по умолчанию:

function (link) { return 1/Math.min(count[link.source.index], 
             count[link.target.index]); } 

без успеха.

+0

'count' не доступны из обратного вызова, предоставляемой' .strength() '. Эта переменная используется внутри 'd3.forceLink()', но не отображается. Это может помочь определить, что вы хотите достичь с помощью своего кода, чтобы помочь вам найти решение с помощью имеющихся средств. – altocumulus

+0

Да, я понял, что немного поздно ... Я смог заставить его работать с '1/Math.min (d.source.size, d.target.size)', потому что мои узлы имеют атрибут 'size', который заменяет этот счет. Спасибо за ответ – Dabrule

ответ

0

Трудно сказать из приведенного вами примера, но вам нужно передать ссылки на симуляцию forceLink. Если вашему примеру на самом деле удается построить ссылки, вы можете рассмотреть вопрос об экстернализации вычисления, а затем вызвать эту функцию из внутренних ссылок. Вот пример, который работает для меня.

var weightScale = d3.scaleLinear() 
.domain(d3.extent(edges, function (d) { return d.weight })) 
.range([.1, 1]) 


graph = d3.forceSimulation() 
.nodes(nodes) 
.force("charge", d3.forceManyBody() 
    .strength(-75) // -1000 
    .distanceMax([250]))  
.force("link", d3.forceLink() 
    .links(edges) 
    .id(function(d) { return d.index }) 
    .strength (function (d) {return weightScale(d.weight)}) 
    .distance(55)) 
.force("center", d3.forceCenter(250, 250)) // width/2, height/2 
.on("tick", forceTick); 

Я использую шкалу weightScale на весах линии, которая называется внутри .strenght. Вы можете либо передать ссылки, как это:

.force("link", d3.forceLink(*YOURLINKS*) 

или это:

.force("link", d3.forceLink() 
    .links(*YOURLINKS*) 

 Смежные вопросы

  • Нет связанных вопросов^_^