2017-11-12 26 views
0

X軸でdatetimeを使用するハイチャートの線グラフの場合、最初にpointIntervalのデータを使用してチャートをレンダリングするには、ハイチャートとほぼほぼ一定の時間間隔のデータ

私の場合、最初のレンダリングでは、時間間隔に関係なく、正確に200個のサンプルが使用されます。例えば、与えられたチャートの期間は1週間です。最初のページには、3,024秒離れた200データポイント(7 * 24 * 60 * 60/200)が送られます。その後、60秒ごとにAjax経由で動的に更新されます。

複数のアプローチを試しましたが、Ajax 60秒のティックでは、最初のページの3,024秒のティックと同じ変更が行われるか、最初に作成されたグラフのスケールが変更されます。チャートは主に同じままですが、新しく受信したAjaxデータでゆっくり更新されます。

https://jsbin.com/zuboyeh/edit?html,outputには、これらの試みのいくつかが示されています。

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
     <title>Highcharts</title> 
     <script src="https://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script> 
     <script src="https://code.highcharts.com/highcharts.js"></script> 
     <script type="text/javascript"> 

      $(function() { 
       /* 
       Total of 6 options. 

       Using pointAdd or pointUpdate. 

       Also, three options this way 
       Option 1. Pre-load w/o time, change pointInterval, then continue with no time. Doesn't work as it changes past date formats 
       Option 2. Pre-load w/o time, then continue with time. 
       Option 3. Pre-load w/ time, then continue with time. 
       */ 

       //initially page will display daily data for one month 
       var numberOfDatapointsToDisplay=200; //Given 
       var chartDuration = 7*24*60*60; //One week given resulting in 60,4800 seconds 
       var secondsInterval = chartDuration/numberOfDatapointsToDisplay; //3024 seconds 
       var pointInterval = 1000*secondsInterval; //ms 
       var tickInterval = null; //tickInterval is the interval of the tick marks in axis units. Not sure how to handle 
       var secondsIntervalAjax=60; //One minute given for ajax request time 
       var currentTime=new Date().getTime()/1000; //UTC time 
       var secondsStart=currentTime - numberOfDatapointsToDisplay*secondsInterval; //Start a week in the past and then populate upon page load 
       var pointStart = 1000*secondsStart; //ms 

       //Get initial data 
       var data1=[],data2=[],data3=[]; 
       for (var i = 0; i < numberOfDatapointsToDisplay; i++) { 
        var v=gv(pointInterval/1000); //Data simulator for this example 
        data1[i]=v; //attempt using a single value 
        data2[i]=[secondsStart,v]; //attempt using cartesian values 
        secondsStart+=secondsInterval; 
       } 

       $("#addPoint").click(function() { 
        //Simulate ajax request using addPoint() 
        currentTime+=secondsIntervalAjax; 
        var v=gv(secondsIntervalAjax); 
        chart1.series[0].addPoint(v, true, true); //attempt using a single value 
        chart2.series[0].addPoint([currentTime,v], true, true); //attempt using cartesian values 
       }); 
       $("#updateSeries").click(function() { 
        //Simulate ajax request using update() 
        currentTime+=secondsIntervalAjax; 
        var v=gv(secondsIntervalAjax); 
        data1.push(v); 
        data2.push([currentTime,v]); 
        chart1.series[0].update({data: data1}); //attempt using a single value 
        chart2.series[0].update({data: data2}); //attempt using cartesian values 
       }); 

       $("#changePointInterval").click(function() { 
        //Try changing the pointInterval used for the initial page data and ajax data 
        chart1.series[0].update({pointInterval: secondsIntervalAjax*1000}); 
        chart2.series[0].update({pointInterval: secondsIntervalAjax*1000}); 
       }) 

       var chart1 = new Highcharts.Chart({ 
        chart: { 
         type: "line", 
         renderTo: 'container1' 
        }, 
        xAxis: { 
         type: "datetime", 
         //tickInterval: tickInterval, 
         //tickPixelInterval: 50 
        }, 
        series: [ 
         {name: 'SeriesName', data: data1}, 
        ], 
        plotOptions: { 
         series: { 
          pointStart: pointStart, 
          pointInterval: pointInterval, 
         } 
        }, 
       }); 
       var chart2 = new Highcharts.Chart({ 
        chart: { 
         type: "line", 
         renderTo: 'container2' 
        }, 
        xAxis: { 
         type: "datetime", 
         //tickInterval: tickInterval, 
         dateTimeLabelFormats: {month: '%e. %b',year: '%b'}, 
         tickPixelInterval: 50 
        }, 
        series: [ 
         {name: 'SeriesName', data: data2}, 
        ], 
        plotOptions: { 
         spline: { 
          marker: { 
           enabled: true 
          } 
         } 
        }, 
       }); 

       function gv(s) { 
        //Data simulator for new value after s seconds 
        if (typeof this.v == 'undefined') { 
         this.v = 100; 
        } 
        this.v=this.v+50*numberOfDatapointsToDisplay*(Math.random()-.5) * s/chartDuration; 
        return this.v; 
       } 


      }); 
     </script> 
    </head> 
    <body> 
     <button id="addPoint">addPoint</button> 
     <button id="updateSeries">updateSeries</button> 
     <button id="changePointInterval">changePointInterval</button> 
     <div id="container1" style="min-width: 310px; height: 400px; margin: 0 auto"></div> 
     <div id="container2" style="min-width: 310px; height: 400px; margin: 0 auto"></div> 
    </body> 
</html> 
+0

あなたのチャートをどのように正確に動作させたいのかよくわかりません。最初は200ポイント、 'pointInterval'は3024ポイントです(これまでのところはすべて問題ありません)。次に、x位置が最後の点x + 60秒になる別の点を追加したいとします( 'pointInterval'はこの点より小さくなるはずです)? –

+0

@ KamilKulig、はい、 'pointInterval'は60,000ミリ秒ですが、変更すると前のグラフデータに影響します。 – user1032531

答えて

1

各シリーズに定義できるのは、pointIntervalです。

1.その伝説のスイッチは両方のシリーズのために動作しますが発生します、新しい値 linkedTo:previousのために別のリンクシリーズを追加します。

は、私の頭の上に、この問題のための2つの最も簡単な解決策がありませ。 2番目のシリーズの色を、最初のシリーズとまったく同じになるように変更します。

events: { 
    load: function() { 
     var points = this.series[0].points, 
     lastPoint = points[points.length - 1]; 

     this.series[1].update({ 
     pointStart: lastPoint.x, 
     color: this.series[0].color 
     }); 
    } 
    } 

(...) 

series: [{ 
    name: 'SeriesName', 
    data: data1 
}, { 
    name: 'SeriesName', // same name as the previous series 
    pointInterval: secondsIntervalAjax * 10000, // 10 times bigger to see results faster 
    linkedTo: ':previous', 
    marker: { 
    enabled: false 
    } 
}] 

ライブデモ:ベースシリーズから最後の値を使用してpointStartを設定http://jsfiddle.net/kkulig/gtsw8t3q/

2.計算し、明示的に必要なすべての点

pointIntervalpointStartにx値を割り当てますこの場合。

+0

ありがとうKamil、私は各シリーズが1つのpointIntervalしか持つことができないと思っていましたが、肯定的ではありませんでした。 x値を明示的に割り当てる2番目の解決策を知っていましたが、最初に他の解決策を探求したかったのです。あなたの最初の解決に感謝します。 – user1032531

関連する問題