Highcharts:我可以设置条形图上的条形动画吗?

时间:2018-12-26 18:37:39

标签: javascript animation highcharts

我想创建如下图。 https://www.reddit.com/r/interestingasfuck/comments/9togwf/the_major_world_economies_over_time/

我由Highcharts创建了这张图表。但是,我无法为改变条形的顺序设置动画。

function rotate(array, times) {
    while (times--) {
        var temp = array.shift();
        array.push(temp)
    }
}

window.data = {
    categories: ['Africa', 'America', 'Asia', 'Europe', 'Oceania'],
    y_values: [100, 200, 300, 400, 500],
    colors: ['#DC4D3A', '#E93D3F', '#83C6C7', '#46D388', '#D1D785']
};

document.getElementById("button").addEventListener("click", function () {
    for (var i = 0; i < data['y_values'].length; i++) {
        chart.series[0].data[i].update({y: data['y_values'][i]});
        chart.series[0].data[i].update({color: data['colors'][i]});
    }

    chart.xAxis[0].update({categories: data['categories']});

    rotate(data['y_values'], 1);
    rotate(data['categories'], 1);
    rotate(data['colors'], 1);
}, false);

enter image description here

我编写的所有代码都在JSFiddle中。 https://jsfiddle.net/Shinohara/35e8gbyz/

请任何人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

Highcharts为SVG元素提供了animate方法,您可以使用该方法来获得所需的结果。您需要为列,轴标签和数据标签设置动画:

document.getElementById("button").addEventListener("click", function() {
    var points = chart.series[0].points,
        ticks = chart.xAxis[0].ticks;

    points[0].graphic.animate({
        x: points[1].shapeArgs.x
    });
    points[1].graphic.animate({
        x: points[0].shapeArgs.x
    });

    points[0].dataLabel.animate({
        y: points[1].dataLabel.translateY
    });
    points[1].dataLabel.animate({
        y: points[0].dataLabel.translateY
    });

    ticks[0].label.animate({
        y: ticks[1].label.xy.y
    });

    ticks[1].label.animate({
        y: ticks[0].label.xy.y
    });

}, false);

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

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

答案 1 :(得分:0)

似乎没有本机实现。 我唯一的想法是根本不显示Y轴标签。使用SVGRenderer 绘制文本并将其另存为变量(以供进一步更新)

  chart.customText = chart.renderer.text('label name', 100, 100) // label name, X, Y
    .attr({
        useHTML: true
    })
    .css({
        fontSize: '16px' // and other CSS if necessary
    })
    .add();

然后您可以更新x,y或文本

chart.customText.attr({
  str: 'new text. You can use HTML',
  y: 150 // new value
})

您的下一步是对Y位置进行操作。甚至您可以尝试仅使用包含所有标签的HTML绘制1个文本。然后使用JS根据需要移动它们。