问题复现

最近在使用 AntV G6 做 InfluxDB 数据可视化的时候发现了一个奇怪的现象:

现场

从 InfluxDB 中查询出来的数据是按 field 字段分类并在 AntV G6 进行展示:

<Line
  data={data}
  xField='time'
  yField='value'
  seriesField='field'
  xAxis={{
    type: 'time',
    mask: 'HH:mm:ss'
  }}
  slider={{}}
  smooth
/>

部分数据如下:

fieldvaluetime
st53.42022-02-19T05:09:40.000Z
st104.42022-02-19T05:10:10.000Z
st162.62022-02-19T05:10:40.000Z
st211.22022-02-19T05:11:10.000Z
se1.75282022-02-19T05:09:40.000Z
se1.82572022-02-19T05:10:10.000Z
se1.95752022-02-19T05:10:40.000Z
ur166.60851212022-02-19T04:38:40.000Z
ur167.45941752022-02-19T04:39:10.000Z
ur168.25215432022-02-19T04:39:40.000Z
ur169.03843652022-02-19T04:40:10.000Z
ur169.90944362022-02-19T04:40:40.000Z
ur170.7231332022-02-19T04:41:10.000Z
ur171.59128052022-02-19T04:41:40.000Z
ur172.42211692022-02-19T04:42:10.000Z
ur173.28278772022-02-19T04:42:40.000Z

数据我们从 InfluxDB 取出后为了方便前端处理,将 List<FluxTable> 通过 Stream Reduce
流处理为了 List<FluxRecord>,所以前端接受到的数据是按 field 的顺序排列出来的。

问题排查

百度搜索后,别人给出的经验是:存在 x 值相同的点。于是便使用了:

const tmp = result.map(record => record.time);
console.log(tmp.length, _.uniq(tmp).length);

确认是否有重复。得到控制台输出 687 701,可见有 20 多个重复点。将这些重复的时间点对应的数据输出后发现分属于不同的 field,在每一个 field 中并不存在重复点,所以怀疑是 AntV 处理数据的问题。

由于 x 轴本身指定 type: 'time',于是便注释掉 xAsix 字段,发现飞线消失了,变成了三段数据在图表中横向分布在图表中

横向分布
放大看看

问题解决

于是便产生了对数据进行处理的想法,随后便将 data 按照 time 进行了排序,由于 time 本身为时间字符串,所以需要用 moment 处理为 unix 毫秒时间戳:

result.map(record => ({
  ...record,
  time: moment(record.time).unix() * 1000,
})).sort((x, y) =>
   x.time - y.time
)

果然数据变成了我们预期的效果:

撒花~

对于部分特别复杂的数据,建议设置 smooth={false},否则会产生漂亮的螺 旋 线 奇 观(雾漂亮的螺 旋 线 奇 观

问题复盘

针对 AntV 的数据处理方式,以后对于 AntV 的 多折线图、堆积面积图要对数据进行排序后再使用,其中:

  • 多折线图对 x 轴进行排序
  • 堆积面积图对 seriesField 进行排序
最后修改:2022 年 02 月 19 日
如果觉得我的文章对你有用,请随意赞赏