查看: 309|回复: 3

Vue项目ECharts饼图配置:标题图例标签与圆环半径实践

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在Vue项目里用ECharts画饼图,和折线图、柱状图最大的区别是不用配置xAxis、yAxis,数据名称和值直接放进series的data里。本文基于ECharts 5.2.1,围绕一个省份院士数量示例,拆解饼图的最小配置、标题与图例、标签格式化、半径控制和圆环图写法,并给出可直接放进Vue单文件组件的实现。

一、安装与引入
通过npm安装ECharts并保存依赖:
  1. npm install echarts --save
复制代码
原文示例使用的版本是echarts 5.2.1。页面中全量引入:
  1. import * as echarts from 'echarts';
复制代码
这种写法会把ECharts组件整体引入,适合需要快速使用多种图表类型的页面。引入后,图表容器需要有一个确定宽高的DOM节点,初始化时把该节点传给echarts.init。

二、最小饼图配置
饼图只需要series即可成形。type设为pie,data数组中的每个对象包含name和value。value不需要提前换算成百分比,ECharts会根据所有value的总和按比例分配弧度。例如江苏463、浙江395、山东157、广东149、湖南147:
  1. const option = {
  2.   series: [
  3.     {
  4.       type: 'pie',
  5.       data: [
  6.         { value: 463, name: '江苏' },
  7.         { value: 395, name: '浙江' },
  8.         { value: 157, name: '山东' },
  9.         { value: 149, name: '广东' },
  10.         { value: 147, name: '湖南' }
  11.       ]
  12.     }
  13.   ]
  14. };
复制代码
这个配置已经能画出基本饼图。实际项目中通常还要把图例、标题和标签补上。

三、标题、图例与标签
title.text控制标题文本,left、top、right、bottom调整标题位置,title.textStyle控制标题文字样式。示例把标题放在顶部居中:
  1. title: {
  2.   text: '国内院士前五省份图示',
  3.   top: '0%',
  4.   left: 'center'
  5. }
复制代码
图例通过legend配置。legend.data对应各扇区名称,right、top等控制图例位置,orient设为vertical时图例纵向排列;默认是横向排列。示例将图例放在右侧偏上位置:
  1. legend: {
  2.   data: ['江苏', '浙江', '山东', '广东', '湖南'],
  3.   right: '10%',
  4.   top: '30%',
  5.   orient: 'vertical'
  6. }
复制代码
饼图的文本标签默认展示,label.show默认为true;折线图和柱状图的文本标签默认不展示。如果想在扇区旁同时显示名称、数值和百分比,可以配置label.formatter。formatter中的{b}表示名称,{c}表示数值,{d}表示百分比:
  1. series: [
  2.   {
  3.     type: 'pie',
  4.     label: {
  5.       show: true,
  6.       formatter: '{b} : {c} ({d}%)'
  7.     },
  8.     data: [
  9.       { value: 463, name: '江苏' },
  10.       { value: 395, name: '浙江' },
  11.       { value: 157, name: '山东' },
  12.       { value: 149, name: '广东' },
  13.       { value: 147, name: '湖南' }
  14.     ]
  15.   }
  16. ]
复制代码
这里的formatter只是标签模板,不会改变原始数据,也不会把value改写成百分比;百分比由ECharts根据数据计算后填入{d}。

四、radius控制饼图大小与圆环图
series.radius可以写百分比字符串,也可以写绝对像素数值。写成百分比时,它是相对于容器宽高中较小的一条边计算:容器宽度大于高度时按高度算,高度大于宽度时按宽度算;写成数值时表示绝对像素。示例将半径设为容器较小边的30%:
  1. radius: '30%'
复制代码
radius还可以是包含两个元素的数组,前一项是内半径,后一项是外半径。这样画出来的就是圆环图。换言之,饼图可以看作内半径为0的圆环图。示例配置为内半径40%、外半径70%:
  1. radius: ['40%', '70%']
复制代码
圆环图不需要额外换图表类型,仍然使用type: pie,只改radius即可。

