简体   繁体   English

我无法在Javascript图表上显示数据

[英]I can't show my data on a Javascript chart

I created a webpage where some numbers are displayed in real time. 我创建了一个网页,其中实时显示一些数字。 The data is sent from a Python Flask script to my JavaScript frontend using SocketIO. 数据使用SocketIO从Python Flask脚本发送到我的JavaScript前端。

I'm now trying to show this numbers on a real time chart, and for that i'm using Apexcharts. 我现在正尝试在实时图表上显示此数字,为此,我正在使用Apexcharts。 The problem is that I'm not able to put on the chart what I need. 问题是我无法按需列出图表。 I'm not getting any error at all, the chart won't work or display everything awfully. 我一点也没有收到任何错误,该图表将无法正常工作或无法显示所有内容。

As you can see, the data received from my socket is stored on numbers_received. 如您所见,从我的套接字接收的数据存储在numbers_received中。

$(document).ready(function() {
  //connect to the socket server.
  var socket = io.connect('http://' + document.domain + ':' + location.port + '/test');
  var numbers_received = [];

  //receive details from server
  socket.on('newnumber', function(msg) {
    console.log("Received" + msg.number);
    //maintain a list of ten numbers
    if (numbers_received.length >= 1) {
      numbers_received.shift()
    }
    numbers_received.push(msg.number);
    numbers_string = '';
    for (var i = 0; i < numbers_received.length; i++) {
      numbers_string = numbers_string + '<p>' + numbers_received[i].toString() + '</p>';
    }
    s
    $('#log').html(numbers_string);
  });

  /*
      // this function will generate output in this format
      // data = [
          [timestamp, 23],
          [timestamp, 33],
          [timestamp, 12]
          ...
      ]
      */
  var lastDate = 0;
  var data = [];

  function getDayWiseTimeSeries(baseval, count, yrange) {
    var i = 0;
    while (i < count) {
      var x = baseval;
      var y = numbers_received;
      data.push({
        x,
        y
      });
      lastDate = baseval
      baseval += 86400000;
      i++;
    }
  }
  getDayWiseTimeSeries(new Date('11 Feb 2017 GMT').getTime(), 10, {
    min: 10,
    max: 90
  })

  function getNewSeries(baseval, yrange) {
    var newDate = baseval + 86400000;
    lastDate = newDate
    data.push({
      x: newDate,
      y: numbers_received
    })
  }

  function resetData() {
    data = data.slice(data.length - 10, data.length);
  }
  var options = {
    chart: {
      height: 350,
      type: 'line',
      animations: {
        enabled: true,
        easing: 'linear',
        dynamicAnimation: {
          speed: 2000
        }
      },
      toolbar: {
        show: false
      },
      zoom: {
        enabled: false
      }
    },
    dataLabels: {
      enabled: false
    },
    stroke: {
      curve: 'smooth'
    },
    series: [{
      data: data
    }],
    title: {
      text: 'Dynamic Updating Chart',
      align: 'left'
    },
    markers: {
      size: 0
    },
    xaxis: {
      type: 'datetime',
      range: 777600000,
    },
    yaxis: {
      max: 100
    },
    legend: {
      show: false
    },
  }
  var chart = new ApexCharts(
    document.querySelector("#chart"),
    options
  );
  chart.render();
  var dataPointsLength = 10;
  window.setInterval(function() {
    getNewSeries(lastDate, {
      min: 10,
      max: 90
    })
    chart.updateSeries([{
      data: data
    }])
  }, 2000)

  // every 60 seconds, we reset the data 
  window.setInterval(function() {
    resetData()
    chart.updateSeries([{
      data
    }], false, true)
  }, 60000)

});

need to wait for socket.on to finish, before drawing the chart. 在绘制图表之前,需要等待socket.on完成。

socket.on is asynchronous, which means all the code after that section, socket.on是异步的,这意味着该节之后的所有代码,
will run before socket.on is finished, unless by chance socket.on runs really quickly. 将在socket.on完成之前运行,除非偶然地 socket.on运行得非常快。

