echarts中设置双Y轴左右刻度线一致

本文详细介绍了如何在ECharts中设置两个独立的Y轴,确保它们的刻度线在视觉上保持一致,通过示例和代码展示了如何计算并设置合适的刻度间隔,适用于任务数和发送量的数据展示。

echarts中设置双Y轴左右刻度线一致

一、效果图

在这里插入图片描述

二、主要代码

 this.taskxAxis = []
 this.taskSeries = [[], []]

taskInit() {
     function calMax(arr) {
         var max = arr[0]
         for (var i = 1; i < arr.length; i++) {
             // 求出一组数组中的最大值
             if (max < arr[i]) {
                 max = arr[i]
             }
         }
         var maxint = Math.ceil(max / 10) // 向上取整
         var maxval = maxint * 10 // 最终设置的最大值
         return maxval // 输出最大值
     }
     var maxappreg = calMax(this.taskSeries[0]) //任务数值
     var maxactive = calMax(this.taskSeries[1]) //发送量值
     var interval_left = maxappreg / 5 //左轴间隔
     var interval_right = maxactive / 5 //右轴间隔

     this.taskEchartLine = echarts.init(this.$refs['taskLineChart'])
     window.addEventListener('resize', () => {
         this.taskEchartLine && this.taskEchartLine.resize()
     })
     this.taskOption = {
         tooltip: {
             trigger: 'axis',
             backgroundColor: '#fff', // 提示框背景
             formatter: params => {
                 return `
                 <div style="border:0;color:#666;text-align: left;width:150px">
                   <p style="color:#000"> ${params[0].axisValue}</p>
                     <div class="flex justify-content-space-between">
                         <div>
                             <span> 任务数:
                             ${(function () {
                                 if (params[0].data >= 10000) {
                                     return params[0].data / 10000 + '万'
                                 } else if (params[0].data < 10000) {
                                     return params[0].data
                                 }
                             })()}
                             </span>
                         </div>
                     </div>
                     <div class="flex justify-content-space-between">
                         <div>
                             <span> 发送量:
                             ${(function () {
                                 if (params[1].data >= 10000) {
                                     return params[1].data / 10000 + '万'
                                 } else if (params[1].data < 10000) {
                                     return params[1].data
                                 }
                             })()}
                             </span>
                         </div>
                     </div>
                   </div> `
             },
             axisPointer: {
                 type: 'shadow',
             },
         },
         color: ['rgb(65,169,203)', 'rgb(246,126,60)'],
         legend: {
             data: ['任务数', '发送量'],
             left: 'right',
             selectedMode: false, //取消图例上的点击事件
         },
         grid: {
             left: '3%',
             right: '4%',
             bottom: '3%',
             containLabel: true,
         },
         xAxis: {
             type: 'category',
             boundaryGap: false,
             data: this.taskxAxis,
         },
         yAxis: [
             {
                 type: 'value',
                 name: '任务数',
                 min: 0,
                 max: maxappreg,
                 splitNumber: 5,
                 interval: interval_left,
                 axisLine: {
                     //y轴
                     show: false,
                 },
                 axisTick: {
                     //y轴刻度线
                     show: false,
                 },
                 axisLabel: {
                     color: '#444343',
                     formatter: function (value, index) {
                         var value
                         if (value >= 10000) {
                             value = value / 10000 + '万'
                         } else if (value < 10000) {
                             value = value
                         }
                         return value
                     },
                 },
             },
             {
                 type: 'value',
                 name: '发送量',
                 min: 0,
                 max: maxactive,
                 splitNumber: 5,
                 interval: interval_right,
                 axisLine: {
                     //y轴
                     show: false,
                 },
                 axisTick: {
                     //y轴刻度线
                     show: false,
                 },
                 axisLabel: {
                     color: '#444343',
                     formatter: function (value, index) {
                         var value
                         if (value >= 10000) {
                             value = value / 10000 + '万'
                         } else if (value < 10000) {
                             value = value
                         }
                         return value
                     },
                 },
             },
         ],
         series: [
             {
                 name: '任务数',
                 type: 'line',
                 data: this.taskSeries[0],
             },
             {
                 name: '发送量',
                 type: 'line',
                 yAxisIndex: 1, //在单个图表实例中存在多个y轴的时候有用
                 data: this.taskSeries[1],
             },
         ],
     }
     this.taskEchartLine.setOption(this.taskOption)
 },

链接: https://blog.youkuaiyun.com/LzzMandy/article/details/79400141?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7

