Echarts实现高亮某一个点

news2024/11/26 21:38:31

背景

接口会返回所有点的数据,以及最优点的数据。产品要求在绘制图形后,高亮最优点,添加一个红色的样式,如图。点击select选择器时,可选择不同指标和花费对应的关系。

以下介绍实现思路

1、自定义配置选择器的数据源,默认选中roi。
chartParams: 'roi',
chartOption: [
    {
        label: 'ROI、边际ROI和花费的关系',
        value: 'roi',
        otherValue: 'incre_roi',
        name1: 'ROI',
        name2: '边际ROI',
    },
    {
        label: '点击价值、边际点击价值和花费的关系',
        value: 'vpc',
        otherValue: 'incre_vpc',
        name1: '点击价值',name2: '边际点击价值',
    },
    {
        label: '加购成本、边际加购成本和花费的关系',
        value: 'cpca',
        otherValue: 'incre_cpca',
        name1: '加购成本',
        name2: '边际加购成本',
    },
],
<el-select v-model="chartParams" @change="handleAnalysis">
    <el-option v-for="item in chartOption"
        :key="item.value"
        :value="item.value"
        :label="item.label"></el-option>
</el-select>
2、绘制echarts
  • 引入
import * as echarts from 'echarts';
  • 设置宽高
<div ref="myChart1" style="width: 50%; height: 280px"></div>
  • 在data中,定义一个myChart1的变量用来保存eCharts实例,echarts的基础配置

其中:formatNum方法为公共方法,功能:数字增加千分位,如果有小数点保留2位小数。文章末尾有提供

tooltip对象中的formatter函数,当鼠标悬浮时,标记点(即最优点)不展示悬浮数据,其他点展示固定的指标数据

myChart1: '',
echartsData1: {
    legend: {
        data: ['ROI','边际ROI'],
        selectedMode: false, // 是否允许点击
    },
    grid: {
        show: false,
        top: '40px', // 一下数值可为百分比也可为具体像素值
        right: '50px',
        bottom: '40px',
        left: '40px',
    },
    xAxis: {
        type: 'category',
        boundaryGap: false,
        splitLine: {
            show: true,
            lineStyle: {
                type: 'dashed',
                color: '#eee', // 左边线的颜色
                width: '1', // 坐标线的宽度
            },
        },
        data: [1,2,3,4,5,6,7,8,9,10],
        axisLine: {
            show: true,
            lineStyle: {
                type: 'solid',
                color: '#ccc', // 左边线的颜色
                width: '1', // 坐标线的宽度
            },
        },
        axisLabel: {
            interale: 0,
            rotate: 45, //防止x轴坐标数据过大放不下,倾斜45°
            color: '#aaa', // 坐标轴label颜色
            formatter: (value) => {
                return formatNum(value)
            }
        },
    },
    yAxis: [
        {
            type: 'value',
            name: 'ROI',
            splitLine: {
                show: true,
                lineStyle: {
                    type: 'dashed',
                    color: '#eee', // 左边线的颜色
                    width: '1', // 坐标线的宽度
                },
            },
            axisLine: {
                show: true,
                lineStyle: {
                    type: 'solid',
                    color: '#ccc', // 左边线的颜色
                    width: '1', // 坐标线的宽度
                },
            },
            axisLabel: {
                formatter: '{value}',
                color: '#aaa',
            },
        },
        {
            type: 'value',
            name: '边际ROI',
            splitLine: {
                show: true,
                lineStyle: {
                    type: 'dashed',
                    color: '#eee', // 左边线的颜色
                    width: '1', // 坐标线的宽度
                },
            },
            axisLine: {
                show: true,
                lineStyle: {
                    type: 'solid',
                    color: '#ccc', // 左边线的颜色
                    width: '1', // 坐标线的宽度
                },
            },
            axisLabel: {
                formatter: '{value}',
                color: '#aaa',
            },
        },
    ],
    tooltip: {
        trigger: 'item', // 设置触发类型为坐标轴
        axisPointer: {
            type: 'cross',
            crossStyle: {
                color: '#999',
            },
        },
        formatter: (value) => {
            if(value.componentType === "markPoint") return
            let str= ``
            let color = value.color
            let color2 = "#91cc75"
            str += `<p style="line-height: 26px;color: ${color}">花费:${formatNum(Math.trunc(value.data['budget']))}</p>`
            str += `<p style="line-height: 26px;color: ${color}">GMV:${formatNum(Math.trunc(value.data['pred_gmv']))}</p>`
            str += `<p style="line-height: 26px">
                <span style="display: inline-block; width: 110px;color: ${color}">ROI: ${value.data['roi']}</span> 
                <span style="display: inline-block; min-width: 150px;color: ${color2};">边际ROI: ${value.data['incre_roi']}</span></p>`
            str += `<p style="line-height: 26px">
                <span style="display: inline-block; width: 110px;color: ${color}">点击价值: ${value.data['vpc']}</span> 
                <span style="display: inline-block; min-width: 150px;color:${color2};">边际点击价值: ${value.data['incre_vpc']}</span></p>`
            str += `<p style="line-height: 26px">
                <span style="display: inline-block; width: 110px;color: ${color}">加购成本: ${value.data['cpca']}</span> 
                <span style="display: inline-block; min-width: 150px;color:${color2};">边际加购成本: ${value.data['incre_cpca']}</span></p>`
            return str                  
        }
    },
    series: [
        {
            name: 'ROI',
            data: [12, 25, 45, 35, 55],
            yAxisIndex: 0, // 使用第1个Y轴
            type: 'line',
            smooth: true,
            lineStyle: {
                color: '#5470c6',
                type: 'solid',
            },
            symbol:'circle', 
            showSymbol: true,
            symbolSize: 6,
            markPoint: { //给第一条y轴添加标记点
                data: [{ 
                    value: 'best', 
                    xAxis: 1, 
                    yAxis: 2.68,
                    itemStyle: {
                        color: 'red' //颜色设置为红色
                    },
                }]
            },
        },
        {
            name: '边际ROI',
            data: [1, 2, 44, 35, 155],
            yAxisIndex: 1, // 使用第2个Y轴
            type: 'line',
            smooth: true,
            lineStyle: {
                color: '#5470c6',
                type: 'dashed'  // 这里设置线的类型为'dashed',即虚线
            },
        }
    ],
},
  • 初始化echarts,绑定点击事件(通过样式来实现高亮)
