javascript - 如何翻译 d3.js 节点?

标签 javascript events d3.js geometry force-layout

我有一个包含一组节点的 d3 力导向图:

var node = vis.selectAll("g.node")
              .data(json.nodes)
              .enter().append("svg:g")
              .attr("class", "node")
              .attr("id", function(d) { return "node" + d.index; })
              .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
              .call(force.drag);

这样渲染很好。

现在,当我显示 ID 为 detail_container 的详细信息 div 时,我想将这些节点向右平移(移动)200 像素。

我尝试了以下方法,但是当我显示 detail_container 时节点没有任何反应(除了显示细节 div):

$('#detail_container').fadeIn('slow', function() {
    d3.selectAll("g.node").attr("transform", function(d) { return "translate(200, 0)"; });
});

d3.selectAll("g.node") 语句包含节点数据,我可以通过查看控制台中的数据来确认:

console.log(d3.selectAll("g.node"));

作为另一种方法,我将缩放/平移行为附加到我的图表中:

var vis = d3.select("#position")
            .append("svg:svg")
            .attr("width", w)
            .attr("height", h)
            .attr("pointer-events", "all")
            .append("svg:g")
            .call(d3.behavior.zoom().on("zoom", redraw))
            .append("svg:g");

这很好用。但是,这与鼠标交互,而不是与我的程序中发生的事件交互,所以是否有编程方法来调用缩放/平移行为,以便我可以完成我想要的翻译?

最佳答案

如果你只想将节点向右移动,那么你可以通过设置一个变换来实现;如果您想要交互式平移和缩放,请仅使用缩放行为。

我不清楚为什么当您选择节点并设置变换时没有发生任何事情,但我看到的一个问题是通过直接在节点上设置变换属性,您将覆盖由部队布局。因此,您可能希望将所有节点放在另一个 G 元素中,这样您就可以通过更改容器上的变换而不是单个节点来偏移所有节点。 DOM 看起来像这样:

<g class="nodes">
  <g class="node" transform="translate(42,128)">
    <circle r="2.5">
    <text>First Node</text>
  </g>
  <g class="node" transform="translate(64,501)">
    <circle r="2.5">
    <text>Second Node</text>
  </g>
  …
</g>

那么,如果你想把所有的节点都向右移动200px,那就是:

d3.select(".nodes").attr("transform", "translate(200,0)");

要恢复转变,移除容器的转换:

d3.select(".nodes").attr("transform", null);

如果你想要真的花哨,另一种实现这种效果的方法是改变力布局的重心,然后在显示或隐藏细节 DIV 时重新加热图形.这将导致节点平滑地移动到新位置以为详细信息容器让路。您可以在 Shan Carter 的可视化中看到一个例子,Four Ways to Slice Obama’s 2013 Budget Proposal :点击“消费类型”按钮,观察圆圈是否居中。或者,请参阅 this example on custom gravity .

关于javascript - 如何翻译 d3.js 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10098450/

相关文章:

javascript - javascript HTML W/R/T Later 函数中如何处理未定义的错误

javascript - 单击事件 Jquery 在文档准备好时启动

javascript - 如何将多个事件处理程序附加到 addEventListener() 方法以及 bubbling.vs.capturing 的区别是什么?

javascript - D3 物理重力

javascript - 如何将文本标签附加到水平图例中各自的圆圈?

javascript - javascript (jQuery) 问题。适用于 Firefox 但不适用于 IE

javascript - 使用 JavaScript 将数组发送到下一页

javascript - 压缩javascript的Makefile

python - 所有 Tkinter 事件的主列表?

html - 响应式 iframe 内容 : scale d3 to iframe size