在间隔上添加值时,多个图表在随机时间不同步移动

时间:2017-12-12 06:19:09

标签: javascript highcharts timeserieschart

我正在尝试从UI创建动态数量的系列。选择后,后端会更新一个条目。虽然图表在大多数时间运行良好。在某个随机时间,这两个系列在http://jsfiddle.net/cRgUr/中不同步     并在几秒钟后恢复同步。我已经提到以下链接进行解决,但仍然看到了问题。     Chart not moving fluently when adding value to two lines on intervalUpdating spline chart two lines on top of eachother     以下是代码段:

function getInitialData(series){
                 var arrayOfValues=[];
                $http({
                        mode:'cors',
                        method:'GET',
                        url: '/getData',
                        headers: { 'Content-Type':'application/json' },
                        cache: false,
                        }).success(function(data) { 

                  arrayOfValues.push(/*populated by backend*/); // E.g values for y for number of series selected. If 2 series are to be drawn, at a time this array will contain arrayOfValue[0]= y value for series 1, arrayOfValue[1]=y value for series 2

                  }
                 drawgraph(series,arrayOfValues,newWidgetMetrics/*widget selected from UI*/);
                   } ).error(function(data) {
                               });
                function drawgraph(series,arrayOfValues,newWidgetMetrics1){
                         var time = (new Date()).getTime();
                    for(let p=0;p<arrayOfValues.length;p++){
                        if(p<arrayOfValues.length-1){
                                series[p].addPoint([time,arrayOfValues[p]] ,false
                                  , (series[0].data.length >= 20));// set false for all series but the last, with an animation where we want the line to start plotting after 20 seconds                    
                    }
                         else{
                            series[p].addPoint([time,arrayOfValues[p]] , true
                                      , (series[0].data.length >= 20));// set true for only the last series, with an animation where we want the line to start plotting after 20 seconds                            
                     }
                        chart.redraw();
                    }
                    arrayOfValues=[];
            }

            dataSeries=function(){
                for(var i=0;i<length;i++){
                    var obj={};
                    obj.type="line";
                    obj.data=getData();
                    obj.boostThreshold=60;
                    obj.name=newWidgetLegends[i];
                    tArray.push(obj);

                }

                return tArray;
            }

              func_plot();



            function func_plot(){ 

                $(document).ready(function() {
                    Highcharts.setOptions({
                        global: {
                            useUTC: false
                        }
                    });

                 chart=Highcharts.chart(divId, {
                    chart: {
                        height:'38%',
                        zoomType: 'x',
                        type: 'spline',
                        animation: Highcharts.svg, // don't animate in old IE
                            marginRight: 10,

                        events: {
                             load: function () {
                                 maxSamples = 60,
                                 counter = 0;
                                // set up the updating of the chart each second
                                var ser = this.series;

//                              setTimeout(function () {
                                setInterval(function (){
                                            window['arr' + count]=[];
                                        getInitialData(ser);


                            }, 1000);
                                }, 2000);


                            }
                        }
                    },

                    title: {
                        text: '',
                        style: {
                            display: 'none'
                        }
                    },

                   exporting: {
                          buttons: {
                            contextButton: {
                              y:screen.height*-0.02
                            }
                          }
                        },
                plotOptions: {
                    line: {
                        marker: {
                            enabled: false
                        }
                    },
                       events: {
                            legendItemClick: function () {
                             return false; 
                                }
                            }

                       },
                    xAxis: {
                        type: 'datetime',
                        ordinal:false,
                        labels: {
                            format: '{value:%M:%S}'
                          },
                        tickInterval: 10000,
                        title: {
                            text: newWidetXLabel,
                            marginBottom: 100
                        }
                    },
                    yAxis: {
                        title: {
                            text:newWidetYLabel,
                            min: 0,
                            max:10
                        },

                        plotLines: [{
                            value: 0,
                            width: 1,
                            color: '#808080'
                        }]
                    },


                   legend: {
                      title: {
                          text: '',
                          style: {
                              fontStyle: 'italic'
                          }
                      },
                      layout: 'horizontal',
                      align: 'right',
                      verticalAlign: 'top',
                      x: -30,
                      y: -17
                  },


                boost: {
                    seriesThreshold:2,
                    useGPUTranslations: true
                },

                    credits: {
                      enabled: false
                    },

                    tooltip: {
                        formatter: function () {
                            return Highcharts.dateFormat('%M:%S', this.x) + '<br/>' +
                                Highcharts.numberFormat(this.y, 2);
                        }
                    },

                    series: dataSeries()
                });
                });
        }

            $(window).resize(function() {
                height = chart.height,
                width = chart.width,
                chart.setSize(width, height, doAnimation = false);
            });

    }
    }

}]);

1 个答案:

答案 0 :(得分:0)

发生此问题是因为两个系列都没有在同一时刻绘制。 addPoint函数的第二个参数是一个标志,指示是否应在添加之后立即重新绘制图表。在你的代码2中重绘而不是一次。第二个系列的更新打破了第一个系列的动画(它没有时间完成)。

此处的解决方案仅在第二次调用addPoint()之后重绘图表:

 series.addPoint([x, y], false, true);
 series2.addPoint([x, y2], true, true);

现场演示: http://jsfiddle.net/kkulig/5y1dacxv/

API参考: https://api.highcharts.com/class-reference/Highcharts.Series#addPoint