ECharts 气泡图动画效果:大小与颜色动态变化
在数据可视化场景中,静态图表往往难以直观展示数据的变化趋势。气泡图(Bubble Chart)通过气泡大小和颜色的组合,可以同时呈现三维数据关系,但传统静态气泡图无法体现数据随时间的演变。ECharts 提供的特效散点图(EffectScatter)组件支持气泡动态变化效果,本文将通过实例演示如何实现气泡大小与颜色的实时动画效果。
技术原理与核心配置
ECharts 的特效散点图通过 effectScatter 类型系列实现动态效果,核心配置包括:
- 动态大小控制:通过
symbolSize回调函数根据数据值动态计算气泡尺寸 - 颜色映射:结合
visualMap组件实现数据值到颜色的映射 - 动画效果:通过
rippleEffect配置波纹动画参数,hoverAnimation控制交互动画
series: [{
type: 'effectScatter',
rippleEffect: {
brushType: 'stroke', // 波纹绘制方式:'stroke' 或 'fill'
scale: 5, // 波纹最大缩放比例
period: 4 // 波纹动画周期(秒)
},
symbolSize: function(val) {
return val[2] / 5; // 根据数据值动态计算大小
},
itemStyle: {
color: function(params) {
// 自定义颜色逻辑
return params.data[2] > 100 ? '#ff4444' : '#32cd32';
}
}
}]
基础实现:静态气泡图
首先构建基础气泡图,以全国主要城市空气质量数据为例(数据源:test/effectScatter.html)。该示例通过 convertData 函数处理城市坐标与 PM2.5 值的映射关系:
// 数据处理函数
var convertData = function(data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value) // [经度, 纬度, PM2.5值]
});
}
}
return res;
};
// 基础气泡配置
{
type: 'effectScatter',
coordinateSystem: 'geo',
data: convertData(data),
symbolSize: function(val) {
return val[2] / 10; // PM2.5值除以10作为气泡大小
},
itemStyle: {
color: '#f4e925' // 固定黄色
}
}
动态大小实现
通过定时器 setInterval 定期更新数据,实现气泡大小的动态变化。以下代码每2秒重新排序数据并更新前N个最大值的气泡大小:
setInterval(function() {
// 随机选择显示前3-8个最大值
var topN = Math.floor(Math.random() * 5) + 3;
myChart.setOption({
series: [{
data: convertData(data.sort((a, b) => b.value - a.value).slice(0, topN)),
symbolSize: function(val) {
// 动态调整大小计算因子,增强变化视觉效果
return val[2] / (Math.random() * 5 + 5);
}
}]
});
}, 2000);
颜色映射与视觉编码
结合 visualMap 组件实现颜色的动态映射,将 PM2.5 值映射到红-黄-绿的渐变区间,直观反映空气质量等级:
visualMap: {
type: 'continuous',
min: 0,
max: 200,
calculable: true,
inRange: {
color: ['#32cd32', '#ffff00', '#ff4444'] // 绿-黄-红渐变
},
controller: {
inRange: {
color: ['#32cd32', '#ffff00', '#ff4444']
}
}
},
series: [{
type: 'effectScatter',
// 移除itemStyle.color配置,使用visualMap自动映射
}]
高级动画效果
通过调整 rippleEffect 参数实现多样化的波纹动画:
| 配置项 | 说明 | 取值范围 |
|---|---|---|
| brushType | 波纹绘制方式 | 'stroke'(描边)/'fill'(填充) |
| scale | 波纹最大缩放比例 | 1-10 |
| period | 动画周期(秒) | 0.5-5 |
// 脉冲式波纹效果
rippleEffect: {
brushType: 'fill',
scale: 6,
period: 3
},
// 交互强化:鼠标悬停时放大波纹
emphasis: {
focus: 'self',
scale: 1.5
}
完整示例代码
以下是集成动态大小、颜色映射和高级动画的完整配置(完整代码见 test/effectScatter.html):
option = {
backgroundColor: '#404a59',
visualMap: {
type: 'continuous',
min: 0,
max: 200,
calculable: true,
inRange: {
color: ['#32cd32', '#ffff00', '#ff4444']
}
},
geo: {
map: 'china',
roam: true,
itemStyle: {
areaColor: '#323c48',
borderColor: '#111'
}
},
series: [{
name: '空气质量',
type: 'effectScatter',
coordinateSystem: 'geo',
data: convertData(data),
symbolSize: function(val) {
return val[2] / 10;
},
rippleEffect: {
brushType: 'stroke',
scale: 5,
period: 4
},
hoverAnimation: true
}]
};
// 动态更新数据
setInterval(function() {
myChart.setOption({
series: [{
data: convertData(data.sort((a, b) => Math.random() - 0.5).slice(0, 10))
}]
});
}, 3000);
性能优化建议
当处理大量数据(>1000个气泡)时,可采用以下优化策略:
- 数据采样:通过
dataZoom组件或后端接口实现数据分页加载 - 动画节流:降低
rippleEffect.period或减少symbolSize计算复杂度 - 分层渲染:使用
zlevel控制图层,重要气泡使用更高层级
// 大数据优化配置
series: [{
type: 'effectScatter',
large: true, // 开启大数据模式
largeThreshold: 200, // 数据量阈值
progressive: 500, // 渐进式渲染帧数
animationDuration: 1000 // 动画时长缩短
}]
应用场景与扩展
动态气泡图适用于以下场景:
- 实时监控系统:如服务器负载监控、网络流量可视化
- 金融数据分析:股票交易量与价格波动关系展示
- 环境监测:空气质量、水质等多维度数据实时展示
扩展功能可考虑:
- 结合时间轴(timeline)组件实现历史数据回放
- 添加点击事件实现气泡与详情面板的联动
- 使用
graphic组件添加动态标注或警戒线
通过本文介绍的方法,开发者可以快速实现具有专业视觉效果的动态气泡图,有效提升数据可视化的表现力和用户体验。完整示例代码可参考 ECharts 官方测试用例 test/effectScatter.html 和 test/effectScatter2.html。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



