我是d3.js的新手,并试图通过对某些代码进行简单的修改来学习。 Here's the original code,在图形上有一些点,由点连接。
我试图做到这一点,以使所有点都被限制在其x位置,即使它们被拖动但仍在y位置移动。这很容易,我只是在attr('cx', x(d[0]))
的{{1}}行中注释了。
现在,我正在尝试制作一个点,所以当我拖动一个点时,它也会同时拖动它的相邻点(向左和向右),并且路径仍然从点到相邻点连接(正如您所期望的那样) )。
这就是我尝试过的。创建dragged()
的更新/输入后,我通过执行focus.selectAll('circle')
在cx
和cy
之后添加属性。
然后,在“ dragged()”中,我改为:
.attr('ind', function(d, i) { return i; })
但是,它正在做一些奇怪的事情:
function dragged(d) {
var cur_y = y.invert(d3.event.y);
var cur_ind = d3.select(this).attr('ind');
focus.selectAll('circle')
.attr('cy', function(d, i){
if (Math.abs(i - cur_ind)<=1){
//console.log('i: ' + i + ' cur_ind: ' + cur_ind + ' abs: ' + Math.abs(i - cur_ind));
return y(cur_y);
}
else{
return y(d[1]);
}
});
focus.select('path').attr('d', line);
}
似乎在做些奇怪的事情?所以我想我不了解如何绑定数据的想法。我以为这个想法是,当我对圆执行Math.abs()
部分时,它不仅使用数据enter()
对其进行了一次设置,还将其绑定到圆上,因此,如果圆的属性发生了变化,积分也是如此。但显然并非如此。
我已经阅读了更多的内容,看来我的方法没有更新圆所基于的实际点。我做了一个巧妙的解决方法,解决了一些问题,在更改points
时做了points[i][1] = cur_y;
。现在,它也可以移动路径,但是仍然在很多方面被破坏。
解决这个问题的正确方法是什么?我该如何移动圆,但又要使该移动改变基础数据,因此也改变路径?谢谢!