Highcharts:不规则数据的固定间隔

时间:2015-08-24 16:58:01

标签: javascript highcharts

我有存储过程,它返回已存储在数据库中的传感器数据。要显示值,我使用Highcharts库构建图形。

execute [sensors].[dbo].[usp_deddt] 50320001, 1, '20150801', '20150821';

有时候,有一段时间,数据不会出现 - 我得到了差距,例如:

enter image description here

然后我的直方图采用以下形式:

enter image description here

我希望在X轴上看到连续时间序列。

例如,在我的情况下应该是:

16.08.2015 15:00 16.08.2015 16:00 16.08.2015 17:00 16.08.2015 18:00

如何为不规则数据设置定期间隔?

我将非常感谢这些信息。谢谢大家。

3 个答案:

答案 0 :(得分:2)

如果我从您的示例中正确理解,您似乎正在使用x轴的类别。

您可以通过简单地删除类别并使用datetime x轴来解决此问题,而无需制作虚假数据库数据的复杂性。

您的时间戳值将用于绘制沿x轴的值,这意味着默认情况下,它们不会向数据库添加复杂性,或者不必要的循环,可以实现连续的x轴,并将数据绘制在其中确实发生了。

答案 1 :(得分:1)

我知道你不能做那么多事情。 Highcharts显示系列,所以如果你的系列有间隙,它将不会自动填充。

您可以做的是手动生成缺失的部分。例如。您可以在数据库级别生成它:

/* create a table with all possible hours */
create table hours (hour varchar2);

insert into hours values ('01:00');
insert into hours values ('02:00');
insert into hours values ('03:00');
insert into hours values ('04:00');
/* ... */

/* the same for days */
/* ... */

然后只需将您的表格与复合日期值进行外部连接,您就可以获得所有填充空白的系列。

此外,一些数据库允许您生成数据集,而不是创建这些表,有人会称之为垃圾,可能是正确的,例如,在Oracle you can use connect by level statements中实现这一目标而没有表格。

另一种方法是在JavaScript端生成它们。您将数组作为输入并通过传递缺失值来处理它。

答案 2 :(得分:0)

非常感谢所有人的帮助......我的小解决方案:

gapSize添加了Highstock属性以标记差距。

$scope.highchartsNG = {
        options: {
            chart: {
                zoomType: 'x, y'
            },

            plotOptions: {
                column: { stacking: 'normal', color: '#007a94'},
                bar: { dataLabels: {  enabled: true } }
            },
        },

        title: {
              text: ''
        },

        xAxis: {
            type: 'datetime',
            dateTimeLabelFormats: {
                month: '%e. %b',
                year: '%b'
            },
        },

        series: [{
            type : 'column',
            showInLegend: false,                
            gapSize: 1,
            data: []
        }]
}

在我的AngularJS控制器中,我编写了方法(相关部分):

... 
var measurementData = [];   
$scope.setGraphValues = function () {
    ...
    var data = $scope.tableData;
    for(var i = 0; i < data.length; i++) {
        measurementData.push([Date.UTC(yearPart, monthPart,
            dayPart, hourPart, minutePart),data[i].measureData]);
    }
    ...
    $scope.highchartsNG.series[0].data = measurementData;
}

现在一切都好。

enter image description here