如何动态调整dataGrouping并为HighStock数据设置可变时间间隔(HighCharts)

时间:2015-04-01 01:22:59

标签: highcharts highstock

我遇到很多问题让HighStock使用dataGrouping,以便在需要时显示正确的单位,我经常遇到运行时错误。

背景:我正在根据新近度加载不同粒度的时间序列数据,因此对于小于8小时的指标,数据的粒度是每分钟,对于任何数据,最多14天,按小时,对于超过14天的数据,它是每天测量的。我假设可以使用dataGrouping,但是在明确更改分组时遇到了一些问题(请参阅http://jsfiddle.net/xckaxaf2/8/获取完整示例):

chart.series[0].update({ dataGrouping: { units: [ ['minute', [1]] ] } });

我遇到的问题是:

  • 如果我指定说单位的数据分组:[['分钟',[1]],['小时',[1]],['月',[1]]],我无法控制当使用每种类型的分组时。这是一个问题,因为如果将极值设置为1分钟间隔8小时数据之前的时间并且它使用分钟则数据不完整,并且默认情况下,分组在不到一小时时不正确。我需要一些明确的方法来设置分组。
  • 如果我以编程方式更改dataGroupings,我会得到两个错误:Uncaught TypeError:object不是函数(索引):83,Highcharts.StockChart.chart.events.redraw和Uncaught TypeError:无法读取undefined的属性'length', jquery-1.9.1.js:747 jQuery.extend.grephighstock.js:259。您可以通过单击24h或1m轻松地在JSFiddle中看到此错误。

有谁知道如何解决这些问题并根据极端情况下的数据动态设置dataGrouping间隔?

我在https://github.com/highslide-software/highcharts.com/issues/4050

提出了一个问题

1 个答案:

答案 0 :(得分:1)

作为解决方案/解决方法,您可以包装负责dataGrouping的方法,并在那里设置该选项:http://jsfiddle.net/xckaxaf2/9/

(function (H) {
    H.wrap(H.Series.prototype, "processData", function (c) {

        var chart = this.chart,
            dg = this.options.dataGrouping,
            currentUnits = dg.units[0][0],
            min = chart.xAxis[0].min,
            targetUnit = getUnitFromRangeStart(min);


        if (currentUnits !== targetUnit) {
            console.log('Changing interval from ' + currentUnits + ' to ' + targetUnit);
            /* Change grouping for all charts other than the navigator */
            dg.units = [
                [targetUnit, [1]]
            ];
        }
        c.call(this);

    });
})(Highcharts);

只需确保将dataGrouping.forced选项设置为true即可。因此将始终使用dataGrouping。