Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缩放后在D3.js中添加带有过渡的对象_Javascript_Jquery_Svg_D3.js - Fatal编程技术网

Javascript 缩放后在D3.js中添加带有过渡的对象

Javascript 缩放后在D3.js中添加带有过渡的对象,javascript,jquery,svg,d3.js,Javascript,Jquery,Svg,D3.js,在d3.js示例中,目标是更改X&Y比例,以显示屏幕外添加的新圆圈 当前,如果要更改缩放比例,然后单击按钮添加新圆,缩放级别将突然重置为1。现在,拖动视图将使缩放比例再次变得正确,这与添加圆之前的缩放比例相同 但是,如果将第123行上的redrawWithTransition()更改为redraw(),则此问题将消失,从而删除转换 如果不先缩放就添加圆,则一切正常 为什么我们必须再次拖动视图以获得正确的缩放比例?我们如何避免在redrawWithTransition()中进行这种额外的拖动并仍

在d3.js示例中,目标是更改X&Y比例,以显示屏幕外添加的新圆圈

当前,如果要更改缩放比例,然后单击按钮添加新圆,缩放级别将突然重置为1。现在,拖动视图将使缩放比例再次变得正确,这与添加圆之前的缩放比例相同

但是,如果将第123行上的
redrawWithTransition()
更改为
redraw()
,则此问题将消失,从而删除转换

如果不先缩放就添加圆,则一切正常

为什么我们必须再次拖动视图以获得正确的缩放比例?我们如何避免在
redrawWithTransition()
中进行这种额外的拖动并仍然使用转换?谢谢

Jsfiddle:


因为添加圆后再次平移可以解决问题,所以我尝试在最后调用
redraw()
,但没有区别!平移/缩放是否触发了除重新绘制()之外的其他内容

Jsfiddle:


首先,用户进行缩放/平移,最终得到一个如图a所示的视图。接下来,添加了新的圆圈,我们应该得到图C,但我们得到的是图B,其中用户当前的平移/缩放发生了显著变化


另一个案例 如果用户平移/缩放到与上图类似的视图,添加新圆应稍微重新定位现有圆,但整个视图将重置

我在想这样的事情:

// Copy existing domains
var xMinOld = xMin,
    xMaxOld = xMax,
    yMinOld = yMin,
    yMaxOld = yMax;

// Update domains
var yMin = d3.min(data.map( function(d) { return d; } )),
    yMax = d3.max(data.map( function(d) { return d; } )),
    xMin = d3.min(data.map( function(d) { return d; } )),
    xMax = d3.max(data.map( function(d) { return d; } ));

if(x.domain()[0] > newData[0] || x.domain()[1] < newData[0]) {
    if(x.domain()[0] > newData[0]) {
        x.domain([xMin, xMaxOld]);
    } else {
        x.domain([xMinOld, xMax]);
    }
    zoom.x(x);
}

if(y.domain()[0] > newData[0] || y.domain()[1] < newData[0]) {
    if(y.domain()[0] > newData[0]) {
        y.domain([yMin, yMaxOld]);
    } else {
        y.domain([yMinOld, yMax]);
    }
    zoom.y(y);
}
//复制现有域
var xMinOld=xMin,
xMaxOld=xMax,
yMinOld=yMin,
yMaxOld=yMax;
//更新域
var yMin=d3.min(data.map(函数(d){return d;})),
yMax=d3.max(data.map(函数(d){return d;})),
xMin=d3.min(data.map(函数(d){return d;})),
xMax=d3.max(data.map(函数(d){returnd;}));
如果(x.domain()[0]>newData[0]| | x.domain()[1]newData[0]){
x、 域([xMin,xMaxOld]);
}否则{
x、 域([xMinOld,xMax]);
}
zoom.x(x);
}
如果(y.domain()[0]>newData[0]| | y.domain()[1]newData[0]){
y、 域([yMin,yMaxOld]);
}否则{
y、 域([yMinOld,yMax]);
}
zoom.y(y);
}

但最终视图仍将被重置,因为我们将更新的缩放比例
x
y
传递到
zoom

中,看起来您在添加圆后重置了平移。是你想要的吗?@Larskothoff我希望在添加新圆圈后缩放/平移几乎保持不变(而不是重置)。否则,当数据集每分钟更新一次时,已平移/缩放到某个点的用户将继续获得其平移/缩放重置。不确定您要查找什么。是否要缩放以显示新节点?@Larskothoff是的,应显示新节点,但不应大幅更改用户的视图。用一些数字更新了帖子。所以你需要做的就是检查当前的缩放/平移是否会显示圆圈?