Echarts实现高亮某一个点

背景

接口会返回所有点的数据,以及最优点的数据。产品要求在绘制图形后,高亮最优点,添加一个红色的样式,如图。点击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") returnlet str= ``let color = value.colorlet 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.datathis.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.name1this.echartsData1.yAxis[1].name = tempObj.name2this.echartsData1.series[0].name = tempObj.name1this.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 = bestIndexthis.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.hqwc.cn/news/586291.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Web】记录Polar靶场<中等>难度题一遍过(全)

目录 到底给不给flag呢 写shell 注入 某函数的复仇 xxe SSTI unpickle BlackMagic 反序列化 找找shell 再来ping一波啊 wu 代码审计1 你的马呢&#xff1f; ezphp 随机值 phpurl search file PlayGame csdn 反正持续一个月&#xff0c;感觉XYCTF…

2024年,短期PMP备考上岸攻略!

今天分享一个PMP备考经验&#xff0c;正在备考PMP的小伙伴&#xff0c;咱们共勉&#xff01; 第一周、阅读教材 之前是第六版教材&#xff0c;花了很长时间阅读和梳理框架。现在是第七版教材&#xff0c;内容少了很多&#xff0c;只有300多页&#xff0c;不会特别耗时间&…

offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)

前言&#xff1a;在我们学习结构体的时候&#xff0c;我们知道&#xff0c;结构体中的元素不一定是紧密排列的&#xff0c;其中有对其数和偏移量&#xff0c;那么有没有什么方法能直接输出某个元素的偏移量呢&#xff1f;答案是有的&#xff0c;我们只需要使用offsetof宏即可。…

网络安全之IP地址证书的重要性

在数字化时代&#xff0c;网络空间已成为各类活动的重要载体&#xff0c;无论是商业交易、信息交流还是远程办公&#xff0c;都离不开互联网的支撑。然而&#xff0c;网络环境的开放性与匿名性也带来了安全风险&#xff0c;如何确保网络交互中的身份真实可信&#xff0c;成为了…

13.Python图形用户界面

我们之前的程序运行结果都被输出到命令提示符&#xff08;终端&#xff09;窗口&#xff0c;界 面比较简陋。本章讲解如何将其输出到图形界面。 1 Python中的图形用户界面开发库 注Qt是一个跨平台的C应用程序开发框架&#xff0c;被广泛用于开发GUI 程序&#xff0c;也可用于开…

mysql 本地电脑服务部署

前提&#xff1a; 下载mysql 新建配置文档 在安装mysql目录新建 my.ini [mysqld] # 设置3306端口 port3306#设置mysql的安装目录 basedirC:\Program Files\MySQL\MySQL Server 8.3 #切记此处一定要用双斜杠\\,单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有…

探索AI技术创业的三大机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;行业解决方案 方向二&#xff1a;智能产品和服务 方向三&#xff1a;教育和培训 结语 我的其他博客 前言…

vant4的TextEllipsis 文本省略,禁用展开,收起方法

一、需求&#xff1a; 实现多行文本展示&#xff0c;规定大于3行&#xff0c;显示省略号...和查看全部按钮&#xff1b;&#xff08;并且考虑兼容性问题&#xff09; 二、效果图&#xff1a; 三、实现&#xff1a; 如果自己写样式的话&#xff0c;可以对照这个链接实现CSS 实…

C++ vector 动态 向量/数组

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

公司百度百科词条如何修改,五个公司百度百科词条修改技巧全揭秘!

当人们在搜索一个公司的信息时&#xff0c;通常会首先查找该公司的百度百科词条。作为一家公司&#xff0c;其百度百科词条的准确性和全面性对于公司形象的塑造至关重要。因此&#xff0c;如何修改公司的百度百科词条成为一项至关重要的任务。本文洛希爱做百科网将为您介绍公司…

uniapp创建opendb-city-china Schema文件后,如何导入城市的数据?

1.点击opendb-city-china后面的详情&#xff0c;进入到gitee代码仓库 2.下载如下图所示的data.json文件 3.将本地创建的opendb-city-china.schema.json上传到云端 4.点击导入json 如果直接将data.json导入会报错&#xff0c;如下图所示: 5.将data.json本来的数组对象&#…

日历插件fullcalendar【前端】

日历插件fullcalendar【前端】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件&#xff0c;删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…