Echarts — 活用formatter与rich,打造高定制化数据标签(label)方案

张开发
2026/4/20 19:23:16 15 分钟阅读

分享文章

Echarts — 活用formatter与rich,打造高定制化数据标签(label)方案
1. 为什么我们需要定制化数据标签在数据可视化项目中产品经理经常会提出一些看起来简单但实现起来颇具挑战的需求。比如上周我就遇到这样一个场景需要在饼图标签中同时展示数值、百分比和趋势图标并且要求不同数据区间采用不同的配色方案。这听起来像是简单的样式调整但当你真正动手时会发现Echarts的默认label配置根本无法满足这种复合型需求。这时候就需要祭出Echarts的两大法宝formatter和rich。前者负责内容编排后者负责样式控制。两者结合使用几乎可以应对任何变态的标签定制需求。我曾在金融项目中用这套组合拳实现了包含涨跌箭头、数值高亮和条件色块的数据标签效果让产品经理直呼就是这个感觉2. 基础篇formatter字符串模板的妙用2.1 模板变量全解析Echarts的formatter最基础的用法是字符串模板。在饼图中我们常用的模板变量有{a}系列名称{b}数据项名称{c}数值{d}百分比formatter: {b}: {c} ({d}%)这个简单的模板就能输出类似搜索引擎: 1048 (42.5%)的标签。但实际项目中我们往往需要更复杂的排版。比如要让百分比单独一行并放大显示formatter: {b}\n{d|{d}%}, rich: { d: { fontSize: 16, color: #ff9900 } }这里用\n实现换行并用rich给百分比单独设置了样式。注意{d|{d}%}的写法竖线前的d对应rich中定义的样式名。2.2 多行布局实战当需要展示更多信息时合理的多行布局就很重要。比如这个电商数据案例formatter: {title|{a}}\n{divider}\n{item|{b}:}{value|{c}} {percent|{d}%}, rich: { title: { color: #666, align: center, fontSize: 14 }, divider: { height: 1, width: 100%, backgroundColor: #ddd }, item: { width: 60, padding: [0, 5, 0, 0] }, value: { fontWeight: bold }, percent: { backgroundColor: #f5f5f5, borderRadius: 3, padding: [2, 4] } }这个配置会生成一个带标题、分隔线和整齐对齐的多行标签其中百分比还有浅色背景衬托。通过width和padding的精细控制可以确保各字段不会挤在一起。3. 进阶篇rich富文本的深度定制3.1 样式继承与覆盖rich样式最强大的特性是继承机制。比如先定义基础文本样式textStyle: { fontFamily: Arial, fontSize: 12, color: #333 }然后在rich中局部覆盖rich: { warning: { color: #f56c6c, fontWeight: bold }, highlight: { backgroundColor: #fffbe6, borderRadius: 2 } }这样既保持了整体风格统一又能突出关键数据。我在一个运营报表项目中用这种方法实现了数据异常自动标红的功能。3.2 添加图标与装饰元素在rich中可以通过backgroundColor的image属性嵌入图标rich: { arrowUp: { backgroundColor: { image: data:image/svgxml;base64,... // 省略base64编码 }, width: 12, height: 12 } }更复杂的做法是结合伪元素实现装饰线rich: { divider: { height: 0, padding: [5, 0], borderColor: #eee, borderWidth: 1, width: 100% } }最近一个医疗项目就用这种技术实现了类似病历卡的分隔效果产品设计还原度接近100%。4. 高阶篇formatter回调函数的灵活运用4.1 动态条件判断当需要根据不同数据条件返回不同标签时回调函数就派上用场了formatter: function(params) { if (params.value 1000) { return {large|params.name}\n{value|params.value}; } else { return params.name; } }, rich: { large: { fontSize: 16, color: #f5222d }, value: { fontWeight: bold } }我在处理销售数据时就用这种方式自动放大显示TOP3商品的标签。4.2 复合内容生成回调函数最大的优势是可以进行复杂计算和字符串拼接formatter: function(params) { var trend params.value params.data.lastValue ? ↑ : ↓; return {name|params.name}\n {current|当前: params.value}\n {trend|环比: trendMath.abs(params.value-params.data.lastValue)}; }这个例子动态生成包含趋势箭头和环比数据的标签。配合rich的样式控制可以做出非常专业的商业图表。5. 避坑指南与性能优化5.1 常见问题排查样式不生效检查rich中的样式名是否与formatter中的占位符一致注意大小写敏感图标不显示确保图片路径正确建议使用base64内联图片布局错乱给关键元素设置固定width避免自动宽度导致的跳动5.2 性能优化建议避免在formatter回调中进行复杂计算复用rich样式定义减少重复代码对静态内容优先使用字符串模板大量数据时考虑关闭动画效果我在处理一个包含3000数据点的项目时就因为formatter中不必要的计算导致渲染卡顿。后来通过预计算和缓存优化性能提升了5倍。

更多文章