如何使 Amcharts animateData 工作?
How to make Amcharts animateData working?
我需要创建每分钟实时值图表,它的最后一个柱值在添加后增加一分钟,一分钟后添加值为 1 的新柱,第一个柱(最旧的)是已删除。
我需要像下面的示例一样对所有这些更改进行动画处理。
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"theme": "light",
"dataProvider": generateChartData(),
"graphs": [{
"valueField": "value",
"type": "column",
"fillAlphas": 1,
"alphaField": "alpha1"
}, {
"valueField": "value2",
"fillAlphas": 1,
"type": "column",
"alphaField": "alpha2"
}],
"valueAxes": [{
"minimum": 0,
"maximum": 400
}],
"chartCursor": {},
"categoryAxis": {
"parseDates": true,
"minPeriod": "mm"
},
"zoomOutOnDataUpdate": false,
"categoryField": "date"
});
function generateChartData() {
var chartData = [];
var firstDate = new Date( 2012, 0, 1 );
firstDate.setDate( firstDate.getDate() - 1000 );
firstDate.setHours( 0, Math.floor(Math.random() * 10), 0, 0 );
for ( var i = 0; i < 10; i++ ) {
var newDate = new Date( firstDate );
newDate.setHours( 0, i, 0, 0 );
var a = Math.round( Math.random() * ( 200 + i ) ) + 100 + i;
var b = Math.round( Math.random() * ( 200 + i ) ) + 100 + i;
chartData.push( {
date: newDate,
value: a,
value2: b,
alpha1: (Math.random() < 0.5 ? 0 : 1),
alpha2: (Math.random() < 0.5 ? 0 : 1)
} );
}
return chartData;
}
function loop() {
var data = generateChartData();
chart.animateData(data, {
duration: 1000,
complete: function () {
setTimeout(loop, 2000);
}
});
}
chart.addListener("init", function () {
setTimeout(loop, 1000);
});
html, body {
width: 100%;
height: 100%;
margin: 0px;
}
#chartdiv {
width: 100%;
height: 100%;
}
<script src="https://www.amcharts.com/lib/3/amcharts.js"></script>
<script src="https://www.amcharts.com/lib/3/serial.js"></script>
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<script src="https://www.amcharts.com/lib/3/plugins/animate/animate.min.js"></script>
<div id="chartdiv"></div>
我设置了带条形图的代码笔及其数据更新here。我在示例中使用 animateData()
方法,但没有动画应用于图表。我做错了什么?
数据需要是一个全新的数组才能使动画正常工作,如您链接的示例中所示。您需要克隆修改后的数组并将其传递给 animateData 方法。这是一个使用 lodash 的 cloneDeep
method
的例子
chart.animateData(_.cloneDeep(data), {
duration: 1000,
complete: () => setTimeout(updateChartData, 500),
});
我需要创建每分钟实时值图表,它的最后一个柱值在添加后增加一分钟,一分钟后添加值为 1 的新柱,第一个柱(最旧的)是已删除。
我需要像下面的示例一样对所有这些更改进行动画处理。
var chart = AmCharts.makeChart("chartdiv", {
"type": "serial",
"theme": "light",
"dataProvider": generateChartData(),
"graphs": [{
"valueField": "value",
"type": "column",
"fillAlphas": 1,
"alphaField": "alpha1"
}, {
"valueField": "value2",
"fillAlphas": 1,
"type": "column",
"alphaField": "alpha2"
}],
"valueAxes": [{
"minimum": 0,
"maximum": 400
}],
"chartCursor": {},
"categoryAxis": {
"parseDates": true,
"minPeriod": "mm"
},
"zoomOutOnDataUpdate": false,
"categoryField": "date"
});
function generateChartData() {
var chartData = [];
var firstDate = new Date( 2012, 0, 1 );
firstDate.setDate( firstDate.getDate() - 1000 );
firstDate.setHours( 0, Math.floor(Math.random() * 10), 0, 0 );
for ( var i = 0; i < 10; i++ ) {
var newDate = new Date( firstDate );
newDate.setHours( 0, i, 0, 0 );
var a = Math.round( Math.random() * ( 200 + i ) ) + 100 + i;
var b = Math.round( Math.random() * ( 200 + i ) ) + 100 + i;
chartData.push( {
date: newDate,
value: a,
value2: b,
alpha1: (Math.random() < 0.5 ? 0 : 1),
alpha2: (Math.random() < 0.5 ? 0 : 1)
} );
}
return chartData;
}
function loop() {
var data = generateChartData();
chart.animateData(data, {
duration: 1000,
complete: function () {
setTimeout(loop, 2000);
}
});
}
chart.addListener("init", function () {
setTimeout(loop, 1000);
});
html, body {
width: 100%;
height: 100%;
margin: 0px;
}
#chartdiv {
width: 100%;
height: 100%;
}
<script src="https://www.amcharts.com/lib/3/amcharts.js"></script>
<script src="https://www.amcharts.com/lib/3/serial.js"></script>
<script src="https://www.amcharts.com/lib/3/themes/light.js"></script>
<script src="https://www.amcharts.com/lib/3/plugins/animate/animate.min.js"></script>
<div id="chartdiv"></div>
我设置了带条形图的代码笔及其数据更新here。我在示例中使用 animateData()
方法,但没有动画应用于图表。我做错了什么?
数据需要是一个全新的数组才能使动画正常工作,如您链接的示例中所示。您需要克隆修改后的数组并将其传递给 animateData 方法。这是一个使用 lodash 的 cloneDeep
method
chart.animateData(_.cloneDeep(data), {
duration: 1000,
complete: () => setTimeout(updateChartData, 500),
});