this.$nextTick(()=> {
    this.myChart1 = echarts.init(this.$refs['myChart1'])
    this.myChart1.setOption(this.echartsData1)
    this.myChart1.on('click', (event) => {
        this.echartClick(event)
    })
})
//切换最优点
echartClick(event) {
    this.bestSpotInfo = event.data
    this.handleSetHighLight(event.dataIndex)
},
//设置高亮事件
handleSetHighLight(idx) {
    this.echartsData1.series[0].data.map((item,index) => {
        item.itemStyle.color = index===idx? 'red' : '#5470c6'
        item.symbolSize = index===idx? 11 : 6
    })
    this.myChart1.setOption(this.echartsData1)
},
  • 获取数据后处理数据
//处理三个关系的折线图
handleAnalysis() {
    let tempObj = this.chartOption.find(item=>item.value==this.chartParams)
    this.echartsData1.xAxis.data = this.allSpotInfo.map(item => item.budget)
    this.echartsData1.legend.data = [tempObj.name1, tempObj.name2]
    this.echartsData1.yAxis[0].name = tempObj.name1
    this.echartsData1.yAxis[1].name = tempObj.name2
    this.echartsData1.series[0].name = tempObj.name1
    this.echartsData1.series[1].name = tempObj.name2

    //寻找最优点的坐标 设置默认高亮
    let bestIndex = this.allSpotInfo.findIndex(item => item.budget == this.bestSpotInfo.budget)
    this.echartsData1.series[0].markPoint.data[0].xAxis = bestIndex
    this.echartsData1.series[0].markPoint.data[0].yAxis = this.bestSpotInfo[tempObj.value]
    this.echartsData1.series[0].data = this.allSpotInfo.map((item,index) => {
        return {
            value: item[tempObj.value],
            ...item,
            itemStyle: {
                color: '#5470c6'
            },
            symbolSize: 6
        }
    })
    this.echartsData1.series[1].data = this.allSpotInfo.map(item => {
        return {
            value: item[tempObj.otherValue],
            ...item,
        }
    })
    this.handleSetHighLight(bestIndex)
    if(this.myChart1) {
        this.myChart1.setOption(this.echartsData1)
    }
},
4、监听eCharts的宽度变化,实现页面宽度自适应
mounted() {
    window.addEventListener('resize', () => {
        if (this.$refs['myChart1']) {
            this.myChart1.resize();
        }
    })
},

/* 页面组件销毁的时候,别忘了移除绑定的监听resize事件,否则的话,多渲染几次,容易导致内存泄漏和额外CPU或GPU占用哦 */
beforeDestroy () {
    window.removeEventListener('resize', () => {
        this.myChart1.resize()
    })
},

