news 2026/7/3 10:36:48

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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' //鼠标悬浮到某条线时,其他线淡化 }, }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/28 23:50:32

手机拍照片的开挂功能:AI魔法表情,一键就能拯救废片啦!

你是否有过这样的经历?旅行打卡时被阳光晃得眼睛睁不开,朋友聚会合照有人闭眼或表情不佳,小朋友开心的笑容没来得及定格……许多精彩的摄影场景,一张张本该完美的照片因“表情翻车”就此留下遗憾。不用慌,华为手机里图…

作者头像 李华
网站建设 2026/7/1 15:53:22

Meta Llama模型访问权限申请与使用指南

Meta Llama模型访问权限申请与使用指南 【免费下载链接】llama Inference code for LLaMA models 项目地址: https://gitcode.com/gh_mirrors/ll/llama Meta Llama系列大语言模型作为业界领先的开源AI解决方案,其强大的文本生成和推理能力吸引了全球开发者的…

作者头像 李华
网站建设 2026/6/30 10:21:22

未来 AIDC 基础设施规范沙龙成功举办

GCC-Open AI Infra社区成立一个月以来,机房基础设施、AI整机柜在内的4个项目群正有序运行。到目前为止,基础设施项目群已经启动了机房液冷、机房供配电、DC智能化等项目;AI整机柜规项目组已经启动了供电、散热、高速互联等项目;板…

作者头像 李华
网站建设 2026/7/2 21:48:05

从EtherNet/IP到DeviceNet:一场驱动智能仓储升级的“协议融合”实践

从EtherNet/IP到DeviceNet:一场驱动智能仓储升级的“协议融合”实践1. 项目背景:智能仓储升级的异构网络之困近年来,国内某大型电商区域配送中心面临仓储自动化升级需求。现场控制系统核心为三套罗克韦尔ControlLogix系列PLC(采用…

作者头像 李华
网站建设 2026/7/2 4:01:02

数据升级 | CnOpenData 2000-2024年中国企业环保行政处罚数据

一、数据简介中国企业环保行政处罚数据库系统收录了由中国各级生态环境部门依法公开的企业环保行政处罚记录,涵盖全国各省、市、区(县)的企业违规处罚信息。该数据库包含公开日期、被处罚方名称、所属地区、处罚类型、处罚结果、罚款金额、违…

作者头像 李华
网站建设 2026/7/1 20:06:08

Segment Anything Model(SAM)介绍

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 文章目录概要SAM的定义SAM的网络架构任务设计模型设计数据引擎和数据集SAM的结构对任何 10 亿个掩模数据集进行分割SAM 如何支持现实生活…

作者头像 李华