五、放进Vue单文件组件
下面把上述配置整理成Vue示例。容器通过:style绑定宽高,mounted阶段先整理图例名称,再初始化ECharts,并监听窗口resize调用myChart.resize(),避免容器尺寸变化后图表变形:
  1. <template>
  2.   <div class='echart' id='mychart' :style='myChartStyle'></div>
  3. </template>
  4. <script>
  5. import * as echarts from 'echarts';
  6. export default {
  7.   data() {
  8.     return {
  9.       myChart: {},
  10.       pieData: [
  11.         { value: 463, name: '江苏' },
  12.         { value: 395, name: '浙江' },
  13.         { value: 157, name: '山东' },
  14.         { value: 149, name: '广东' },
  15.         { value: 147, name: '湖南' }
  16.       ],
  17.       pieName: [],
  18.       myChartStyle: { float: 'left', width: '100%', height: '400px' }
  19.     };
  20.   },
  21.   mounted() {
  22.     this.initDate();
  23.     this.initEcharts();
  24.   },
  25.   methods: {
  26.     initDate() {
  27.       for (let i = 0; i < this.pieData.length; i++) {
  28.         this.pieName[i] = this.pieData[i].name;
  29.       }
  30.     },
  31.     initEcharts() {
  32.       const option = {
  33.         legend: {
  34.           data: this.pieName,
  35.           right: '10%',
  36.           top: '30%',
  37.           orient: 'vertical'
  38.         },
  39.         title: {
  40.           text: '国内院士前五省份图示',
  41.           top: '0%',
  42.           left: 'center'
  43.         },
  44.         series: [
  45.           {
  46.             type: 'pie',
  47.             label: {
  48.               show: true,
  49.               formatter: '{b} : {c} ({d}%)'
  50.             },
  51.             radius: '30%',
  52.             data: this.pieData
  53.           }
  54.         ]
  55.       };
  56.       this.myChart = echarts.init(document.getElementById('mychart'));
  57.       this.myChart.setOption(option);
  58.       window.addEventListener('resize', () => {
  59.         this.myChart.resize();
  60.       });
  61.     }
  62.   }
  63. };
  64. </script>
复制代码
原文完整示例里还出现了optionFree和this.seriesData,但这段代码最终只调用了setOption(option),optionFree和seriesData没有参与饼图渲染。复用时可以删掉这些残留片段,减少干扰;同时注意init的目标id要和模板中的容器id一致。

六、适用场景与注意点
这套配置适合业务后台、统计看板中按类别占比展示数据的场景,例如省份分布、渠道来源、状态占比。需要重点关注三点:第一,data里的value保持原始数量,不要手动换算百分比;第二,label.formatter只控制显示格式,{d}由ECharts计算;第三,radius使用百分比时要理解它参照容器短边,容器宽高变化会直接影响饼图大小。按原文示例使用ECharts 5.2.1时,饼图的默认标签显示、legend位置和圆环图写法均可直接沿用。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Vue项目ECharts饼图配置:标题图例标签与圆环半径实践

楼主这篇拆得挺细的,从最小饼图配置讲到标题、图例、标签 formatter、radius 和圆环图,层次很清楚,尤其把 radius 百分比是相对容器较小边计算、formatter 不会改原始数据这些点讲明白了,对刚在 Vue 里用 ECharts 画饼图的人挺有帮助。 不过 Vue 示例里 initDate 这段逻辑有点小问题:this.pieName = this.pieData.name 这里 pieData 是数组,直接取 name 拿不到每一项的名称,pieName 也不会变成名称数组;应该遍历 pieData 把每项的 name push 进去,或者用 map 整理。否则 legend.data 可能拿不到预期数据,图例就对不上了。另外首帖末尾 legend 的 right 后面好像没贴完,示例不太完整,补全后会更方便直接复制使用。整体思路没问题,细节再修一下就很实用了。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Vue项目ECharts饼图配置:标题图例标签与圆环半径实践

这篇整理挺实用的,最小饼图、标题图例、label 的 {b}{c}{d} 以及 radius 数组画圆环这几块讲得比较清楚,尤其强调了 formatter 不会改原始数据、百分比由 ECharts 计算,这点很容易被忽略。 有个小地方可以留意:示例里 initDate 用 for 循环写 this.pieName = this.pieData.name,这样拿不到名称数组,建议直接用 this.pieName = this.pieData.map(item => item.name)。另外 legend.data 其实不手动整理也会从 series 的 data 里取 name,手动写时注意顺序和名称一致。Vue 组件销毁时最好再补一下 myChart.dispose 和 resize 监听移除,避免切换页面后实例残留。整体内容适合直接放进项目里参考。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Vue项目ECharts饼图配置:标题图例标签与圆环半径实践

这篇内容挺适合拿来快速上手 Vue 里的 ECharts 饼图,最小配置、图例、标签格式化和 radius 圆环图这几块讲得比较清楚,尤其是 radius 百分比是相对于容器较小边计算这一点,实际用的时候很容易忽略。示例用省份院士数量也更直观。 有个小细节可以提一下:initDate 里写 this.pieName = this.pieData.name 是拿不到图例名称数组的,因为 pieData 是数组,应该用 this.pieName = this.pieData.map(item => item.name),这样 legend.data 才能正常对应上。另外如果后续补完整组件,记得在组件销毁时把 resize 监听移除并调用 dispose,避免页面切换后残留。整体思路没问题,继续补齐示例就很完整了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-31 05:41 , Processed in 0.021301 second(s), 28 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部