Highcharts:我们如何用动画对系列进行排序?

时间:2019-04-25 08:16:44

标签: highcharts

我使用水平条形图并不断更新系列数据。这是成功实现的,但是现在我希望这些序列按动画的desc顺序按数据排序(连续更新序列)。我的意思是,当酒吧获得最大值时,将其与动画一起移到顶部。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

Highcharts默认不支持该类型的功能。在下面,您可以找到一个示例,该示例显示如何通过自定义代码获得所需的结果:

var options = {
    chart: {
        type: 'bar'
    },
    xAxis: {
        categories: ['Cat1', 'Cat2', 'Cat3'],
    },
    series: [{
        data: [1000, 900, 800]
    }]
};

var chart = Highcharts.chart('container', options);

// Add custom data labels
chart.series[0].points.forEach(function(point, i) {
    var x = chart.plotWidth - point.plotY + chart.plotLeft,
        y = chart.xAxis[0].ticks[i].label.xy.y;

    point.customDataLabel = chart.renderer.text(
            point.y,
            x,
            y
        )
        .css({
            color: '#000000',
            fontSize: '14px'
        })
        .attr({
            zIndex: 3
        })
        .add();

    setAlign(point.customDataLabel);
});

function setAlign(label, xPos) {
    var align = 'left',
        bbox = label.getBBox();

    if (chart.chartWidth < (xPos ? xPos : bbox.x + bbox.width) + 50) {
        align = 'right';
    }

    label.attr({
        align: align
    })
}


var update = function() {
    var points = chart.series[0].points;
    chart.series[0].setData([Math.round(Math.random() * 1000), Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)]);
};

var rotate = function() {
    var points = chart.series[0].points,
        labelX,
        ticks = chart.xAxis[0].ticks;

    var sortedPoints = points.slice();
    sortedPoints.sort(function(a, b) {
        return b.y - a.y;
    });

    points.forEach(function(point, i) {
        sortedPoints.forEach(function(sPoint, j) {
            if (point === sPoint) {

                labelX = chart.plotWidth - points[i].plotY + chart.plotLeft;

                // Animate the column
                points[i].graphic.animate({
                    x: points[j].shapeArgs.x
                });

                // Animate the label
                points[i].customDataLabel.attr({
                    text: points[i].y
                }).animate({
                    y: ticks[j].label.xy.y,
                    x: labelX
                });

                setAlign(points[i].customDataLabel, labelX);

                // Animate the axis label
                ticks[i].label.animate({
                    y: ticks[j].label.xy.y
                });
            }
        });
    });
};

document.getElementById("button").addEventListener("click", function() {
    update();
    rotate();
}, false);

实时演示: https://jsfiddle.net/BlackLabel/mg5bv3s8/

API参考: https://api.highcharts.com/class-reference/Highcharts.SVGElement#animate