简体   繁体   中英

How can i use dynamic data on a Highcharts chart?

I'm receiving data from a websocket connection on my page, i want to chart that data on a Highcharts depth chart.

Depth charts: https://www.highcharts.com/docs/stock/depth-chart

Here is my code:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script language="javascript">
    mySocket.onmessage = function(event) {
        var data = JSON.parse(event.data);
        rawAsks = data['asks']
        rawBids = data['bids']

        const asks = rawasks.map(x => x.map(y => parseFloat(y))) //DATA TO USE ON THE CHART
        const bids = rawbids.map(x => x.map(y => parseFloat(y))) //DATA TO USE ON THE CHART

    };

    Highcharts.chart('container', {
      chart: {
        type: 'area',
        zoomType: 'xy'
      },
      title: {
        text: 'ETH-BTC Market Depth'
      },
      xAxis: {
        minPadding: 0,
        maxPadding: 0,

      },
      yAxis: [{
        lineWidth: 1,
        gridLineWidth: 1,
        title: null,
        tickWidth: 1,
        tickLength: 5,
        tickPosition: 'inside',
        labels: {
          align: 'left',
          x: 8
        }
      }, {
        opposite: true,
        linkedTo: 0,
        lineWidth: 1,
        gridLineWidth: 0,
        title: null,
        tickWidth: 1,
        tickLength: 5,
        tickPosition: 'inside',
        labels: {
          align: 'right',
          x: -8
        }
      }],
      legend: {
        enabled: false
      },
      plotOptions: {
        area: {
          fillOpacity: 0.2,
          lineWidth: 1,
          step: 'center'
        }
      },
      tooltip: {
        headerFormat: '<span style="font-size=10px;">Price: {point.key}</span><br/>',
        valueDecimals: 2
      },
      series: [{
        name: 'Bids',
        data: Bids, //HERE GOES THE DATA
        color: '#03a7a8'
      }, {
        name: 'Asks',
        data: Asks, //HERE GOES THE DATA
        color: '#fc5857'
      }]
    });
</script>

Here are the problems with my chart: 1) The data to plot is asks and bids . The problem is that those two variables are updated every second from the websocket connection, so they are not static values. 2) How can i pass asks and bids to the Highcharts chart and how can i refresh the chart every time the data is refreshed? Thanks in advance!

Here is a sample of the data i receive every second and need to plot:

var sampleData = [
[7062.24, 0.402181],
[7062.56, 2.472812],
[7062.59, 0.006595],
[7063.01, 1.2001],
[7063.27, 0.4],
[7063.28, 0.100615],
[7063.48, 0.4],
[7063.76, 0.086983],
[7063.83, 0.005],
[7064.19, 0.399752],
[7064.2, 1.70819],
[7064.41, 0.25],
[7064.43, 0.015026],
]

I prepared an example where the chart is rendered with empty data and every one-second data is updated (simulation of getting the data from WebSocket).

Demo: https://jsfiddle.net/BlackLabel/zuhg390j/

events: {
  load() {
    let chart = this;
    setTimeout(function() {
      chart.series[0].update({
        data: dataBids
      }, false)

      chart.series[1].update({
        data: dataAsks
      })
    }, 1000)
  }
}

API: https://api.highcharts.com/class-reference/Highcharts.Series#update

You can use map function to get each series data as below

var data = [
        [7062.24, 0.402181],
        [7062.56, 2.472812],
        [7062.59, 0.006595],
        [7063.01, 1.2001],
        [7063.27, 0.4],
        [7063.28, 0.100615],
        [7063.48, 0.4],
        [7063.76, 0.086983],
        [7063.83, 0.005],
        [7064.19, 0.399752],
        [7064.2, 1.70819],
        [7064.41, 0.25],
        [7064.43, 0.015026],
    ];


const asks = data.map(x => x[0]); //DATA TO USE ON THE CHART
const bids = data.map(x => x[1]); //DATA TO USE ON THE CHART

 <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src = "https://code.highcharts.com/highcharts.js"></script> <div id = "container"> </div> <script language = "javascript"> var data = [ [7062.24, 0.402181], [7062.56, 2.472812], [7062.59, 0.006595], [7063.01, 1.2001], [7063.27, 0.4], [7063.28, 0.100615], [7063.48, 0.4], [7063.76, 0.086983], [7063.83, 0.005], [7064.19, 0.399752], [7064.2, 1.70819], [7064.41, 0.25], [7064.43, 0.015026], ]; const asks = data.map(x => x[0]); //DATA TO USE ON THE CHART const bids = data.map(x => x[1]); //DATA TO USE ON THE CHART Highcharts.chart('container', { chart: { type: 'area', zoomType: 'xy' }, title: { text: 'ETH-BTC Market Depth' }, xAxis: { minPadding: 0, maxPadding: 0, }, yAxis: [{ lineWidth: 1, gridLineWidth: 1, title: null, tickWidth: 1, tickLength: 5, tickPosition: 'inside', labels: { align: 'left', x: 8 } }, { opposite: true, linkedTo: 0, lineWidth: 1, gridLineWidth: 0, title: null, tickWidth: 1, tickLength: 5, tickPosition: 'inside', labels: { align: 'right', x: -8 } }], legend: { enabled: false }, plotOptions: { area: { fillOpacity: 0.2, lineWidth: 1, step: 'center' } }, tooltip: { headerFormat: '<span style="font-size=10px;">Price: {point.key}</span><br/>', valueDecimals: 2 }, series: [{ name: 'Bids', data: bids, //HERE GOES THE DATA color: '#03a7a8' }, { name: 'Asks', data: asks, //HERE GOES THE DATA color: '#fc5857' }] }); </script>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM