当前位置: 首页 > news >正文

Echarts实现双Y轴,并设置刻度线对齐

在数据可视化场景中,双Y轴图表常用于展示具有不同量纲的数据。但默认配置下,左右Y轴的0刻度线、刻度线可能无法对齐,影响图表可读性。本文将详细介绍该功能的实现方法

1. 实现双Y轴

  • 一个Y轴时的 yAxis 是对象
yAxis: { type: 'value', name:'Y轴名称', },
  • 两个Y轴时的 yAxis 是数组,且要在series中指定yAxisIndex
yAxis : [{ type: 'value', name:'左侧Y轴名称', }, { type: 'value', name:'右侧Y轴名称', }], series: [{ name: '速度', type: 'line', smooth: true, data: [] }, { name: '钻进深度', type: 'line', smooth: true, yAxisIndex: 1, //存在多个Y轴时使用,重要!!! data: [] }]

2. 双Y轴0刻度线对齐

直接设置 yAxis 为数组,Y轴刻度线是不对齐的,因为它俩的数值范围不一样,且分割段数不一样,导致左右的刻度线不一致,不能重合在一起。

那么我们就设置相同的分割段数:

yAxis : [{ type: 'value', name:'左侧Y轴名称', max: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.ceil(absMax * 1.2); }, min: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.floor(-absMax * 1.2); }, splitNumber: 8, //y轴的分割段数 axisLabel: { formatter: function(value:any) { return value.toFixed(2); } }, }, { type: 'value', name:'右侧Y轴名称', max: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.ceil(absMax * 1.2); }, min: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.floor(-absMax * 1.2); }, splitNumber: 8, //y轴的分割段数 axisLabel: { formatter: function(value:any) { return value.toFixed(2); } }, }],

有最大值最小值,也有相同的分割段数,那么0刻度线就一致了。

但是此时,因为数据的原因,左右的刻度线有时会对不齐,如图

3. 双Y轴刻度线对齐

通过设置alignTicks: true属性,自动计算左右Y轴的刻度间隔,确保对齐效果。该属性仅对valuelog类型的坐标轴有效。

注:alignTicks属性需要ECharts v5.3.0+版本支持

yAxis : [{ type: 'value', name:'左侧Y轴名称', alignTicks: true, // 左右刻度线对齐 }, { type: 'value', name:'右侧Y轴名称', alignTicks: true, // 左右刻度线对齐 }],

这样左右的刻度线就都对齐了。

最终效果:

全部option:

let option = { grid: { top: '50px', left: '80px', right: '90px', }, legend: { bottom: 10, textStyle: { color: 'rgba(255,255,255,0.7)' }, data: ['速度', '钻进深度'] }, xAxis: { name: '时间', nameTextStyle: { padding: [0, 0, 0, 25] }, axisTick: { alignWithLabel: true, }, axisLine: { lineStyle: { color: 'rgba(255,255,255,0.7)', }, }, axisLabel: { formatter: function (value:any) { return value.replace(/\s/g, '\r\n'); } }, data: ['2025-12-17 09:57:21', '2025-12-17 10:57:21', '2025-12-17 11:57:21', '2025-12-17 12:57:21', '2025-12-17 13:57:21', '2025-12-17 14:57:21', '2025-12-17 15:57:21', '2025-12-17 16:57:21', '2025-12-17 17:57:21', '2025-12-17 18:57:21'] }, yAxis: [ { type: 'value', name: 左侧y轴, alignTicks: true, // 左右刻度线对齐 max: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.ceil(absMax * 1.2); }, min: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.floor(-absMax * 1.2); }, splitNumber: 8, //设置坐标轴的分割段数 axisLabel: { formatter: function(v:any) { return v.toFixed(2); } }, axisLine: { show: true, lineStyle: { color: 'rgba(255,255,255,0.7)', } }, splitLine: { lineStyle: { type: 'dashed', color: 'rgba(255,255,255,0.3)', } } }, { type: 'value', name: 右侧y轴, position: 'right', alignTicks: true, // 左右刻度线对齐 max: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.ceil(absMax * 1.2); }, min: (value:any) => { const {max, min} = value; const absMax = Math.max(Math.abs(max), Math.abs(min)); return Math.floor(-absMax * 1.2); }, splitNumber: 8, //设置坐标轴的分割段数 axisLabel: { formatter: function(v:any) { return v.toFixed(2); } }, axisLine: { show: true, lineStyle: { color: 'rgba(255,255,255,0.7)', }, }, splitLine: { lineStyle: { type: 'dashed', color: 'rgba(255,255,255,0.3)', } } } ], series: [{ name: '速度', type: 'line', smooth: true, data: [-1, 1, -1.1, 1.2, -0.92, 1, -1, 0.88, -0.87, 0.89] }, { name: '钻进深度', type: 'line', smooth: true, yAxisIndex: 1, //存在多个Y轴时使用 data: [-1.14, 8.15, -9.95, 1.14, -1.14, 1.14, -1.14, 8.15, -8.15, 8.15] }], emphasis: { focus: 'series' //鼠标悬浮到某条线时,其他线淡化 }, }
http://www.cnnetsun.cn/news/105625.html

相关文章:

  • DeeplxFile:突破文件翻译限制的终极解决方案
  • 针对机械设备行业一体化项目制管理解决方案
  • 别再问资质认证怎么查了!看这家公司如何用“大模型搜索”帮客户7天拿下高新认证
  • 【量子编程数据同步新突破】:如何在Q#和Python间无缝传递变量?
  • Java后端开发常见报错及解决方案:小白与大牛的问答故事
  • DeepSeek-V3实战指南:如何精准调优batch_size解决推理性能瓶颈
  • Docker Offload资源释放难题:5个你必须掌握的优化技巧
  • 全面封禁Cursor!又一家大厂,出手了~
  • 为什么你的量子模型总出错?VSCode调试面板告诉你真相
  • 【稀缺技术揭秘】:资深工程师都在用的Azure量子作业状态诊断流程
  • 免费视频增强神器:字节跳动SeedVR2让老视频秒变4K超清画质
  • VSCode Azure QDK 调试失败?(90%开发者都忽略的配置细节)
  • hsweb-framework Easy-ORM终极指南:企业级数据访问实战手册
  • 8、量子计算与技术发展:从理论根源到实际应用
  • 30、RTA API 详解:功能、使用与错误处理
  • 【量子开发效率提升10倍】:VSCode + Azure QDK标准项目模板深度解读
  • ExoPlayer直播优化终极指南:从卡顿诊断到性能提升的完整解决方案
  • 企微SCRM源码分享:源雀SCRM
  • 手把手带你打通Docker Scout+GitHub Actions集成测试全流程
  • 紧急通知:Azure QDK重大版本变更来袭,你的VSCode准备好了吗?
  • 【Azure CLI量子作业资源统计全攻略】:掌握高效资源监控的5大核心命令
  • Docker中调试Vercel AI SDK的3个隐藏技巧,90%开发者都不知道
  • VSCode + Qiskit 环境配置验证全攻略(从零到运行仅需8分钟)
  • 语雀文档备份完整指南:5分钟学会离线文档制作
  • LinearDesign深度解析:5大核心优势助力mRNA序列优化革命
  • Docker Offload任务分配实战精要(附高并发场景调优案例)
  • 窗口置顶功能:打造高效多任务工作环境
  • Docker权限校验全攻略,守护AI模型最后一道防线
  • 3步掌握APKMirror:终极安卓应用下载完全指南
  • 一维卡尔曼滤波实战指南:从理论到代码的完整实现