2013-10-10 3 views
3

Можно ли изменить размер макета силы в d3.js? Например, у меня есть макет, определяемыйИзменение размера макета D3

var force = d3.layout.force() 
.nodes(documents.nodes) 
.linkDistance(0) 
.friction(.2) 
.size([width, height]); 

force.start(); 

и я хочу изменить его позднее в проекте. Это возможно?

+1

Вы пробовали сбросить '.size()'? –

+0

Я попробовал 'force.size ([newWidth, height]). Start();' to no avail ... – cjweave2

+0

Обратите внимание, что увеличение размера макета не означает, что будет использоваться дополнительное пространство. Каков ваш конкретный вариант использования? –

ответ

3

Согласно the documentation, параметр макета силы влияет на только центр тяжести и начальное распределение узлов, а не доступное пространство. Вам придется принудительно применять любые ограничения для себя, например. в tick функции:

force.on("tick", function() { 
    node.attr("cx", function(d) { return Math.min(maxX, Math.max(minX, d.x)); }) 
     .attr("cy", function(d) { return Math.min(maxY, Math.max(minY, d.y)); }); 
} 
4

Вскоре, на событие изменения размера, вы должны изменить атрибуты вашего SVG объекта (он изменяет также центр тяжести) и возобновить расчеты силы:

window.onresize = function() { 
    width = window.innerWidth, height = window.innerHeight; 
    svg.attr('width', width).attr('height', height); 
    force.size([width, height]).resume(); 
}; 

Примером для d3 force является размер provided here.

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