在运行时更改折线图的域

时间:2017-10-18 05:31:22

标签: javascript d3.js

在我的代码中,我正在加载超过900个数据的JSON。这些数据代表一些机器发出的数据。我正在绘制折线图,​​此JSON中的键代表机器的名称。

这是我的JSON的结构:

{"AF3":3605.1496928113393,"AF4":-6000.4375230516,"F3":1700.3827875419374,"F4":4822.544985821321,"F7":4903.330735023786,"F8":824.4048714773611,"FC5":3259.4071092472655,"FC6":4248.067359141752,"O1":3714.5106599153364,"O2":697.2904723891061,"P7":522.7300768483767,"P8":4050.79490288753,"T7":2939.896657485737,"T8":9.551935316881588}

每一行代表每台机器,我分别放置一个空间来查看每台机器。我目前正在一个名为cont的计数器的帮助下阅读数据。 JSON中的所有数据都在05000之间。但是我修改了JSON的一些对象以实现更改域,然后通常所有行的新域必须等于更改。

例如,在JSON的第106行到"AF3":7000。 (在这种情况下,所有行的域应为[0-7000])

在第300行"AF4": - 1000。(在这种情况下,所有行的域名应为[-1000,7000])

我已故意修改了一些数据以实现此更改。我希望所有行都更新到这个新域,如果可能的话动画。

我该怎么做?

这是我的代码:

http://plnkr.co/edit/KVVyOYZ4CVjxeei7pd9H?p=preview

1 个答案:

答案 0 :(得分:1)

要在所有折线图中更新域,我们需要在推送新数据之前重新计算域。

Plunker:http://plnkr.co/edit/AHWVM3HT7TDAiINFRlN9?p=preview

var newDomain = d3.extent(ids.map(function(d) {
  return aData[cont][d]
}));
var oldDomain = y.domain()
newDomain[0] = newDomain[0] < oldDomain[0] ? newDomain[0] : oldDomain[0]
newDomain[1] = newDomain[1] > oldDomain[1] ? newDomain[1] : oldDomain[1]
y.domain(newDomain)
domain.text(y.domain())

关于图形修剪,需要在1ms内处理数据(在您的情况下,14个阵列,对阵列的推动和移位操作以及D3转换),这可能是不够的。不幸的是,我没有任何资源支持这一点。如果有人可以编辑此答案以提供证据,请随意。