IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> echarts不一样的饼图 -> 正文阅读

[JavaScript知识库]echarts不一样的饼图

前言

最近有关项目要做一个下面的饼图(不考虑3d饼图)
在这里插入图片描述
需求:
1、默认查询所有客户的发货额和运费额
2、点击对应的客户查询该客户的发货额和运费额

一开始没仔细看,仔细一看是真特么难做。

问题及解决

问题1: 如何做到饼图就显示两个扇形,但是显示多个legend

问题: 这里有个问题就是饼图的数据是对象的形式,如下,legend是要对应name属性的

data: [
  { value: 1048, name: 'Search Engine' },
  { value: 735, name: 'Direct' },
  { value: 580, name: 'Email' },
  { value: 484, name: 'Union Ads' },
  { value: 300, name: 'Video Ads' }
],

解决: 有一个解决方式就是添加0来实现

legend: {
  orient: 'vertical',
  left: 'left',
  data:['A','B']
},
data: [
  { value: 1048, name: '运费' },
  { value: 735, name: '发货' },
  { value: 0, name: 'A' },
  { value: 0, name: 'B' }
],

在这里插入图片描述

问题2:隐藏占位的数据

问题: 可以根据0进行过滤,不过不能要引导线,只能放在饼图内部

解决:series里添加一下代码

itemStyle: {
    normal: {
        label: {
            show: true,		// 开启显示
            position: 'inner', // legend显示在哪里
            textStyle: { // 数值样式
                color: '#ffffff',
                fontSize: 10
            },
            formatter(params) {
                if(params.value > 0) {
                    return `${params.name}${params.value}`;
                }else{
                    return '';
                }
            }
        }
    }
}

在这里插入图片描述

问题3 如何监听点击的legend

解决: 可以监听legendselectchanged事件

myChart.on('legendselectchanged', function(params) {
});

注意点: 之前写过一篇点击监听点击事件的,里面有些注意点,这里同样适用

传送门

问题4 如何拿到点击的图例的id(或者其他唯一标识)

问题: 之前点击事件中可以通过自定义属性来获取,但是legend不支持自定义属性
解决: 手动拼接上一个id,再通过formatter进行格式化

data: ['A_11','B_2','C_3'],
 formatter(params) {
     // console.log(params);
     return params.replace(/_[0-9]*/,'');
 }

注: series里的name值必须对应,不然不会显示

data: [
    { value: 1048, name: '发货额' },
    { value: 735, name: '运费额' },
    { value: 0, name: 'A_11' },
    { value: 0, name: 'B_2' },
    { value: 0, name: 'C_3' }
],

问题5 图例变灰问题

问题: 这里的问题是图列点一个变灰一个,正常情况应该是我点第一个第一个变灰,当我点第二个时,第二个变灰,第一个变亮

解决:

 let myChart = echarts.init(dom);
 myChart.clear();
 myChart.setOption(option);
 myChart.off('legendselectchanged');
 myChart.on('legendselectchanged', function(params) {
     // 处理id问题
     let id = params.name.split('_')[1];
     // 处理变灰问题,变灰是图列取消选中
     let select_key = Object.keys(params.selected);
     select_key.forEach(item => {
         if(item != params.name) {
             // 其他图例的选中
             myChart.dispatchAction({
                 type: 'legendSelect',
                 // 图例名称
                 name: item
             });
         }
     });
 });

效果图
在这里插入图片描述

问题6 图例可滚动

解决:
legend里添加下面两行代码

type: 'scroll', // 显示分页
pageIconSize: 4 // 每页显示的个数

注意: 并不是设置了pageIconSize就会显示,只有当页面里无法全部显示时,才会按照该属性进行分页

效果
在这里插入图片描述

完整代码

<template>
    <div class="freight-analysis-pie" :id="'freightAnalysisPie'+tagKey"></div>
</template>

<script>
import echarts from 'echarts';
export default {
    props: {
        // 唯一标识
        tagKey: {
            type: String,
            default: ''
        }
    },
    methods: {
        setOption(xData,seriesData) {
            let option = {
                title: {
                    text: '当年度发货额和运费额分项',
                    left: 'center',
                    top: 10
                },
                tooltip: {
                    trigger: 'item',
                    formatter(params) {
                        return `${params.name}`;
                    }
                },
                legend: {
                    orient: 'vertical',
                    right: '5%',
                    top: '50%',
                    data: ['A_1','B_2','C_3','D_4','E_5','F_6','G_7'],
                    formatter(params) {
                        // console.log(params);
                        return params.replace(/_[0-9]*/,'');
                    },
                    type: 'scroll', // 显示分页
                    pageIconSize: 4 // 每页显示的个数
                },
                series: [
                    {
                        name: 'Access From',
                        type: 'pie',
                        radius: '60%',
                        color: ['#67C23A','#9F99DE','#73DEB3','#FEE583','#F2637B','#5790F3','#FEE583'],
                        data: [
                            { value: 1048, name: '发货额' },
                            { value: 735, name: '运费额' },
                            { value: 0, name: 'A_1' },
                            { value: 0, name: 'B_2' },
                            { value: 0, name: 'C_3' },
                            { value: 0, name: 'D_4' },
                            { value: 0, name: 'E_5' },
                            { value: 0, name: 'F_6' },
                            { value: 0, name: 'G_7' }
                        ],
                        itemStyle: {
                            normal: {
                                label: {
                                    show: true,		// 开启显示
                                    position: 'inner', // legend显示在哪里
                                    textStyle: { // 数值样式
                                        color: '#ffffff',
                                        fontSize: 10
                                    },
                                    formatter(params) {
                                        if(params.value > 0) {
                                            return `${params.name}${params.value}`;
                                        }else{
                                            return '';
                                        }
                                    }
                                }
                            }
                        }
                    }
                ]
            };
            let dom = document.getElementById('freightAnalysisPie' + this.tagKey);
            let myChart = echarts.init(dom);
            myChart.clear();
            myChart.setOption(option);
            myChart.off('legendselectchanged');
            myChart.on('legendselectchanged', function(params) {
                // 处理id问题
                let id = params.name.split('_')[1];
                // 处理变灰问题,变灰是图列取消选中
                let select_key = Object.keys(params.selected);
                select_key.forEach(item => {
                    if(item != params.name) {
                        // 其他图例的选中
                        myChart.dispatchAction({
                            type: 'legendSelect',
                            // 图例名称
                            name: item
                        });
                    }
                });
            });
            window.addEventListener('resize', function() {
                myChart.resize();
            });
        }
    }
};
</script>

<style lang="scss" scoped>
.freight-analysis-pie{
    width: 100%;
    height: 100%;
}
</style>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:07:38  更:2022-06-01 15:10:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:02:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码