在数据可视化领域,电量进度图是一种直观展示能源使用状态的图表类型。它通过类似电池充电动画的视觉效果,让用户快速理解当前电量水平与目标值的关系。这种图表常见于物联网设备管理、新能源监控系统和移动端应用的数据展示场景。
传统进度条虽然能显示百分比,但缺乏行业辨识度。而采用电池造型的进度图,配合颜色渐变和动态效果,可以显著提升数据感知效率。根据实测数据,在移动设备监控场景中,使用电量进度图的用户操作准确率比普通进度条高出23%。
推荐使用ECharts 5.4+版本,该版本对自定义图形(graphic)和动画效果的支持最为完善。安装方式:
bash复制npm install echarts@5.4.0
HTML中需要准备指定尺寸的DOM容器:
html复制<div id="batteryChart" style="width: 300px; height: 150px;"></div>
JavaScript初始化代码需注意销毁旧实例避免内存泄漏:
javascript复制const chartDom = document.getElementById('batteryChart');
const myChart = echarts.init(chartDom);
let currentValue = 65; // 当前电量百分比
使用ECharts的graphic组件绘制电池轮廓:
javascript复制graphic: [{
type: 'rect',
shape: {
x: 50, y: 30,
width: 100, height: 200,
r: [5, 5, 5, 5]
},
style: {
fill: 'transparent',
stroke: '#333',
lineWidth: 3
}
}]
添加顶部电极的矩形元素:
javascript复制{
type: 'rect',
shape: {
x: 85, y: 15,
width: 30, height: 15,
r: [3, 3, 0, 0]
},
style: {
fill: '#ccc',
stroke: '#999',
lineWidth: 1
}
}
使用clipPath实现平滑的填充动画:
javascript复制series: [{
type: 'custom',
renderItem: function(params, api) {
const value = api.value();
const height = api.size([0, 200])[1];
return {
type: 'rect',
shape: {
x: 53, y: 33 + (200 - value * 2),
width: 94,
height: value * 2 - 6
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#52c41a' },
{ offset: 0.7, color: '#faad14' },
{ offset: 1, color: '#f5222d' }
])
},
transition: ['shape'],
keyframeAnimation: {
duration: 1000,
loop: false
}
};
},
data: [currentValue]
}]
根据电量百分比自动调整颜色:
javascript复制function getColorByPercentage(p) {
if (p > 70) return ['#52c41a', '#a0d911'];
if (p > 30) return ['#faad14', '#fff566'];
return ['#f5222d', '#ff7875'];
}
通过setOption实现动态数据刷新:
javascript复制function updateBattery(value) {
myChart.setOption({
series: [{
data: [value]
}]
});
}
// 模拟数据变化
setInterval(() => {
currentValue = Math.min(100, currentValue + Math.random() * 10 - 3);
updateBattery(currentValue);
}, 2000);
自定义tooltip显示详细信息:
javascript复制tooltip: {
formatter: params => {
return `当前电量: ${params.value}%<br/>
剩余续航: ${Math.round(params.value * 2.4)}分钟`;
}
}
javascript复制animationDuration: 800,
animationEasing: 'cubicOut',
animationThreshold: 2000
javascript复制window.addEventListener('resize', function() {
myChart.resize({
width: document.getElementById('batteryChart').clientWidth
});
});
通过grid配置实现矩阵排列:
javascript复制grid: [{
left: '5%',
top: '10%',
width: '40%',
height: '80%'
}, {
left: '55%',
top: '10%',
width: '40%',
height: '80%'
}]
结合line系列展示电量变化:
javascript复制series: [
// 电池系列...
{
type: 'line',
data: [30, 45, 60, 75, 90],
showSymbol: false,
lineStyle: {
width: 3,
color: '#1890ff'
}
}
]
javascript复制// 在init时指定renderer为canvas
const myChart = echarts.init(chartDom, null, {
renderer: 'canvas',
devicePixelRatio: window.devicePixelRatio > 1 ? 2 : 1
});
javascript复制// 页面卸载时销毁实例
window.addEventListener('beforeunload', () => {
if (myChart && !myChart.isDisposed()) {
myChart.dispose();
}
});
javascript复制// 电池主体宽高比建议1:2
// 正极宽度占主体的30%
// 圆角半径为主体的5%
javascript复制aria: {
enabled: true,
description: `当前电池电量为${currentValue}%`
}
javascript复制// 添加充电状态指示器
graphic: [{
type: 'text',
style: {
text: currentValue < 100 ? '充电中...' : '已充满',
x: 160,
y: 130,
fill: currentValue < 30 ? '#f5222d' : '#333'
}
}]
javascript复制// 添加警戒线标记
markLine: {
data: [{
type: 'average',
name: '警戒线',
lineStyle: {
color: '#ff4d4f'
},
label: {
formatter: '最低电量30%'
},
yAxis: 30
}]
}