我已经适应了Christopher Manning's force-directed graph on a sphere。我想让图形稳定下来,然后旋转球体,而不改变图形中各点之间的关系。相反,当我拖动时,似乎在拖动图形,而不旋转球体。拖动图形可激活强制开始。如果我关闭force.start(),则没有任何改变。

var svg = d3.select("#cluster").append("svg")
    .attr("width", width)
    .attr("height", height)
    .call(d3.behavior.drag()
      .origin(function() { var r = projection.rotate(); return {x: 2 * r[0], y: -2 * r[1]}; })
      .on("drag", function() { force.start(); var r = [d3.event.x / 2, -d3.event.y / 2, projection.rotate()[2]]; t0 = Date.now(); origin = r; projection.rotate(r); }))

http://bl.ocks.org/mbostock/3795040,我发现可以旋转标线,但是所有链接和节点都消失了。
var path = d3.geo.path()
    .projection(projection);

var λ = d3.scale.linear()
    .domain([0, width])
    .range([-180, 180]);

var φ = d3.scale.linear()
    .domain([0, height])
    .range([90, -90]);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

svg.on("mousemove", function() {
  var p = d3.mouse(this);
  projection.rotate([λ(p[0]), φ(p[1])]);
  svg.selectAll("path").attr("d", path);
});

像这样添加链接和节点:
  var link = svg.selectAll("path.link")
      .data(graph.links)
      .enter().append("path").attr("class", "link")
      .attr ("stroke-width", function(d){return d.value/3});

  var node = svg.selectAll("path.node")
      .data(graph.nodes)
      .enter()
      .append("g")
      .attr("class", "gnode")
      .attr("text-anchor", "middle")

      .append("path").attr("class", "node")
      .style("fill", function(d) { return d.color; })
      .style("stroke", function(d) { return d3.rgb(fill(d.group)).darker(); })

我要完成的工作:当图形固定到位时,我想使用拖动手势旋转球体及其上的节点和链接。

我如何做到这一点?

最佳答案

这可以通过在第一个代码段中定义的drag上调整为svg事件注册的处理程序来完成。这需要两个编辑:

  • 摆脱force.start(),因为您不想重新开始拖动。
  • 在投影更新后触发节点和链接的渲染,这可以通过调用tick()轻松完成。如果没有通过步骤1停用力,则将重复调用此方法,因为该函数已注册为力布局的tick事件的处理程序。现在,您已取消激活该力,则必须显式调用它。

  • 重新格式化的代码如下所示:
    .on("drag", function() {
      //force.start();     // 1. Don't restart the force.
      var r = [d3.event.x / 2, -d3.event.y / 2, projection.rotate()[2]];
      t0 = Date.now();
      origin = r;
      projection.rotate(r);
      tick();              // 2. Trigger the rendering after adjusting the projection.
    }))
    

    看看这个working example

    关于javascript - d3.js强制有向图球,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34550792/

    10-10 23:48