使用 Highcharts 库可视化您的时间序列数据

导航至

Image of Highcharts logo

过去已经有一些关于使用不同的图表库(例如这个与 plotly.js 的集成或这个关于 Rickshaw 库的帖子)可视化时间序列数据的帖子。今天,我们将看看图表库 Highcharts——这是满足您数据可视化需求的另一个出色工具。当然,如果您不想引入外部图形库,您可以随时查看 Grafana 或 Chronograf。Grafana 可以轻松地与 InfluxDB 集成,而 Chronograf 的构建目的就是 InfluxDB 一起使用。

InfluxDB I'iwi 的图像<figcaption> 我们著名的 InfluxDB I’iwi</figcaption>

不过,在我们开始将这些图表放到页面上之前,您需要确保您已经启动并运行了 InfluxDB 实例。您可以获取 TICK Stack 的所有组件在本地设置,或者在我们的便捷 沙箱 模式中启动堆栈。

node-influx logo

我最近发布了一篇关于 Node-influx 客户端库入门指南,作为与 InfluxDB 集成的选项,而不必一定使用 Telegraf 来收集您的数据。此可视化是使用来自该帖子的相同海洋潮汐数据构建的。如果您想查看最终产品,可以从 此处 克隆 repo。

第一步

引入库是我们的第一步。我在 index.html 文件的 head 部分添加了以下 script 标签。

<script src="https://code.highcharts.com/highcharts.js"></script>

对于 index.html 文件的 body,您需要一个 div 容器,其 id 为“container”,以便我们稍后可以在脚本文件中定位它,如下所示

<div id="container"></div>

Highcharts 图表将在此容器中呈现。

在我们的服务器文件中,我们已经设置了一个端点来查询来自海洋潮汐数据库的数据(见下文),因此我们需要在我们的脚本文件中获取数据并将其设置到我们的 Highcharts 构造函数中。

app.get('/api/v1/tide/:place', (request, response) => {
  const { place } = request.params;
  influx.query(`
    select * from tide
    where location =~ /(?i)(${place})/
  `)
  .then( result => response.status(200).json(result) )
  .catch( error => response.status(500).json({ error }) );
});

在脚本文件中,我编写了一个简单的 fetch 函数,用于检索基于传入的位置名称的数据。

const fetchData = (place) => {
  return fetch(`/api/v1/tide/${place}`)
    .then(res => {
      if (res.status !== 200) {
        console.log(res);
      }
      return res;
    })
    .then(res => res.json())
    .catch(error => console.log(error));
}

为了获取四个不同位置的所有数据,我使用了 Promise.all(),然后更改了结果以适应 Highcharts 文档中引用的所需格式。

return Promise.all([
            fetchData('hilo'),
            fetchData('hanalei'),
            fetchData('honolulu'),
            fetchData('kahului')
         ])
        .then(parsedRes => {
          const mutatedArray = parsedRes.map( arr => {
            return Object.assign({}, {
              name: arr[0].location,
              data: arr.map( obj => Object.assign({}, {
                x: (moment(obj.time).unix())*1000,
                y:obj.height
              }))
            });
          });
        })
        .catch(error => console.log(error));

现在我们已经准备好数据,我们可以构建我们的图表了。

Highcharts.chart('container', {
            colors: ['#508991', '#175456', '#09BC8A', '#78CAD2'],
            chart: {
              backgroundColor: {
                  linearGradient: [0, 600, 0, 0],
                  stops: [
                    [0, 'rgb(255, 255, 255)'],
                    [1, 'rgb(161, 210, 206)']
                  ]
              },
              type: 'spline'
            },
            title: {
              text: 'Hawaii Ocean Tides',
              style: {
                'color': '#175456',
              }
            },
            xAxis: {
              type: 'datetime'
            },
            yAxis: {
              title: {
                text: 'Height (ft)'
              }
            },
            plotOptions: {
              series: {
                turboThreshold: 2000,
              }
            },
            series: mutatedArray
          });

这里肯定有很多事情在发生。Highcharts 库附带方法 chart(),它接受两个参数:要在其中呈现图表的目标元素和一个选项对象,您可以在其中指定各种属性,例如样式、标题、图例、系列、类型、plotOptions 等。让我们逐一介绍每个选项。

  • colors: [array] - colors 属性接受一个十六进制代码数组,该数组将表示图表的默认配色方案。如果所有颜色都用完了,则任何需要的新颜色都将导致数组再次循环。
  • chart: {object} - chart 属性接受一个对象,其中包含各种附加属性,包括类型、zoomtype、animation、events、description 和许多样式属性。在此实例中,我为背景赋予了线性渐变,并将类型指定为 spline
  • title: {object} - 这表示图表的主标题,并且可以额外赋予一个样式对象以使其更具活力。
  • xAxis: {object} - 在这种情况下,因为我使用的是时间序列数据,所以我知道 x 轴将始终是时间,因此我可以将类型指定为“datetime”,并且比例将自动调整为适当的时间单位。但是,这里还有许多其他选项,包括样式、标签、自定义刻度线位置以及对数或线性类型。
  • yAxis: {object} - 与 xAxis 属性类似,y 轴也接受一个对象,并且可以访问许多选项来自定义图表 y 轴的设计和样式。在这种情况下,我只指定了 y 轴标题,并推迟到 Highcharts 自动刻度线位置。
  • plotOptions: {object} - plotOptions 属性是每个系列类型的配置对象的包装对象。也可以为系列数组中给出的单个系列项覆盖每个系列的配置对象。在这里,我使用了 plotOptions.series 属性来覆盖默认的 turboThreshold 1000 并将其更改为 2000。这允许绘制更多的数据点(超过默认的 1000 个)。根据文档,系列配置选项在三个不同的级别访问。如果您想定位图表中的所有系列,您可以使用 plotOptions.series 对象。对于特定类型的系列,您将访问该类型的 plotOptions。例如,要定位类型为“line”的图表类型的 plotOptions,您将访问 plotOptions.line 对象。最后,特定系列的选项在 series 属性中给出(请参阅下一个要点)。
  • series: [array] or {object} - 这是您传入数据的地方。您还可以定义要传入的数据类型,为其命名,并为其定义其他 plotOptions。

查看结果!

Highcharts 海洋潮汐图的屏幕截图<figcaption> 多么波涛汹涌!(明白了吗?- 你知道,因为海洋……和潮汐。)</figcaption>

此信息实际上仅涵盖了冰山一角。就您可以使用 Highcharts 图形库创建的内容而言,可能性似乎无穷无尽。为什么不看看他们的 文档演示,并告诉我们您使用 InfluxDB 和 Highcharts 的新作品?有问题和意见?您可以随时通过 Twitter 联系我们:@mschae16@influxDB。祝您制图愉快!