javascript - 从带线的数据转换日期和时间

标签 javascript css d3.js charts transition

我使用 D3 V5 创建了这个图表。另外,我在 fiddle 上附上了示例数据,您可以 view by clicking here .

我已经包含了 tick 函数代码块,它在向左滑动的路径上附加了 x 和 y 刻度和线/数据的新域:

当 tick 函数执行时,线条会重建,使其看起来像弹跳。
重建线路的时候怎么会很流畅,一点弹跳都没有?

var tr = d3
  .transition()
  .duration(obj.tick.duration)
  .ease(d3.easeLinear);

function tick() {
  return setInterval(function() {
    var newData = [];
    var tickFunction = obj.tick.fnTickData;
    if (tickFunction !== undefined && typeof tickFunction === "function") {
      newData = tickFunction();
      for (var i = 0; i < newData.length; i++) {
        obj.data.push(newData[i]);
      }
    }

    if (newData.length > 0) {
      var newMaxDate, newMinDate, newDomainX;
      if (isKeyXDate) {
        newMaxDate = new Date(
          Math.max.apply(
            null,
            obj.data.map(function(e) {
              return new Date(e[obj.dataKeys.keyX]);
            })
          )
        );
        newMinDate = new Date(
          Math.min.apply(
            null,
            obj.data.map(function(e) {
              return new Date(e[obj.dataKeys.keyX]);
            })
          )
        );
        newDomainX = [newMinDate, newMaxDate];
      } else {
        newDomainX = [
          d3.min(obj.data, function(d) {
            return d[obj.dataKeys.keyX];
          }),
          d3.max(obj.data, function(d) {
            return d[obj.dataKeys.keyX];
          })
        ];
      }

      // update the domains
      //x.domain([newMinDate, newMaxDate]);
      if (obj.tick.updateXDomain) {
        newDomainX = obj.tick.updateXDomain;
      }
      x.domain(newDomainX);
      if (obj.tick.updateYDomain) {
        y.domain(obj.tick.updateYDomain);
      }

      path.attr("transform", null);

      // slide the line left
      if (obj.area.allowArea) {
        areaPath.attr("transform", null);
        areaPath
          .transition()
          .transition(tr)
          .attr("d", area);
      }
      path
        .transition()
        .transition(tr)
        .attr("d", line);
      svg
        .selectAll(".x")
        .transition()
        .transition(tr)
        .call(x.axis);
      svg
        .selectAll(".y")
        .transition()
        .transition(tr)
        .call(y.axis);

      // pop the old data point off the front
      obj.data.shift();
    }
  }, obj.tick.tickDelay);
}
this.interval = tick();

最佳答案

弹跳 实际上是转换 d 属性时的预期结果,它只是一个字符串。

这里有几种解决方案。无需过多重构您的代码,一个简单的方法是使用 Mike Bostock 在此 bl.ocks 中编写的 pathTween 函数:https://bl.ocks.org/mbostock/3916621 .在这里,我对其进行了一些更改,以便您可以像这样传递数据:

path.transition()
    .transition(tr)
    .attrTween("d", function(d) {
        var self = this;
        var thisd = line(d);
        return pathTween(thisd, 1, self)()
    })

这是 fork 的插件:https://plnkr.co/edit/aAqpdSb9JozwHsErpqa9?p=preview

关于javascript - 从带线的数据转换日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56765565/

相关文章:

javascript - 如何告诉 DataTables 在哪里插入按钮导出

javascript - 验证 Google 文档和 Office 365 网址

css - 使用行高时在顶部对齐 block 元素

d3.js 无法可视化大型数据集

javascript - 为什么我的网页上没有显示任何内容?

javascript - D3js v5 中的有界静态力布局

javascript - @typescript-eslint/no-unsafe-assignment : Unsafe assignment of an any value

javascript - moment.js - UTC 不能像我预期的那样工作

html - 我们如何删除 Angular js中的方括号[]和双引号 ""?

jquery - Bootstrap 按钮开关 - 添加另一个事件类