d3.js 在D3中创建绑定到数据的自定义SVG元素

bvjveswy  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(185)

我正在研究一个几何扳手的可视化。我的可视化有一个访问每个点的六边形。六边形由三条路径构成。现在,我的代码显示了一个六边形在每个节点上顺序出现和消失。这很好。但我想展示的是六边形从一个节点移动到下一个节点我必须在HTML中创建一个定制的SVG元素,或者将两组数据绑定到同一个图(1-要访问的位置,2-创建六边形的路径位置)。

plot = {
  const height = 600
  const width = 800
  const numPoints = 10
  let nodes = []

  for (let i = 0; i < numPoints; i++) {
    var x = Math.floor(Math.random() * (750 - 100) + 100)
    var y = Math.floor(Math.random() * (550 - 100) + 100)
    let point = {
        "x": x,
        "y": y
    }
    nodes.push(point)
  }

  const svg = d3
    .create("svg")
    .attr("width", width)
    .attr("height", height)
    .attr("viewBox", [0, 0, width, height])
    .attr("class", "svg-bg");

  const rayLength = 200;

  const data = [{source: [-rayLength, 0], target: [rayLength,0]},
                {source: [-rayLength*Math.cos(Math.PI/3),-rayLength*Math.sin(Math.PI/3)],                       target: [rayLength*Math.cos(Math.PI/3),rayLength*Math.sin(Math.PI/3)]},
                {source: [rayLength*Math.cos(Math.PI/3),-rayLength*Math.sin(Math.PI/3)],                       target: [-rayLength*Math.cos(Math.PI/3),rayLength*Math.sin(Math.PI/3)]},]

  const local = d3.local();
  var group = svg.selectAll("g")
    .data(nodes)
    .enter()
    .append("g")
    .attr("transform", function (d,i) {
      local.set(this,i);return "translate(" + d.x + "," + d.y + ")"
    })

  var spanner = group.selectAll("path")
    .data(data)
    .enter()
    .append("path")
    .transition()
    .delay(function(d,i) {const p = local.get(this); return p*2000})
    .attr("d", function(d) {return "M"+d.source[0]+" "+d.source[1]+"L"+d.target[0]+" "+d.target[1]})
    .attr("stroke", "#D3D3D3")
    .transition()
    .delay(function(d,i) {const p = local.get(this); return 1500})
  .remove()

  var circles = group.append("circle")
    .attr("r",3)
    .attr("fill","black")

  return svg.node()
}
n3h0vuf2

n3h0vuf21#

你可以为你的spanner创建一个唯一的组,然后使用javascript setInterval函数更新它的transform属性,并使用d3转换来平滑地转换它。我认为你不必为每个点创建一个spanner或将数据绑定到它。
请看下面的例子:https://codepen.io/ccasenove/pen/RwymNMB

相关问题