我有一个演示here

我有一个响应式折线图,其中一个数据源包含多条线。

这些线在每个数据点处都有一个圆圈。

调整页面大小后,我想重新绘制图形以更改宽度。

圆圈在起作用,但我无法获得相同的线条数据。

我正在创建实际路径,但似乎无法添加数据来画线。

const dataLine = d3.line()
  .x((d) => this.x(d.date) + 0.5 * this.x.bandwidth())
  .y((d) => this.y(d.value));

let lines = this.chart.append('g')
  .classed('lines', true)

lines.selectAll('.line-group')
  .data(data).enter()
  .append('g')
  .classed('line-group', true)

let linesUpdate = d3.selectAll('.line-group').selectAll("path")
  .data(d => d.values)

linesUpdate.enter()
  .append('path')
  .classed('line', true)
  .merge(linesUpdate)
  .attr("d", dataLine);


如何添加数据以画线

最佳答案

D3的数据绑定过程的这一部分可能有点违反直觉:您必须为data()方法返回一个数组,这是肯定的……但是,数据数组中的每个对象将被视为一个单独的数据!这就是为什么您看不到任何路径的原因,因为您实际上是在该组中附加了十几条路径。

解决方案只是将数组包装在另一个数组中。所以把这个...

data(d => d.values)


...变成这样:

data(d => [d.values])


这样,每个数组将被视为一个单独的数据点。然后,该数据点实际上是对象的数组,被传递给线生成器。

这是您的更新代码:https://stackblitz.com/edit/multiline-responsive-xbtqzc-fldp7c?file=src/app/bar-chart.ts

08-08 02:30
查看更多