2013-12-17 2 views
5

Я хотел бы сделать что-то немного необычное с силовыми макетами (для визуализации графиков). Созвездия и все это интересно посмотреть, но для данных временных рядов это не так полезно. Я хотел бы иметь возможность ограничить компоновку некоторой осью, например, путем размещения узлов в соответствии со временем их появления в наборе данных, сохраняя при этом «бодрость» визуализации. Возможно ли это с помощью d3?Constrained d3.js Force display

+1

Да, [этот вопрос] (http://stackoverflow.com/questions/15100060/d3-js-force-directed-layout-constrained-by-a-shape) должен дать вам указатели. –

ответ

6

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

Принимая один из stock examples, вы можете сделать следующие действия, чтобы ограничить координату x в пределах + -10 от предполагаемой позиции с неограниченным y.

force.on("tick", function() { 
    node.each(function(d) { 
    var intended = scale(d.value); 
    d.x = d.px = Math.min(intended + 10, Math.max(intended - 10, d.px)); 
    }); 
    node.attr("cx", function(d) { return d.x; }) 
     .attr("cy", function(d) { return d.y; }); 
}); 

Вот еще example, который использует расположение силы на положение меток. Там позиция x игнорируется (т. Е. Константа), и только макет y зависит от компоновки.

+0

Спасибо, Ларс! Могу ли я спросить: «var предназначено = scale (d.value)», которое должно быть заменено на «var xpos = scale (d.date)» в моем случае, где datetime - это значение, на которое я хочу надеть ось х? – ericmjl

+1

Вы не разместили ни одного кода, поэтому я не знаю, что вы называете ваши переменные, но да, это означало бы положение x. –

+0

Спасибо, Ларс! Я просто смог проверить его, исправив некоторые другие ошибки в моем коде, и он работает временно! Теперь измените масштаб, чтобы убедиться, что он работает правильно. :-) Еще раз спасибо! – ericmjl