我正在用d3.js进入激动人心的强制导向布局世界。我已经掌握了d3的基本原理,但我无法弄清楚建立力导向布局的基本系统。
现在,我正在尝试创建一个简单的布局,其中有几个未连接的气泡浮动到中心。很简单吧!?创建了正确的圆圈,但没有任何反应。
编辑:问题似乎是force.nodes()返回初始数据数组。在工作脚本上,force.nodes()返回一个对象数组。
这是我的代码:
<script>
$(function(){
var width = 600,
height = 400;
var data = [2,5,7,3,4,6,3,6];
//create chart
var chart = d3.select('body').append('svg')
.attr('class','chart')
.attr('width', width)
.attr('height', height);
//create force layout
var force = d3.layout.force()
.gravity(30)
.alpha(.2)
.size([width, height])
.nodes(data)
.links([])
.charge(30)
.start();
//create visuals
var circles = chart.selectAll('.circle')
.data(force.nodes()) //what should I put here???
.enter()
.append('circle')
.attr('class','circles')
.attr('r', function(d) { return d; });
//update locations
force.on("tick", function(e) {
circles.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
});
</script>
答案 0 :(得分:3)
这是问题所在。您输入force.nodes(array)
的数组需要是一个对象数组。
所以:
var data = [{number:1, value:20}, {number:2, value:30}...];
的工作原理。甚至只是
var data=[{value:1},{value:2}];
使脚本正常工作。
答案 1 :(得分:0)
您需要更新cx
处理程序中的cy
和force.on
。
//update locations
force.on("tick", function(e) {
circles.attr("cx", function(d) { return d.x - deltaX(d, e) ; })
.attr("cy", function(d) { return d.y - deltaY(d, e); });
});
函数deltaX
和deltaY
取决于你的力量模型。