最后贴上

// 数字增加千分位,如果有小数点保留2位小数
function formatNum(str) {
  if (str === 0) {
    return 0;
  }
  if (str === null || str === undefined || str === "--") {
    return "- -";
  }
  var newStr = "";
  var count = 0;
  str = str.toString();
  str = str.replace(/,/g, "");
  if (str.indexOf(".") === -1) {
    for (var i = str.length - 1; i >= 0; i--) {
      if (count % 3 === 0 && count !== 0) {
        newStr = str.charAt(i) + "," + newStr;
      } else {
        newStr = str.charAt(i) + newStr;
      }
      count++;
    }
    str = newStr;
    return str;
  } else {
    for (var j = str.indexOf(".") - 1; j >= 0; j--) {
      if (count % 3 === 0 && count !== 0) {
        newStr = str.charAt(j) + "," + newStr;
      } else {
        newStr = str.charAt(j) + newStr;
      }
      count++;
    }
    str = newStr + (str + "00").substr((str + "00").indexOf("."), 3);
    return str;
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MS SQL Server STUFF 函数实战 统计记录行转为列显示

目录 范例运行环境 视图样本设计 数据统计要求 STUFF函数实现 小结 范例运行环境 操作系统&#xff1a; Windows Server 2019 DataCenter 数据库&#xff1a;Microsoft SQL Server 2016 视图样本设计 假设某一视图 [v_pj_rep1_lname_score] 可查询对某一被评价人的绩效…

【解决方案】荣耀系统Android8.0 system目录Read-only file system

本来以为直接把Charles证书改成系统证书格式&#xff0c;然后通过mt管理器root之后移动到系统证书目录就行了&#xff0c;结果访问baidu仍然显示网络错误&#xff0c;折腾一晚上。安装为用户证书&#xff0c;又与系统证书冲突。 手机型号&#xff1a;荣耀v10 EMUI&#xff1a…

ardupilot开发 --- 远程标识 篇

1. wifi协议 https://zhuanlan.zhihu.com/p/660568077 AP 无线接入点 路由器STA 站点 接入路由器的终端SSID 标识符 无线网络的名称信标祯 Beacon AP通过广播Beacon祯来告诉想要接入者(STA)无线网络的信息&#xff0c;如SSIDWLAN数据帧 Wi-Fi网络中传输数据时所使用的数据帧格…

Oracle客户端如何连接远程数据库?

Oracle是一种常用的数据库管理系统&#xff0c;它具有高效、稳定的特性&#xff0c;广泛应用于各行各业。为了实现远程数据库的连接&#xff0c;我们可以使用Oracle客户端工具。本文将介绍如何使用Oracle客户端连接远程数据库&#xff0c;并讨论其使用场景。 Oracle客户端工具 …

parallel linux虚拟机没有root权限

前言 今天刚在parallel上装上linux虚拟机&#xff0c;安装的是Debian发行版。用终端输入命令时&#xff0c;无意间发现当前用户竟然不是root用户&#xff0c;岂有此理&#xff01;众所周知&#xff0c;Linux系统一般安装之后都是默认root用户的&#xff0c;但是可能parallel先…

简单几分钟将GPT部署到移动磁盘,从此不需要网络带着跑

Chat GPT 发布已经一年多&#xff0c;目前也有很多平替产品出现&#xff0c;为什么我们还是需要一个本地可以跑在电脑上的 GPT 模型呢&#xff1f; 隐私&#xff1a;使用某个公司提供的服务&#xff0c;避免不了你的个人数据安全无法得到保障&#xff0c;特别如果你要咨询关于…

软件工程知识体系 Chapter3 软件构造

介绍 软件构造一词指的是通过编码、验证、单元测试、集成测试和调试等组合详细创建工作软件的过程。 软件构建知识领域&#xff08;KA&#xff09;与所有其他KA都有关联&#xff0c;但它与软件设计和软件测试的关联最为紧密&#xff0c;因为软件构建过程涉及重要的软件设计和…

Jupyter Notebook启动及其常用快捷键

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 1.JupyterNotebook 第一种启动方式 点击 windows 电脑左下角开始 > 搜索 Anaconda > 点击 Anaconda Prompt 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 在命令行窗口输入&…

操作系统:浅谈文件系统

目录 1.理解文件系统 1.1.从磁盘开始的抽象存储结构 ​编辑 1.2.操作系统下的文件管理 1.2.1.知识储备 1.2.2.存储文件的属性 1.2.3.存储文件的内容 1.2.4.如何新建文件 1.2.5.如何理解目录 1.2.6.如何找到某一个文件 1.3.操作系统如何打开文件 2.软硬链接 我们知…

智慧开发平台免!费!申请试用

原创 F学社 F学社 2024-04-01 17:13 江苏 扫描二维码即可申请试用 01 智慧开发平台简介 F1 WIFI智慧教育平台是可支持线上线下联动的基于FPGA的口袋式数字系统学习平台。其采用了AMD、Altera、安路、高云等国外国内主流公司的FPGA进行数字系统方向的教学实验设计&#xff0c…

《云原生安全攻防》-- K8s集群安全风险分析

在这个数字化快速发展的年代&#xff0c;云原生安全变得越来越重要。我明白对于很多朋友来说&#xff0c;这是一个既新奇又复杂的领域。因此&#xff0c;我整合了以往的专业积累&#xff0c;精心打造了一个专门讲解云原生安全的系列课程&#xff0c;目的是能给大家带来有价值的…

9Proxy,跨境电商一站式解决方案

文章目录 跨境电商什么是跨境电商跨境电商的机遇跨境电商技术支撑 海外代理IP什么是海外代理IP海外代理IP的作用如何选择海外代理IP 9Proxy9Proxy的优势9Proxy的解决方案价格汇总搜索引擎优化市场调查多重核算数据抓取广告技术 价格上手体验注册登录下载安装数据采集 总结福利 …

【数据结构】——二叉树堆的实现

大佬们点点关注&#xff0c;点点赞&#xff1f;&#xff01; 前言 在上篇博客中我们已经介绍了树和二叉树的相关概念&#xff0c;相信大家都已经清楚了树和二叉树的基本思想&#xff0c;下面我们就来着重看看二叉树堆的实现。 在看堆的实现&#xff0c;我们先看看二叉树的顺…

Linux 安装部署高性能缓存服务redis

Linux 系统安装Redis 5 注意事项&#xff1a; 下载Redis 文件包&#xff0c;并上传至linux服务上解压 tar -zxvf redis.tar安装&#xff1a; 编译 make PREFIX/usr/local/redis install配置&#xff1a; redis.conf daemonize yes bind 127.0.0.1 192.168.1.221 supervised…

坚持刷题|分发饼干

文章目录 题目思路代码实现实现总结主要步骤时间复杂度 扩展问题 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天刷第一个贪心算法&#xff1a;分发饼干 题目 455.分发饼干 思路 要解决这个问题&#xff0c;可以使用…

解锁AI提示工程新纪元:你的提问是关键!

文章目录 一、AI的潜力&#xff1a;无尽的宝藏等待解锁二、提问的艺术&#xff1a;挖掘AI潜力的关键三、AI的回应&#xff1a;超越预期的答案与启示四、提问的力量&#xff1a;推动AI不断进步与发展五、用提问开启与AI的智慧对话《向AI提问的艺术&#xff1a;提示工程入门与应用…

C++中的面向对象到底是什么

C中的面向对象到底是什么 对象嘛&#xff0c;就和大家都有的对象一样&#xff0c;两只眼睛、一个嘴巴、两条腿…… 对不起跑题了&#xff0c;C的面向对象中的对象可不是显示中的对象哦&#xff0c;但是有一些相似之处&#xff0c;有对象的同学可以参考着去学习C面向对象的概念…

niushop单商户V5多店版源码分享三端uniapp打包方法包括PC端_小程序或h5端打包_收银端打包_APP端打包_商户端

目前多店版有四端uniapp&#xff0c;包括PC端uniapp&#xff0c;商家端uniapp&#xff0c;收银端uniapp&#xff0c;门店手机端uniapp&#xff0c;下面我总结下这些端的打包流程希望能帮助到大家&#xff0c;需要交流的可以看我昵称或者点我头像关注我分享代码和教程 一.niush…

原创歌曲分享平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

帝国CMS十合一源码/字典/成语/古诗词/二十四节气/英语单词/百家姓/范文文库/词语等

帝国CMS十合一源码/字典/成语/古诗词/二十四节气/英语单词/百家姓/范文文库/词语等 功能包含: 成语大全 二十四节气 英语单词 古诗词 近反义词 词语造句 汉语字典 英文缩写 百家姓 范文文库 文件目录:1个数据库 1个系统源码 1个伪静态规则 安装方式:把1.2G的…