代码之家  ›  专栏  ›  技术社区  ›  ilinieja

如何使Amcharts动画数据工作?

  •  0
  • ilinieja  · 技术社区  · 7 年前

    我需要创建每分钟的实时值图表,添加后最后一个条形图的值增加一分钟,一分钟后添加值为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() 方法,但没有将动画应用于图表。我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   xorspark    7 年前

    数据需要是一个全新的数组,动画才能工作,如链接的示例所示。您需要克隆修改后的数组并将其传递到animateData方法中。下面是一个使用lodash的示例 cloneDeep method

      chart.animateData(_.cloneDeep(data), {
        duration: 1000,
        complete: () => setTimeout(updateChartData, 500),
      });
    

    Updated codepen