try something similar to following setup (see drawChart )... 尝试类似于以下设置的操作(请参见drawChart )...

$(document).ready(function() {
  //connect to the socket server.
  var socket = io.connect('http://' + document.domain + ':' + location.port + '/test');
  var numbers_received = [];
  var lastDate = 0;
  var data = [];

  //receive details from server
  socket.on('newnumber', function(msg) {
    console.log("Received" + msg.number);
    //maintain a list of ten numbers
    if (numbers_received.length >= 1) {
      numbers_received.shift()
    }
    numbers_received.push(msg.number);
    numbers_string = '';
    for (var i = 0; i < numbers_received.length; i++) {
      numbers_string = numbers_string + '<p>' + numbers_received[i].toString() + '</p>';
    }
    $('#log').html(numbers_string);
    drawChart();
  });

  function drawChart() {
    getDayWiseTimeSeries(new Date('11 Feb 2017 GMT').getTime(), 10, {
      min: 10,
      max: 90
    })

    var options = {
      chart: {
        height: 350,
        type: 'line',
        animations: {
          enabled: true,
          easing: 'linear',
          dynamicAnimation: {
            speed: 2000
          }
        },
        toolbar: {
          show: false
        },
        zoom: {
          enabled: false
        }
      },
      dataLabels: {
        enabled: false
      },
      stroke: {
        curve: 'smooth'
      },
      series: [{
        data: data
      }],
      title: {
        text: 'Dynamic Updating Chart',
        align: 'left'
      },
      markers: {
        size: 0
      },
      xaxis: {
        type: 'datetime',
        range: 777600000,
      },
      yaxis: {
        max: 100
      },
      legend: {
        show: false
      },
    }
    var chart = new ApexCharts(
      document.querySelector("#chart"),
      options
    );
    chart.render();
    var dataPointsLength = 10;
    window.setInterval(function() {
      getNewSeries(lastDate, {
        min: 10,
        max: 90
      })
      chart.updateSeries([{
        data: data
      }])
    }, 2000)

    // every 60 seconds, we reset the data
    window.setInterval(function() {
      resetData()
      chart.updateSeries([{
        data
      }], false, true)
    }, 60000)
  }

  function getDayWiseTimeSeries(baseval, count, yrange) {
    var i = 0;
    while (i < count) {
      var x = baseval;
      var y = numbers_received;
      data.push({
        x,
        y
      });
      lastDate = baseval
      baseval += 86400000;
      i++;
    }
  }

  function getNewSeries(baseval, yrange) {
    var newDate = baseval + 86400000;
    lastDate = newDate
    data.push({
      x: newDate,
      y: numbers_received
    })
  }

  function resetData() {
    data = data.slice(data.length - 10, data.length);
  }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在Flaskr / Javascript图表上显示过去的数据? - How can i show past Data on my Flaskr/Javascript chart? 我想在我的 y 轴上显示十进制值,但我的图表没有显示数据我该如何解决? - I want to show decimal values on my y axis but my chart doesn't show data how can i fix it? 我无法在 JavaScript 中显示我的数组 - I can't show my array in JavaScript 无法使用javascript在我的HTML表单中显示数据 - Can't get javascript to show the data in my HTML form 如何将数据从symfony2控制器提取到show.html.twig中的图表中? - How can i pull data from my symfony2 controller into my chart in show.html.twig? 为什么我不能用ajax显示我的数据? - Why can't I show my data with ajax? Axios 方法获取:我的表中无法显示数据 - Axios method Get: I can't show data in my table 如果静态值有效但mySQL的动态值无效,如何使用Javascript在Chart.js中显示JSON数据? - How can I show JSON data in Chart.js with Javascript if static values are working but dynamic from mySQL are not? 我如何将真实数据从我的 javascript 函数脚本传递到 javascript 图表 js - How i can pass real data from my javascript function-script to javascript chart js 如何使用图表 js 在图表中显示我的数据 - How can i display my data in a chart using chart js
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM