我想创建如下图。 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);
我编写的所有代码都在JSFiddle中。 https://jsfiddle.net/Shinohara/35e8gbyz/
请任何人可以帮助我吗?
答案 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根据需要移动它们。