1

我目前正在使用 highstock 来绘制基于全天时间的可用项目总数(然后实时更新)。

如果项目总数的两个变化同时发生,在 highstock 我得到一个垂直条的差异:

同时y轴变化

因此,在我的示例图像中,我们从 4299 个事物开始,然后删除了 53 个项目并添加了 50 个(技术上是同时,但是是两个不同的事务并且是两个点)。净差为-3。(或者换句话说,我得到 {x: 5:44:15 and y: 4246, change: -53}, {x: 5:44:15, y: 4296, change: 50})。

所以我的问题是:在 highstock 中是否可以合并这些点以摆脱垂直条并使用 4296 作为显示值?我希望然后我可以使用工具提示格式化程序循环“this.points”并在工具提示中显示 -53 的变化和 50 的变化,以便用户可以看到导致 -3 的净变化的原因。

如果这不可能,我将自己合并这些点并传递点中的所有相关信息以生成我想要的工具提示(和图表外观),但想看看我是否可以利用所有功能highstock 首先 - 并将这些点分开。

谢谢!

编辑::

new Highcharts.StockChart({
                        chart : {
                            renderTo : 'realTimeChart',
                            zoomType: 'x',
                            backgroundColor: '#feffdd',
                            style: {
                                fontFamily: 'Segoe UI'
                            },
                            type: 'spline'
                        },

                        plotOptions: {
                            area: { animation: false },
                            arearange: { animation: false },
                            areaspline: { animation: false },
                            areasplinerange: { animation: false },
                            bar: { animation: false },
                            column: { animation: false },
                            columnrange: { animation: false },
                            gauge: { animation: false },
                            line: { animation: false },
                            pie: { animation: false },
                            scatter: { animation: false },
                            series: { animation: false },
                            spline: { animation: false }
                        },

                        xAxis: {
                            ordinal: false
                        },

                        tooltip: {
                            animation: false,
                            formatter: function() {
                                var p = '';

                                p += '<span style="font-size: 9px;">' + Highcharts.dateFormat('%A, %b %e, %Y %H:%M:%S', this.x) +'</span><br/>';
                                $.each(this.points, function(i, point){
                                    p += '<span style="color:' + this.series.color + '">' + this.series.name + '</span>: <b>'+ this.y +'</b>';
                                    if (point.point.where) {
                                        p += '<br />' + point.point.where + ' changed by ' + point.point.change + (point.point.who ? ' (' + point.point.who + ')' : '');
                                    }
                                });

                                return p;

                            }
                        },

                        rangeSelector: {
                            buttons: [{
                                count: 30,
                                type: 'minute',
                                text: '30M'
                            }, {
                                count: 1,
                                type: 'hour',
                                text: '1H'
                            }, {
                                count: 6,
                                type: 'hour',
                                text: '6H'
                            }, {
                                type: 'all',
                                text: 'Day'
                            }],
                            inputEnabled: false,
                            selected: 1
                        },

                        exporting: {
                            enabled: false
                        },

                        series : [{
                            name : 'Available',
                            data : data,
                            lineWidth: 1,
                            states: {
                                hover: {
                                    enabled: false
                                }
                            }
                        }]

数据采用我之前显示的格式,除了 x 实际上是自纪元以来的毫秒数:

data = [
        {x: 123456789, y: 2000, where: 'Location', change: 40, who: 'Joe'},
        {x: 123456789, y: 1960, where: 'Location', change: -40, who: 'Bob'},
        ...
    ];
4

1 回答 1

0

只是想跟进我是如何轻松绕过这个问题的。我决定将积分组合到最接近的分钟,而不是按秒排列(所以我有分钟数)。

然后对于每个点,我传入该分钟块中包含的实际点数组作为新参数,并更新该分钟块的 y 值。然后我使用工具提示格式化程序来显示该分钟块内的所有更改及其实际更改时间。这给了我一个更流畅的图表,而不是同一 x 轴的所有这些硬垂直点。

为了轻松更改特定 x 轴点的数据点,我在 series.data 数组中为 highcharts 保留了一个单独的分钟块位置数组,这样如果我需要更新一个块,我就知道确切的位置时间序列是。

以下是我完成任务的方式:我创建了引用数组:

var pointIndex = {};

我根据当天的历史数据创建了初始数据系列(通过 ajax 提取):

var data = [];
var time = Math.floor(actual_time / 60000) * 60000;
pointIndex[time] = data.push({x: time, y: items_available, change: [{when: actual_time}]});

因此,actual_time 是自纪元以来的毫秒数(发生偶数变化时),然后我将其四舍五入到最接近的分钟以获得分钟时间块,change 是将所有实际点保存在工具提示中显示的参数。

因此,当我添加一个新点时,我会检查分钟块是否存在,如果不存在,则添加一个新点,否则更新一个旧点:

var time = (new Date()).getTime();
var point = Math.floor(time / 60000) * 60000;
if (pointIndex[point]) {
    var change = chart.series[0].data[pointIndex[point]].change;
    change.push({when: time});
    chart.series[0].data[pointIndex[point]].update({x: point, y: items_available, change: change});
} else {
    pointIndex[point] = chart.series[0].data.length;
    chart.series[0].addPoint({x: point, y: items_available, change: [{when: time}]}, false, false);
}

(在所有情况下,我在完成更新点后都会进行实际的图表刷新。)

希望这将帮助其他发现自己处于相同位置的人!

编辑:: (忘记格式化程序):

tooltip: {
    animation: false,
    formatter: function() {
        var p = '';

        p += '<span style="font-size: 9px;">' + Highcharts.dateFormat('%A, %b %e, %Y %H:%M', this.x) +'</span><br/>';
        $.each(this.points, function(i, point){
            p += '<span style="color:' + this.series.color + '">' + this.series.name + '</span>: <b>'+ this.y +'</b>';
            if (point.point.change) {
                for(var j = 0; j < point.point.change.length; ++j) {
                    p += '<br />Change at: ' + new Date(point.point.change[j].when).toTimeString();
                }
            }
        });

        return p;

    }
}
于 2012-11-20T15:58:21.877 回答