在 d3.js 树上设置初始缩放级别(动态)

Mak*_*aki 1 d3.js

我在这个例子之后建立了一棵树。现在我有了一些数据,初始缩放太接近,所以我想设置数据适合屏幕的初始缩放级别。我完全可以采用手动方法,在脚本中设置比例。当然,动态地制作它也非常好,(仅)取决于宽度(以便显示所有水平数据)。

这是脚本中的缩放功能:

function zoom() {
    svgGroup.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}
Run Code Online (Sandbox Code Playgroud)

这是 ZoomListener 函数:

var zoomListener = d3.behavior.zoom().scaleExtent([0.1, 3]).on("zoom", zoom);
Run Code Online (Sandbox Code Playgroud)

我已经在这里那里阅读了一些文章(以及其他一些文章),但我不明白如何将这些解决方案实现到我的树中,因为我对 d3 和一般编程非常陌生。

在此先感谢您的帮助!:)

Mak*_*aki 5

最后我自己通过更多文章找到了解决方案。这篇文章给出了有帮助的主要代码片段(在阅读了更多内容之后),但首先对我来说并没有得到充分的解释。

因此,使用给定示例树代码的解决方案如下:

要设置初始缩放级别,您需要向 g 元素添加一行,以便 ZoomListener 工作(它几乎位于脚本的底部),如下所示:

// Append a group which holds all nodes and which the zoom Listener can act upon.
var svgGroup = baseSvg.append("g")
    .attr("transform","translate(100,30)scale(.3,.3)");
Run Code Online (Sandbox Code Playgroud)

我基本上只是向包含所有其他节点的 g 元素添加一个属性。该属性中设置的是初始缩放级别。平移值和比例相同似乎很重要(30/100 = 0.3 ;))。否则它无法正常工作。

但现在的问题是,当我们第一次想要缩放或在树上移动时,它会跳回比例 1,这对用户来说不太好,因为他会因这种突然的跳跃而感到困惑。

为了获得流畅的用户体验,我只在上面提到的 ZoomListener 中添加了一小行,它看起来像这样(它的平移和缩放与以前相同):

 var zoomListener = d3.behavior.zoom().translate([100,30]).scale(.3).scaleExtent([0.3, 3]).on("zoom", zoom);
Run Code Online (Sandbox Code Playgroud)

现在初始缩放级别是硬编码的并且可以轻松调整 - 最棒的是:只需要两行:D

我会尝试一种动态的方法。当我有解决方案时,我将编辑此解决方案:)

编辑:我找到了一个动态解决方案 - 至少对于我的情况:当使用 php 创建(可自定义)树的数据时,我检查树的深度(一行中有多少个节点)。这个深度被写入SESSION中。在我的 javascript 中的树函数开始之前,我初始化并设置:

var depth_of_tree = window.SESSION.depth_of_tree;
Run Code Online (Sandbox Code Playgroud)

初始比例为 1 除以深度 ln:

var initscale = 1 / Math.log(depth_of_tree); 
Run Code Online (Sandbox Code Playgroud)

然后,我使用以下几行更改 ZoomListener:

//var initscale = .3;
var inittransx = 100;
var inittransy = inittransx*initscale;

// define the zoomListener which calls the zoom function on the "zoom" event constrained within the scaleExtents
var zoomListener = d3.behavior.zoom().translate([inittransx,inittransy]).scale(initscale).scaleExtent([0.3, 2]).on("zoom", zoom);
Run Code Online (Sandbox Code Playgroud)

和:

// Append a group which holds all nodes and which the zoom Listener can act upon.
var svgGroup = baseSvg.append("g")
    .attr("transform","translate("+inittransx+","+inittransy+")scale("+initscale+","+initscale+")");
Run Code Online (Sandbox Code Playgroud)

无论树有多深,这都会产生相当漂亮的尺度。(你可能需要玩一下数字)