2017-11-12 7 views
0

Für eine Highchart Liniendiagramm Datumzeit auf der X-Achse verwendet wird, wie kann das Diagramm zunächst mit einem pointInterval und dynamisch aktualisiert unter Verwendung eines anderen unter Verwendung von Daten wiedergegeben werden?Highchart und „fast normalen“ Zeitintervalldaten

Für meinen Fall, wodurch die ursprünglich exakt 200 Proben unabhängig von der Zeitdauer nutzen. Nehmen wir beispielsweise an, dass die Dauer eines bestimmten Diagramms 1 Woche beträgt. Die erste Seite erhält 200 Datenpunkte im Abstand von 3.024 Sekunden (7 * 24 * 60 * 60/200). Dann wird es alle 60 Sekunden über Ajax dynamisch aktualisiert.

Ich habe versucht, mehrere Ansätze, aber entweder die Ajax 60 Sekunden Ticks produzieren die gleiche Änderung wie die erste Seite 3,024 Sekunden Ticks oder die anfänglich erstellte Skala verändert oder einige andere unerwünschte Ergebnis. Das Diagramm sollte in erster Linie gleich bleiben, aber langsam mit den neu empfangenen Ajax-Daten aktualisiert werden.

folgende an https://jsbin.com/zuboyeh/edit?html,output zeigt mehrere dieser Versuche.

<!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

Ich verstehe nicht ganz, wie Sie möchten, dass sich Ihr Diagramm genau verhält. Anfangs hast du 200 Punkte und "pointInterval" 3024s (alles ist bei weitem in Ordnung). Dann willst du einen weiteren Punkt hinzufügen, dessen x-Position der letzte Punkt x + 60 Sekunden sein soll ('pointInterval' sollte ab diesem Punkt kleiner werden)? –

+0

@KamilKulig, ja, 'pointInterval' ist jetzt 60.000 ms, aber die Änderung wirkt sich auf die vorherigen Diagrammdaten aus. – user1032531

Antwort

1

Für jede Serie kann nur eine pointInterval definiert werden.

sind es 2 am einfachsten Lösungen für dieses Problem auf der Oberseite meines Kopfes:

1. eine andere verknüpfte Serie hinzufügen für neue Werte linkedTo:previous wird, dass Legende Schalter verursachen wird für beide Serien arbeiten. Ändern Sie die Farbe der zweiten Serie so, dass sie genau so aussieht wie die erste. Stellen Sie pointStart den letzten Wert von der Basis-Serie mit:

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 
    } 
}] 

Live-Demo:http://jsfiddle.net/kkulig/gtsw8t3q/

2. Compute und explizit x-Wert zu jedem Punkt

Kein pointInterval und pointStart zuordnen erforderlich in diesem Fall.

+0

Dank Kamil, ich vermutete, dass jede Serie nur einen PunktInterval haben konnte, war aber nicht positiv. wusste über Ihre zweite Lösung, die explizit einen x-Wert zuweist, wollte aber zuerst andere Lösungen erkunden. Vielen Dank für Ihre erste Lösung. – user1032531