W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們?cè)?a href="http://www.o2fo.com/echarts_tutorial/echarts_tutorial-mec528xa.html">入門(mén)第一課中是在初始化后的 setOption 中直接填入數(shù)據(jù)的,但大部分的時(shí)候我們需要將數(shù)據(jù)異步加載后再填入。那么怎么實(shí)現(xiàn)?
ECharts 中實(shí)現(xiàn)異步數(shù)據(jù)的更新的操作不難,在初始化圖表后的任何時(shí)間通過(guò)使用 jQuery 等工具異步獲取數(shù)據(jù)后通過(guò) setOption 填入數(shù)據(jù)和配置項(xiàng)即可,操作如下:
var myChart = echarts.init(document.getElementById('main'));
$.get('data.json').done(function (data) {
myChart.setOption({
title: {
text: '異步數(shù)據(jù)加載示例'
},
tooltip: {},
legend: {
data:['銷(xiāo)量']
},
xAxis: {
data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
},
yAxis: {},
series: [{
name: '銷(xiāo)量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
});
});
還有一種方法是先設(shè)置好別的樣式,顯示出一個(gè)空的直角坐標(biāo)軸,然后獲取并填入數(shù)據(jù),操作如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>w3cschool (www.o2fo.com) </title>
<!-- 引入 echarts.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></script>
</head>
<body>
<!-- 為ECharts準(zhǔn)備一個(gè)具備大?。▽捀撸┑腄om -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main'));
// 顯示標(biāo)題,圖例和空的坐標(biāo)軸
function fetchData(cb) {
// 通過(guò) setTimeout 模擬異步加載
setTimeout(function () {
cb({
categories: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"],
data: [5, 20, 36, 10, 10, 20]
});
}, 3000);
}
// 初始 option
option = {
title: {
text: '異步數(shù)據(jù)加載示例'
},
tooltip: {},
legend: {
data: ['銷(xiāo)量']
},
xAxis: {
data: []
},
yAxis: {},
series: [{
name: '銷(xiāo)量',
type: 'bar',
data: []
}]
};
myChart.setOption(option);
fetchData(function (data) {
myChart.hideLoading();
myChart.setOption({
xAxis: {
data: data.categories
},
series: [{
// 根據(jù)名字對(duì)應(yīng)到相應(yīng)的系列
name: '銷(xiāo)量',
data: data.data
}]
});
});
</script>
</body>
</html>
效果顯示如下:
ECharts 中通過(guò) name 屬性在更新數(shù)據(jù)的時(shí)候?qū)?yīng)到相應(yīng)的系列。
上面示例中如果 name 不存在也可以根據(jù)系列的順序正常更新,但是更多時(shí)候推薦更新數(shù)據(jù)的時(shí)候加上系列的 name 數(shù)據(jù)。
有時(shí)候由于各種原因,數(shù)據(jù)的加載會(huì)需要較多的時(shí)間,這樣一個(gè)空白的直角坐標(biāo)系會(huì)讓用戶(hù)認(rèn)為出現(xiàn) bug 了,為了避免這種錯(cuò)覺(jué),我們需要使用 loading 動(dòng)畫(huà)給用戶(hù)一些提示。
利用 Echarts 提供的加載動(dòng)畫(huà),我們通過(guò)調(diào)用 showLoading 方法顯示加載動(dòng)畫(huà),當(dāng)數(shù)據(jù)加載完成后再調(diào)用 hideLoading 方法將加載動(dòng)畫(huà)隱藏。
具體操作如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>w3cschool (www.o2fo.com) </title>
<!-- 引入 echarts.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></script>
</head>
<body>
<!-- 為ECharts準(zhǔn)備一個(gè)具備大?。▽捀撸┑腄om -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main'));
// 顯示標(biāo)題,圖例和空的坐標(biāo)軸
function fetchData(cb) {
// 通過(guò) setTimeout 模擬異步加載
setTimeout(function () {
cb({
categories: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"],
data: [5, 20, 36, 10, 10, 20]
});
}, 3000);
}
// 初始 option
option = {
title: {
text: '異步數(shù)據(jù)加載示例'
},
tooltip: {},
legend: {
data: ['銷(xiāo)量']
},
xAxis: {
data: []
},
yAxis: {},
series: [{
name: '銷(xiāo)量',
type: 'bar',
data: []
}]
};
myChart.showLoading();
myChart.setOption(option);
fetchData(function (data) {
myChart.hideLoading();
myChart.setOption({
xAxis: {
data: data.categories
},
series: [{
// 根據(jù)名字對(duì)應(yīng)到相應(yīng)的系列
name: '銷(xiāo)量',
data: data.data
}]
});
});
</script>
</body>
</html>
設(shè)置完效果如下:
數(shù)據(jù)為加載完成,顯示加載動(dòng)畫(huà):
ECharts 由數(shù)據(jù)驅(qū)動(dòng),數(shù)據(jù)的改變驅(qū)動(dòng)圖表展現(xiàn)的改變,因此動(dòng)態(tài)數(shù)據(jù)的實(shí)現(xiàn)也變得異常簡(jiǎn)單。
Echarts 中通過(guò) setOption 更新所有的數(shù)據(jù),我們要做的只是定時(shí)獲取數(shù)據(jù),然后使用 setOption 填入數(shù)據(jù),至于數(shù)據(jù)在過(guò)程中發(fā)生了哪些變化,不在我們的考慮范圍內(nèi)。
ECharts 會(huì)找到兩組數(shù)據(jù)之間的差異然后通過(guò)合適的動(dòng)畫(huà)去表現(xiàn)數(shù)據(jù)的變化。
ECharts 3 中移除了 ECharts 2 中的 addData 方法。如果只需要加入單個(gè)數(shù)據(jù),可以先 data.push(value) 后 setOption
具體可以看下面示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>w3cschool (www.o2fo.com) </title>
<!-- 引入 echarts.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></script>
</head>
<body>
<!-- 為ECharts準(zhǔn)備一個(gè)具備大小(寬高)的Dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
var myChart = echarts.init(document.getElementById('main'));
var base = +new Date(2020, 7, 30);
var oneDay = 24 * 3600 * 1000;
var date = [];
var data = [Math.random() * 150];
var now = new Date(base);
function addData(shift) {
now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/');
date.push(now);
data.push((Math.random() - 0.4) * 10 + data[data.length - 1]);
if (shift) {
date.shift();
data.shift();
}
now = new Date(+new Date(now) + oneDay);
}
for (var i = 1; i < 100; i++) {
addData();
}
option = {
xAxis: {
type: 'category',
boundaryGap: false,
data: date
},
yAxis: {
boundaryGap: [0, '50%'],
type: 'value'
},
series: [
{
name: '成交',
type: 'line',
smooth: true,
symbol: 'none',
stack: 'a',
areaStyle: {
normal: {}
},
data: data
}
]
};
setInterval(function () {
addData(true);
myChart.setOption({
xAxis: {
data: date
},
series: [{
name: '成交',
data: data
}]
});
}, 500);
myChart.setOption(option);
</script>
</body>
</html>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: