【问题标题】:Basics of D3's Force-directed LayoutD3 的力导向布局基础
【发布时间】:2012-08-07 22:34:47
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: javascript d3.js force-layout physics-engine


    【解决方案1】:

    这就是问题所在。您输入force.nodes(array) 的数组需要是一个对象数组。

    所以:

    var data = [{number:1, value:20}, {number:2, value:30}...];

    有效。甚至只是

    var data=[{value:1},{value:2}];

    使脚本正常工作。

    【讨论】:

      【解决方案2】:

      您需要在force.on 处理程序中更新cxcy

      //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); });
      });
      

      而函数deltaXdeltaY 取决于你的力模型。

      【讨论】:

      • 我认为 force-layout 提供了 d.x 和 d.y 的更新位置。 deltaX() 来自哪里?我正在尝试查看工作示例,并且示例始终只是使用 return d.x 进行更新
      最近更新 更多