首页 > 其他分享 >vuejs+echarts实现x轴为时间轴且数据区域可缩放

vuejs+echarts实现x轴为时间轴且数据区域可缩放

时间:2023-12-28 15:56:00浏览次数:42  
标签:scale 轴为 缩放 interval else 3600 时间轴 intervalValue 1000

1、效果图

2、具体功能描述

①选择的时间为时间轴的开始和结束时间;

②鼠标可以左右拖动x轴时间轴;

③鼠标放入图表中可以缩放数据,x轴会相应的更改当前坐标轴间隔值,最小间隔值为1分钟,最大间隔值为1年,且在缩放时可以获取到数据窗口范围的起始数值;

④点击y轴名称会对相应数据显示隐藏。

3、实现

①结构代码:

<div id="echart" style="width:100%;height: 240px;" ></div> ②配置图表 data () {     return {       option:{         grid: {           show: true,           top: 15,           left: 100,           right: 30,           bottom:30,           backgroundColor:{             image:require('../../../../../assets/image/default/echart_bg.png')           },           borderWidth:0,         },         tooltip: {           trigger: 'item',           formatter:function(params){             return params.data[2] == 'transparent'?'':`${params.name}<br/>${params.data[0]}`           },         },         xAxis: {           type: 'time',           maxInterval: 3600 * 1000 * 24 * 30 * 12,//设置间隔最大值           minInterval:1000 * 60 * 2,//设置间隔最小值           axisLine: {             // 轴线             show: true,           },           axisTick: {             // 轴刻度             show: true,             alignWithLabel: true,           },         },         yAxis: {           data: [],           axisLine: {             // 轴线             show: false,           },           axisTick: {             // 轴刻度             show: false,           },           splitLine: {             // 网格线             show: true,             alignWithLabel: true,             lineStyle:{               color:'#ccc'             }           },           triggerEvent:{             show: true,//点击事件           },         },         series: [           {             type: 'scatter',             smooth: true,             symbol: 'circle',             symbolSize: 20,             sampling: 'average',             itemStyle:{               color:(val)=>{                 return val.data[2]               },               opacity:1             },             data: []           }         ],         dataZoom: [           {             type: 'inside',//内置型数据区域缩放组件             xAxisIndex: 0,             filterMode: 'filter',//过滤掉窗口外的数据             realtime: true,           },         ],       },       myChart:null,       dataList:[],//颜色集合       dataValue:[],//数据集合     };   }, ③初始化图表     initEchart() {       let that = this;       let scale = '1年';//间隔值       let queryTimePeriodLimit = {         startTime:null,         endTime:null,       }       // 基于准备好的dom,初始化echarts实例       this.myChart = this.$echarts.init(document.getElementById("echart"));       //this.ruleForm.spatialTrajectoryTime为时间范围选择值,如何存在则为时间轴起始值否则开始值为当前-8年结束值为当前+2年       if(this.ruleForm.spatialTrajectoryTime && this.ruleForm.spatialTrajectoryTime.length > 0 && this.ruleForm.spatialTrajectoryTime[0].queryTimePeriodLimit){         this.option.xAxis.min = new Date(this.ruleForm.spatialTrajectoryTime[0].queryTimePeriodLimit[0]).getTime();         this.option.xAxis.max = new Date(this.ruleForm.spatialTrajectoryTime[0].queryTimePeriodLimit[1]).getTime();       }else{         this.option.xAxis.min = new Date().getTime()-8*12*30*24*60*60*1000;         this.option.xAxis.max = new Date().getTime()+2*12*30*24*60*60*1000;       }   //获取当前间隔值       scale = that.handleTimeAndScale(this.option.xAxis.min,this.option.xAxis.max,'init');       // 绘制图表       this.myChart.setOption(this.option,true);       window.addEventListener("resize", () => {         that.myChart.resize();       });       this.$emit('getScale',scale,'init');//调用接口获取当前值渲染图表       this.myChart.on('dataZoom',function(params){         let startValue = parseInt(that.myChart.getModel().option.dataZoom[0].startValue);         let endValue = parseInt(that.myChart.getModel().option.dataZoom[0].endValue);         queryTimePeriodLimit.startTime = that.dateFormatter('yyyy-MM-dd HH:mm:ss',new Date(startValue));         queryTimePeriodLimit.endTime = that.dateFormatter('yyyy-MM-dd HH:mm:ss',new Date(endValue));         scale = that.handleTimeAndScale(startValue,endValue);         //缩放、拖动时间轴后调用接口获取当前值渲染图表       })       that.myChart.off('click');//先移除,再点击       that.myChart.on('click', function (params) {    //点击y轴         if(params.componentType == 'yAxis'){           that.dataList[params.tickIndex].clicked = !that.dataList[params.tickIndex].clicked;           that.dataValue.map((value,key)=>{             if(value[3] == params.dataIndex){               if(that.dataList[params.tickIndex].clicked){                 // 显示时间轴数据                 value[2] = that.colorList[params.dataIndex];               }else{                 // 隐藏时间轴数据                 value[2] = 'transparent';               }             }           })           that.myChart.setOption({yAxis:that.setYaxisIcon(that.dataList)});//设置y轴样式           that.myChart.setOption({series:that.option.series[0]});         }       });     },     // 渲染数据     getEchartsData(dataList){       let that = this;       let data = [];       this.dataValue = [];       this.dataList = dataList;       this.dataList.map((item,index)=>{         data.push(item.entityName+'-'+item.propertyTypeName);         if(item.locus && item.locus.length > 0){           item.locus.map((list,pre)=>{             if(list.locus && list.locus.length > 0 ){               list.locus.map((value,key)=>{       //第一个值为x轴值,第一个值为y轴名称,第三个值为颜色,第四个值为索引...需要什么值可在此位置添加                 that.dataValue.push([value.startTime,item.entityName+'-'+item.propertyTypeName,(item.clicked?(that.colorList[index]):'transparent'),index]);               })             }           })         }       })       that.option.yAxis.data = data;       that.setYaxisIcon(that.dataList);       that.option.series[0].data = that.dataValue;       that.myChart.setOption({yAxis:that.option.yAxis});       that.myChart.setOption({series:that.option.series[0]});     },  //在数据区域缩放时能获取数据窗口范围的起始数值,利用起始值可以获取到起始值的差值,根据差值的大小来设置当前的间隔值  //(由于x轴type为time所以x轴的scale值无效,获取不到比例尺所以想出此方法)   handleTimeAndScale(startValue,endValue,type){       let that = this;       let scale = '';       let intervalValue = null;       let interval = (endValue - startValue)/1000/60/60;       if(interval > 44336){         intervalValue = 3600 * 1000 * 24 * 30 * 12;         scale = '1年';       }else if(interval <= 44336 && interval > 27529){         intervalValue = 3600 * 1000 * 24 * 30 * 7;         scale = '6月';       }else if(interval <= 27529 && interval > 14127){         intervalValue = 3600 * 1000 * 24 * 30 * 4;         scale = '3月';       }else if(interval <= 14127 && interval > 8771){         intervalValue = 3600 * 1000 * 24 * 30 * 3;         scale = '2月';       }else if(interval <= 8771 && interval > 3381){         intervalValue = 3600 * 1000 * 24 * 30 * 1;         scale = '1月';       }else if(interval <= 3381 && interval > 2309){         intervalValue = 3600 * 1000 * 24 * 17;         scale = '16天';       }else if(interval <= 2309 && interval > 1095){         intervalValue = 3600 * 1000 * 24 * 8;         scale = '7天';       }else if(interval <= 1095 && interval > 511){         intervalValue = 3600 * 1000 * 24 * 5;         scale = '4天';       }else if(interval <= 511 && interval > 222){         intervalValue = 3600 * 1000 * 24 * 3;         scale = '2天';       }else if(interval <= 222 && interval > 125){         intervalValue = 3600 * 1000 * 24 * 1;         scale = '1天';       }else if(interval <= 125 && interval > 73){         intervalValue = 3600 * 1000 * 13;         scale = '12时';       }else if(interval <= 73 && interval > 37){         intervalValue = 3600 * 1000 * 7;         scale = '6时';       }else if(interval <= 37 && interval > 22){         intervalValue = 3600 * 1000 * 5;         scale = '4时';       }else if(interval <= 22 && interval > 12){         intervalValue = 3600 * 1000 * 3;         scale = '2时';       }else if(interval <= 12 && interval > 4.4){         intervalValue = 3600 * 1000 * 1;         scale = '1时';       }else if(interval <= 4.4 && interval > 3){         intervalValue = 1000 * 60 * 31;         scale = '30分钟';       }else if(interval <= 3 && interval > 2){         intervalValue = 1000 * 60 * 21;         scale = '20分钟';       }else if(interval <= 2 && interval > 1.5){         intervalValue = 1000 * 60 * 16;         scale = '15分钟';       }else if(interval <= 1.5 && interval > 1){         intervalValue = 1000 * 60 * 11;         scale = '10分钟';       }else if(interval <= 1 && interval > 0.5){         intervalValue = 1000 * 60 * 6;         scale = '5分钟';       }else if(interval <= 0.5 && interval > 0.2){         intervalValue = 1000 * 60 * 3;         scale = '2分钟';       }else if(interval <= 0.2){         intervalValue = 1000 * 60 * 2;         scale = '1分钟';       }       if(type && type == 'init'){         that.option.xAxis.interval = intervalValue;       }else{         that.myChart.setOption({xAxis:{interval:intervalValue}});       }       return scale     },  // 设置y轴图标     setYaxisIcon(nodes){       let that = this;       that.option.yAxis.axisLabel = {         formatter: function (value,index) {           return '{nodeName|' + (nodes[index].entityName.length>5?(nodes[index].entityName.slice(0,5)+'...'):nodes[index].entityName) + `}{${nodes[index].clicked?'image':'imageClicked'}|` + '}\n{propertyTypeName|' + (nodes[index].propertyTypeName.length>5?(nodes[index].propertyTypeName.slice(0,5)+'...'):nodes[index].propertyTypeName) + '}';         },         rich: {           nodeName:{             fontWeight:700,             padding: [0, 6 , 0 , 0],             align: 'left',             color:'#000'           },           image: {             width:14,             height: 14,             cursor: 'pointer',             backgroundColor: {               image: require('../../../../../assets/image/default/clickedEye.png'),             },           },           imageClicked: {             width:14,             height: 14,             cursor: 'pointer',             backgroundColor: {               image: require('../../../../../assets/image/default/clickEye.png'),             },           },           propertyTypeName: {             lineHeight: 30,             align: 'left',           },         },       }     },

标签:scale,轴为,缩放,interval,else,3600,时间轴,intervalValue,1000
From: https://www.cnblogs.com/wangyan0926/p/17932854.html

相关文章

  • vue3横向时间轴展示
    架子是用的vue3+elementPlus,要用到时间轴展示,但element组件只有竖着的,想要横着的,找了一圈没有合适的,终于找到个合适的,文章原址https://blog.csdn.net/m0_62949703/article/details/127800712数据结构: {date:'2023-09-27’,isShow:true,children:[......
  • aardio使用网页写界面,解决Ctrl+鼠标滚轮缩放界面
    在html里添加<metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">不起作用。通过添加web的启动参数,也不起作用翻遍谷歌,没解决最后在github上找到方法,从chrome扩展里找blockzoom插件,找到源代码看了一下,解决在html代码......
  • 移动端禁止浏览器强制缩放
    移动端H5页面加上 <metaname="viewport"content="width=device-width,user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> 还是会被浏览器强制缩放。使用下面的JS可以禁止此事件document.documentElement.addEventListener("touchstart&q......
  • 关于pyqt界面再不同分辨率和视图字体缩放和图片缩放得问题
    建议使用,这里说明一下,使用QApplication类或者QGuiApplication类进行设置都可以,因为QApplication继承自QGuiApplicationfromPyQt5.QtCoreimportQtfromPyQt5.QtGuiimportQGuiApplication######使用下面的方式一定程度上可以解决界面模糊问题--解决电脑缩放比例问题QApplic......
  • js实现以鼠标为中心缩放图片
    直接上代码,不解释<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</tit......
  • uniapp nvue 手指缩放
    uniapp nvue中俩个手指按下,每次只会监听到一个 uniapp 中双指缩放,touch.scale为当前的缩放比例<template> <[email protected]="move"@touchmove.stop="moving"> {{touch.scale}} </view></template><script>exportdefault{......
  • 【scikit-learn基础】--『预处理』之 数据缩放
    数据的预处理是数据分析,或者机器学习训练前的重要步骤。通过数据预处理,可以提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集提高数据性能,对数据的值进行变换,规约等(比如......
  • Vue后台项目开发必备:全面解析分辨率适配与网页缩放技巧!
    1.各屏幕分辨率下适配展示首先给大家展示一下我的屏幕分辨率兼容效果,方便大家来判断我的适配方案是否可行正常1920*1080100%1920*1080150%1440*900100%1440*900150%2.屏幕分辨率适配方案这里就不再过多举例了,通过这四张图可以看出来页面布局并没有受到过多的影响,所以直接上代......
  • Vue后台项目开发必备:全面解析分辨率适配与网页缩放技巧!
    1.各屏幕分辨率下适配展示首先给大家展示一下我的屏幕分辨率兼容效果,方便大家来判断我的适配方案是否可行正常1920*1080100%1920*1080150%1440*900100%1440*900150%2.屏幕分辨率适配方案这里就不再过多举例了,通过这四张图可以看出来页面布局并没有受到过多的影响,所以直接上代......
  • 赛博灯泡:Win10/11 设置屏幕缩放 500% 的还原方法(全称键盘,不用鼠标)
    近期注意到因误操作将屏幕缩放设置为500%后无法还原的情况,因为网上有人提出此问题,而其他人尝试复现时也无法解决了,这里给出一种可能的解决办法。因为不同人的分辨率是不一样的,有些电脑分辨率设置的不高,如果低于900P的话有可能界面是显示不完整的,此时无法使用鼠标操作,所以还是......