D3标签到可拖动的圆圈

D3 Label to draggable circle

本文关键字:拖动 标签 D3      更新时间:2023-09-26

我试图使用d3来绘制圆形元素与标签旁边。我应该可以拖动一个圆圈,旁边有一个标签。

任何建议都是感激的。https://jsfiddle.net/o3yg8sq1/2/

const svg = d3.select('svg'),
        width = +svg.attr('width'),
        height = +svg.attr('height');
    const node = svg.append('g')
        .attr('class', 'nodes')
        .selectAll('circle')
        .data([{1:1},{2:2}])
        .enter().append('circle')
        .attr('r', 15)
        .attr('cx', function (d, i) { return Math.random() * 100; })
        .attr('cy', function (d, i) { return Math.random() * 100; })
        .call(d3.drag()
            .on('drag', dragmove));
    svg.selectAll('.nodes')
        .append('text')
        .text(function(d){return 'test';})
    function dragmove(d) {
        d3.select(this).attr('cx', d3.event.x);
        d3.select(this).attr('cy', d3.event.y);
    }

因为这是D3 v3,所以正确的函数是:

d3.behavior.drag()

除此之外,要拖动带有相应文本的圆圈,更好的方法是将circletext附加到一个组中:

const node = svg.selectAll('.g')
    .data([{1:1},{2:2}])
    .enter().append('g').attr("transform", function(){
        return "translate(" + Math.random() * 100 + "," 
        + Math.random() * 100 + ")"
});
node.append("circle").attr('r', 15);
node.append('text')
    .attr("dx", 16)
    .text("test")

并将其拖动到该组:

node.call(d3.behavior.drag()
    .on('drag', dragmove));
function dragmove(d) {
    d3.select(this).attr("transform", function(){ 
        return "translate(" + d3.event.x + "," + d3.event.y + ")"
    })
}

这是更新后的小提琴:https://jsfiddle.net/gerardofurtado/o3yg8sq1/4/