2013-05-06 1 views
0

Я успешно реализовал Highcharts, который работает очень хорошо. Мои высокие диаграммы получают данные в реальном времени каждые 1 минуту и ​​добавляют очки, которые делают так, как ожидалось. Но у меня есть определенная проблема: Мои старшие серии имеют две серии First - это линейка линейных рядов, а вторая - серия типов. Первая серия будет получать только 2 очка, а вторая - более 200 очков. Поскольку я сказал вам, что мои данные в прямом эфире, данные начинаются в 7 часов утра только для линейных и пустых данных для области до 9 часов ночи с точностью до 9 часов. Новые данные начнут появляться каждые 1 минуту до 12:30 вечера, но то, что происходит в 9:00 моей диаграмме идет на остановку и даже на следующий день на следующий день 7 утра моя остановка диаграммыHighcharts с новыми данными от jSON не работает

Но если я обновляю свой браузер, я получаю новые данные, и он начнет работать по мере необходимости.

Мой код следующим

$(function() { 
    $('#container').highcharts({ 
     credits: { 
      enabled: 0 
     }, 
     title: { 
      text: null 
     },  
     xAxis: { 
      type: 'datetime', 
      dateTimeLabelFormats: { 
       minute: '%H:%M' 
      }, 
      max: <%= MilliTimeStamp(_closingTime) %> , 
      min: <%= MilliTimeStamp(_openingTime) %> , 
      tickInterval: 0.5 * 3600 * 1000, 
      minorTickInterval: 0.1 * 3600 * 1000, 
      title: { 
       text: null 
      }, 
      lineWidth: 1, 
      minorGridLineWidth: 1, 
      endOnTick: true, 
      showLastLabel: true, 
      gridLineWidth: 1, 
      labels: { 
       style: { 
        font: '7.5pt Trebuchet MS' 
       } 
      }, 
      reversed: <%= isArabic %> // true for arabic layout and false for english layout 
     }, 
     yAxis: { 
      title: { 
       text: null 
      }, 
      max: <%= maxY %> , 
      min: <%= minY %> , 
      endOnTick: true, 
      showLastLabel: true, 
      labels: { 
       style: { 
        font: '7.5pt Trebuchet MS' 
       } 
      }, 
      opposite: <%= isArabic %> // true for arabic layout and false for english layout 
     }, 
     legend: { 
      enabled: false 
     }, 
     plotOptions: { 
      area: { 
       fillColor: { 
        linearGradient: { 
         x1: 0, 
         y1: 0, 
         x2: 0, 
         y2: 1 
        }, 
        stops: [ 
         [0, Highcharts.getOptions().colors[0]], 
         [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')] 
        ] 
       }, 
       lineWidth: 1, 
       marker: { 
        enabled: false 
       }, 
       shadow: false, 
       states: { 
        hover: { 
         lineWidth: 1 
        } 
       }, 
       threshold: null 
      }, 
      line: { 
       lineWidth: 1, 
       marker: { 
        enabled: false 
       }, 
       shadow: false, 
       states: { 
        hover: { 
         lineWidth: 1 
        } 
       }, 
       threshold: null 
      } 
     }, 
     tooltip: { 
      formatter: function() { 
       return '<span style="font-size:7.5pt;">' + Highcharts.dateFormat('%A, %e %B, %H:%M', this.points[0].x) + '</span><br><span style="color:' + this.points[0].series.color + ';">' + this.points[0].series.name + '</span>: <b>' + Highcharts.numberFormat(this.points[0].y, 0) + '</b>'; 
      }, 
      useHTML: true, 
      shared: true 
     }, 
     series: [{ 
      type: 'area', 
      data: [] 
     }, { 
      type: 'line', 
      color: 'Red', 
      data: [] 
     }] 
    }); 

    <% 
    if (isArabic == "true") { %> Highcharts.setOptions({ 
      lang: { 
       months: <%= months %> , 
       weekdays: <%= days %> 
      } 
     }); <% 
    } %> 

    $.ajaxSetup({ 
     cache: false 
    }); 
    recieveData(); 
}); 

function recieveData() { 
    var pathArray = window.location.pathname.split('/'); 
    var chart = $('#container').highcharts(); 
    $.ajax({ 
     url: '/' + pathArray[1] + '/HomePageChartData.aspx', 
     dataType: 'json', 
     cache: false, 
     data: { 
      'time': new Date().getSeconds() 
     }, 
     success: function (data) { 
      chart.yAxis[0].setExtremes(data.minY, data.maxY, true, true); 
      chart.series[1].setData([]); 
      chart.series[1].name = data.lineSeriesName; 

      chart.series[0].setData([]); 
      chart.series[0].name = data.areaSeriesName; 

      for (var x in data.lineSeriesData) { 
       chart.series[1].addPoint([data.lineSeriesData[x][0], data.lineSeriesData[x][1]]); 
      } 

      for (var x in data.areaSeriesData) { 
       chart.series[0].addPoint([data.areaSeriesData[x][0], data.areaSeriesData[x][1]]); 
      } 
      setTimeout(recieveData, 60000); 
     } 
    } 
    }); 
} 

