在Vue项目里用ECharts画饼图,和折线图、柱状图最大的区别是不用配置xAxis、yAxis,数据名称和值直接放进series的data里。本文基于ECharts 5.2.1,围绕一个省份院士数量示例,拆解饼图的最小配置、标题与图例、标签格式化、半径控制和圆环图写法,并给出可直接放进Vue单文件组件的实现。
一、安装与引入
通过npm安装ECharts并保存依赖:- npm install echarts --save
复制代码 原文示例使用的版本是echarts 5.2.1。页面中全量引入:- import * as echarts from 'echarts';
复制代码 这种写法会把ECharts组件整体引入,适合需要快速使用多种图表类型的页面。引入后,图表容器需要有一个确定宽高的DOM节点,初始化时把该节点传给echarts.init。
二、最小饼图配置
饼图只需要series即可成形。type设为pie,data数组中的每个对象包含name和value。value不需要提前换算成百分比,ECharts会根据所有value的总和按比例分配弧度。例如江苏463、浙江395、山东157、广东149、湖南147:- const option = {
- series: [
- {
- type: 'pie',
- data: [
- { value: 463, name: '江苏' },
- { value: 395, name: '浙江' },
- { value: 157, name: '山东' },
- { value: 149, name: '广东' },
- { value: 147, name: '湖南' }
- ]
- }
- ]
- };
复制代码 这个配置已经能画出基本饼图。实际项目中通常还要把图例、标题和标签补上。
三、标题、图例与标签
title.text控制标题文本,left、top、right、bottom调整标题位置,title.textStyle控制标题文字样式。示例把标题放在顶部居中:- title: {
- text: '国内院士前五省份图示',
- top: '0%',
- left: 'center'
- }
复制代码 图例通过legend配置。legend.data对应各扇区名称,right、top等控制图例位置,orient设为vertical时图例纵向排列;默认是横向排列。示例将图例放在右侧偏上位置:- legend: {
- data: ['江苏', '浙江', '山东', '广东', '湖南'],
- right: '10%',
- top: '30%',
- orient: 'vertical'
- }
复制代码 饼图的文本标签默认展示,label.show默认为true;折线图和柱状图的文本标签默认不展示。如果想在扇区旁同时显示名称、数值和百分比,可以配置label.formatter。formatter中的{b}表示名称,{c}表示数值,{d}表示百分比:- series: [
- {
- type: 'pie',
- label: {
- show: true,
- formatter: '{b} : {c} ({d}%)'
- },
- data: [
- { value: 463, name: '江苏' },
- { value: 395, name: '浙江' },
- { value: 157, name: '山东' },
- { value: 149, name: '广东' },
- { value: 147, name: '湖南' }
- ]
- }
- ]
复制代码 这里的formatter只是标签模板,不会改变原始数据,也不会把value改写成百分比;百分比由ECharts根据数据计算后填入{d}。
四、radius控制饼图大小与圆环图
series.radius可以写百分比字符串,也可以写绝对像素数值。写成百分比时,它是相对于容器宽高中较小的一条边计算:容器宽度大于高度时按高度算,高度大于宽度时按宽度算;写成数值时表示绝对像素。示例将半径设为容器较小边的30%:radius还可以是包含两个元素的数组,前一项是内半径,后一项是外半径。这样画出来的就是圆环图。换言之,饼图可以看作内半径为0的圆环图。示例配置为内半径40%、外半径70%:圆环图不需要额外换图表类型,仍然使用type: pie,只改radius即可。
五、放进Vue单文件组件
下面把上述配置整理成Vue示例。容器通过:style绑定宽高,mounted阶段先整理图例名称,再初始化ECharts,并监听窗口resize调用myChart.resize(),避免容器尺寸变化后图表变形:- <template>
- <div class='echart' id='mychart' :style='myChartStyle'></div>
- </template>
- <script>
- import * as echarts from 'echarts';
- export default {
- data() {
- return {
- myChart: {},
- pieData: [
- { value: 463, name: '江苏' },
- { value: 395, name: '浙江' },
- { value: 157, name: '山东' },
- { value: 149, name: '广东' },
- { value: 147, name: '湖南' }
- ],
- pieName: [],
- myChartStyle: { float: 'left', width: '100%', height: '400px' }
- };
- },
- mounted() {
- this.initDate();
- this.initEcharts();
- },
- methods: {
- initDate() {
- for (let i = 0; i < this.pieData.length; i++) {
- this.pieName[i] = this.pieData[i].name;
- }
- },
- initEcharts() {
- const option = {
- legend: {
- data: this.pieName,
- right: '10%',
- top: '30%',
- orient: 'vertical'
- },
- title: {
- text: '国内院士前五省份图示',
- top: '0%',
- left: 'center'
- },
- series: [
- {
- type: 'pie',
- label: {
- show: true,
- formatter: '{b} : {c} ({d}%)'
- },
- radius: '30%',
- data: this.pieData
- }
- ]
- };
- this.myChart = echarts.init(document.getElementById('mychart'));
- this.myChart.setOption(option);
- window.addEventListener('resize', () => {
- this.myChart.resize();
- });
- }
- }
- };
- </script>
复制代码 原文完整示例里还出现了optionFree和this.seriesData,但这段代码最终只调用了setOption(option),optionFree和seriesData没有参与饼图渲染。复用时可以删掉这些残留片段,减少干扰;同时注意init的目标id要和模板中的容器id一致。
六、适用场景与注意点
这套配置适合业务后台、统计看板中按类别占比展示数据的场景,例如省份分布、渠道来源、状态占比。需要重点关注三点:第一,data里的value保持原始数量,不要手动换算百分比;第二,label.formatter只控制显示格式,{d}由ECharts计算;第三,radius使用百分比时要理解它参照容器短边,容器宽高变化会直接影响饼图大小。按原文示例使用ECharts 5.2.1时,饼图的默认标签显示、legend位置和圆环图写法均可直接沿用。 |