[英]How do I translate d3.js nodes?
我有一个包含一组节点的 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");
这很好用。 但是,这与鼠标交互,而不是与我的程序中发生的事件交互,所以是否有一种编程方式来调用缩放/平移行为,以便我可以完成我想要的翻译?
如果只想将节点向右移动,则可以通过设置变换来实现; 只有在需要交互式平移和缩放时才使用缩放行为。
我不清楚为什么当您 select 节点并设置转换时什么也没有发生,但我看到的一个问题是,通过直接在节点上设置转换属性,您将覆盖强制布局设置的 x & y position . 因此,您可能希望将所有节点放在另一个 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 时重新加热图形。 这将导致节点顺利转移到新的 position 中,为详细信息容器让路。 您可以在 Shan Carter 的可视化中看到这方面的一个示例, 四种方法来切分奥巴马 2013 年预算提案:单击“支出类型”按钮并观察圆圈重新居中。 或者,请参阅有关自定义重力的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.