мои данные в формате JSON в 7 утра

{"maxX":"1367843400000","minX":"1367830800000","maxY":"7912","minY":"7511","tickIntervalY":"80","lineSeriesName":"Open","areaSeriesName":"Price Index","lineSeriesData":[[1367830800000,7715.35],[1367843400000,7715.35]],"areaSeriesData":[]} 

мои данные в формате JSON после 9 AM

{"maxX":"1367843400000","minX":"1367830800000","maxY":"7912","minY":"7511","tickIntervalY":"80","lineSeriesName":"Open","areaSeriesName":"Price Index","lineSeriesData":[[1367830800000,7715.35],[1367843400000,7715.35]],"areaSeriesData":[[1367830831000,7740.01],[1367830897000,7735.61]]} 

И он начнет получать новые данные в areaSeriesData каждые 1 мин.

@@ Обновление

Я нашел проблему, что в 7 утра и 9 утра я не получал данные, я получал пустую строку, поэтому я должен был ошибиться, что я не обрабатывал, теперь я меняю ее, как ниже которой начинается удаляя серию, но теперь я не получаю серию для строки в 7 утра, у которой есть данные. Может кто-то подскажет мне, чего я не вижу или делаю неправильно здесь.

function recieveData() { 
    var pathArray = window.location.pathname.split('/'); 
    var chart = $('#container').highcharts(); 
     $.ajax({ 
      url: '/' + pathArray[1] + '/_layouts/KSE.SharePoint/HomePageChartData.aspx', 
      dataType: 'json', 
      cache: false, 
      data:{'time': new Date().getSeconds() }, 
      success: function (data) { 
       chart.yAxis[0].setExtremes(data.minY, data.maxY, true, true); 
       chart.series[1].setData([]); 
       chart.series[1].name = data.lineSeriesName; 

       chart.series[0].setData([]); 
       chart.series[0].name = data.areaSeriesName; 

       for (var x in data.lineSeriesData) { 
       chart.series[1].addPoint([data.lineSeriesData[x][0], data.lineSeriesData[x][1]]); 
       } 

       for (var x in data.areaSeriesData) { 
       chart.series[0].addPoint([data.areaSeriesData[x][0], data.areaSeriesData[x][1]]); 
       } 
       setTimeout(recieveData, 60000); 
      }, 
      error: function() { 
       setTimeout(recieveData, 60000); 
      } 
      }); 
} 

ответ

0

Вы должны разобрать свой json для подготовки отдельных данных для серии. Более того, вам нужно использовать данные вместо «lineSeriesData» или «areaSeriesData». Так оно и должно выглядеть так:

[{ данные: [[1367830800000, 7715,35], [1367843400000, 7715,35]] }, { данные: [[1367830831000, 7740,01], [1367830897000, 7735,61]] }]

+0

Спасибо за ответ, но как я могу отличить, какой из них относится к линейной серии и какой из них относится к серии – Milind

+0

Вы можете использовать цикл, который будет проверять, является ли это областью (то есть по имени или индексу массива) и толкать объект в правильную серию. –

+0

Таким образом, я делаю правильный путь '{" maxX ":" 1368025200000 "," minX ":" 1368003600000 "," maxY ":" 7239 "," minY ":" 7086 "," tickIntervalY ":" 31 »,« lineSeriesName »:« Open »,« areaSeriesName »:« Индекс цен »,« данные »: [[1368003600000,7151.89], [1368025200000,7151.89]],« данные »: [[1368004289000,7150.9], [1368004355000 , 7147.44], [1368004421000,7147.44], [1368004487000,7147.44], [1368004553000,7149.58]]} ' – Milind