Highcharts: Могу ли я анимировать изменение порядка баров на гистограмме? - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу создать график, как показано ниже.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 голосов
/ 27 декабря 2018

Highcharts предоставляет метод animate для элементов SVG, который вы можете использовать для достижения желаемого результата.Вам необходимо анимировать столбцы, метки осей и метки данных:

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

0 голосов
/ 27 декабря 2018

Кажется, нет собственной реализации.Единственная идея, которая у меня есть, - вообще не отображать метки оси 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.Или даже вы можете попробовать нарисовать только 1 текст с HTML, который содержит все метки.Затем с помощью JS переместите их, как вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...