首页IT科技echarts 饼图 图例(echarts 饼状图 label 既在内部显示数值(百分比),又显示外部指示线)

echarts 饼图 图例(echarts 饼状图 label 既在内部显示数值(百分比),又显示外部指示线)

时间2025-06-14 13:54:28分类IT科技浏览10675
导读:需求 项目开发中,产品经理绘制的原型图中,需要前端实现一个饼状图,且既在饼图内部中 显示 百分比,又显示 外部指示线及数值,效果如下图所示:...

需求

项目开发中                 ,产品经理绘制的原型图中                         ,需要前端实现一个饼状图          ,且既在饼图内部中 显示 百分比             ,又显示 外部指示线及数值                        ,效果如下图所示:

查了下 Echarts 官网文档              ,需要配置 series 下的 label 配置项         ,如下所示:

series: [ label: { normal: { position: inside // 在内部显示                        ,outseide 是在外部显示 show: true, formatter: {c} // formatter 是标签内容的格式器                  ,用于转换格式                 。支持 字符串和回调函数两种形式                         。 } } ]

其中     ,formatter 是标签内容的格式器                         ,用于转换格式          。支持 字符串和回调函数两种形式             。

{c} 代办字符串模板变量                      ,表示数据值,常用的模板变量有:

{ a }:系列名 { b }:数据名 { c }:数据值 { d }:百分比

不过问题来了                     ,echarts 好像没法直接配置成 内部+外部 同时展示的情况                        。                          ,因为在单个的 series 中(即其中的一个对象中)     ,只能设置一个label              。

不过也好解决                 ,通过查看 echarts 官网 series 配置项                         ,可以看出          ,series 是一个数组(如上图所示)             ,既然单个中只能出现一个                        ,那么我配置成 2个(多个)相同的对象              ,让他们重合         ,就会出现两个 label 标签                        ,一个在内部展示                  ,一个在外部展示     ,就可以完美解决这种情况         。

代码实例如下所示:

series: [ { type: pie, radius: 90%, data: [ { value: data?.winBidNumber || 0, name: 中标数量 }, { value: data?.loseBidNumber || 0, name: 未中标数量 }, { value: data?.abandonBidNumber || 0, name: 弃标数量 } ], labelLine: { show: true, position: outside, length: 10, length2: 50 }, emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: rgba(0, 0, 0, 0.5) } }, label: { normal: { position: outside, show: true, formatter: (d: any) => { console.log(222, d); return d.name + + d.value + +) } } } }, { type: pie, radius: 90%, data: [ { value: data?.winBidNumber || 0, name: 中标数量 }, { value: data?.loseBidNumber || 0, name: 未中标数量 }, { value: data?.abandonBidNumber || 0, name: 弃标数量 } ], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: rgba(0, 0, 0, 0.5) } }, label: { normal: { position: inside, show: true, formatter: (d: any) => { return d.percent + % } } } } ]

其中                         , labelLine 属性 是 用来配置 外部指示线(第一段                 、第二段)的长度及样式的                        。

formatter 为 回调函数的写法如上面的代码实例                      ,该回调函数接收一个参数,该参数的值包含了 模板字符串变量所拥有的值                     ,如下图打印的所示:

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
es6语法官网(【ES6丨前端进阶基础 】ES6的关键字,新特性以及解构赋值) vue在某方法后执行([Vue3] defineExpose要在方法声明定义以后使用)