<think>我们正在解决Vue2中使用EChartsY线图时刻度线对齐的问题。根据引用[2]和引用[4],有两种主要方法:方法一:使用alignTicks属性(ECharts4.0+支持)方法二:手动设置min、max和interval,使两个Y的分隔段数相同,从而对齐刻度线。具体步骤:方法1:使用alignTicks(简单,推荐)在yAxis配置项中,将两个Y设置为数值(type:'value'),并设置alignTicks:true。注意:alignTicks只对'value'和'log'类型的有效。示例配置:```javascriptyAxis:[{//左侧第一个Ytype:'value',name:'水量',alignTicks:true,//开启刻度对齐axisLabel:{formatter:'{value}ml'}},{//右侧第二个Y(如果是Y,通常第一个在左侧,第二个在右侧,但这里要求集中在左侧?不过对齐原理相同)type:'value',name:'温度',alignTicks:true,//开启刻度对齐axisLabel:{formatter:'{value}°C'}}]```方法2:手动计算min,max和interval(当alignTicks不能满足需求时)步骤:1.分别计算两个系列的数据的最大值和最小值(注意,两个Y对应的数据系列不同)。2.根据最大值和最小值,确定一个合适的刻度间隔(interval)和分段数(例如分成5段或10段),使得两个Y刻度线数量相同。3.设置两个Y的min、max和interval。示例步骤(以两个Y都分成5段为例):假设左边Y的数据范围是[min1,max1],右边Y的数据范围是[min2,max2]。首先,对两个的最大值和最小值进行适当的取整(向上取整和向下取整),使得刻度线是整齐的数字。然后,计算每个的间隔:interval1=(max1-min1)/5interval2=(max2-min2)/5最后,设置yAxis:```javascriptyAxis:[{type:'value',min:min1,max:max1,interval:interval1,...},{type:'value',min:min2,max:max2,interval:interval2,...}]```注意:实际应用中,我们可能希望两个Y刻度线数量相同,但分段数不一定非要是5,可以根据实际情况调整。关键是要保证两个Y的分段数相同,这样刻度线就会对齐。引用[4]中提供了一个取整的例子:letmaxY=Math.ceil(Math.max(...list)/10)*10;letminY=Math.floor(Math.min(...list)/10)*10;我们可以类似地处理两个的数据。然而,手动计算并设置interval可能会比较繁琐,而且如果数据动态变化,需要重新计算。因此,优先推荐使用alignTicks。但是,注意:alignTicks需要ECharts版本4.0以上。在Vue2项目中,请确保安装的echarts版本符合要求。另外,根据用户需求,Y要集中在左侧?默认情况下,第一个Y在左侧,第二个Y在右侧。如果希望两个Y都在左侧,可以通过设置position属性来实现。例如,将第二个Y也放在左侧:```javascriptyAxis:[{type:'value',position:'left',name:'水量'},{type:'value',position:'left',//这样两个Y都会在左侧重叠,通常我们不希望重叠,所以需要调整偏移offset:40,//第二个Y向右偏移40像素,避免重叠name:'温度'}]```但是,刻度线对齐的问题与Y的位置无关,上述两种方法仍然适用。总结解决方案:1.使用alignTicks(推荐)2.手动设置min,max,interval(当alignTicks效果不佳或需要更精细控制时)下面给出一个完整的Vue2组件示例(使用alignTicks):</think>在 Vue2 中使用 ECharts 实现 Y 线图时,刻度线对齐问题可以通过以下两种方案解决: ### 方案一:使用 `alignTicks` 属性(推荐) 在 yAxis 配置中开启 `alignTicks: true`,ECharts 会自动对齐数值刻度线(仅对 'value' 和 'log' 类型有效): ```javascript yAxis: [ { type: 'value', name: '水量', alignTicks: true, // 开启自动对齐 axisLabel: { formatter: '{value} ml' } }, { type: 'value', name: '温度', alignTicks: true, // 开启自动对齐 axisLabel: { formatter: '{value} °C' } } ] ``` **[效果说明]** 此方案会自动计算刻度间隔,使两侧 Y 刻度线数量和位置保持一致[^2]。 ### 方案二:手动计算刻度范围 当自动对齐不满足需求时,可手动设置刻度范围: ```javascript // 计算第一个Y的范围(水量) const maxY1 = Math.ceil(Math.max(...waterData) / 10) * 10; const minY1 = Math.floor(Math.min(...waterData) / 10) * 10; // 计算第二个Y的范围(温度) const maxY2 = Math.ceil(Math.max(...tempData) / 5) * 5; const minY2 = Math.floor(Math.min(...tempData) / 5) * 5; // 配置yAxis yAxis: [ { type: 'value', min: minY1, max: maxY1, interval: (maxY1 - minY1) / 5 // 固定5段刻度 }, { type: 'value', min: minY2, max: maxY2, interval: (maxY2 - minY2) / 5 // 固定相同段数 } ] ``` **[关键步骤]** 1. 通过 `Math.ceil/Math.floor` 取整确保刻度为整数[^4] 2. 两侧 Y 使用相同的分段数(示例中均为 5 段) 3. 通过 `interval` 显式控制刻度间隔 ### 完整 Vue2 组件示例 ```vue <template> <div ref="chart" style="width: 600px; height: 400px"></div> </template> <script> import echarts from 'echarts' export default { mounted() { const chart = echarts.init(this.$refs.chart) chart.setOption({ tooltip: { trigger: 'axis' }, legend: { data: ['水量', '温度'] }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'] }, yAxis: [ { type: 'value', name: '水量(ml)', alignTicks: true, // 方案一 // min: minY1, max: maxY1, interval: interval1 // 方案二 }, { type: 'value', name: '温度(°C)', alignTicks: true, // 方案一 // min: minY2, max: maxY2, interval: interval2 // 方案二 } ], series: [ { name: '水量', type: 'line', yAxisIndex: 0, data: [120, 200, 150, 80, 70] }, { name: '温度', type: 'line', yAxisIndex: 1, data: [20, 25, 18, 22, 28] } ] }) } } </script> ``` ### 注意事项 1. **版本兼容**:`alignTicks` 需 ECharts 4.0+ 版本支持 2. **数据类型**:仅当 Y 均为数值(`type: 'value'`)时有效 3. **极端值处理**:当数据差异过大时,建议使用方案二手动控制范围 4. **位置调整**:若需 Y 集中在左侧,添加 `position: 'left'` 和 `offset` 参数[^1] > 两种方案均可实现刻度对齐,推荐优先使用 `alignTicks` 自动对齐,特殊场景再用手动计算方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值