基于d3.js实现自定义多Y轴折线图的完整指南
本文介绍如何使用d3.js实现包含多个Y轴的自定义折线图,适用于生命体征体温单等场景。文章详细讲解了SVG容器初始化、比例尺(scale)与坐标轴(axis)的定义方法,以及折线模板的构建。通过配置domain、range及ticks参数,实现时间轴与多体征数据的精准渲染,并支持缩放交互。
前言与需求背景
前言
业务需求是开发一张生命体征体温单,其中X轴代表时间线,Y轴包含多个体征指标。虽然图表结构并不复杂,但由于医疗行业的特殊性,市面上缺乏直接可用的解决方案,因此决定采用d3.js来构建这个多Y轴折线图。
基础
本图表仅使用了d3.js的基础功能,且数据量较小,无需复杂的高级特性。实现过程主要涉及比例尺(scale)、坐标轴(axis)、线条与点的绘制,最后还集成了缩放效果。
效果
在线预览

d3.js实现步骤详解
具体实现
第一步,初始化一个SVG元素作为绘图容器,后续所有的点、线、面图形都将绘制在该容器内部。
svg.select('#id')
.append('svg')
.attr('width', width)
.attr('height', height)
第二步,定义比例尺 scale 。需要设定定义域 domain 以显示刻度范围,以及值域 range 以对应实际数据的刻度映射。
// x轴以时间为刻度
this.x = d3
.scaleTime()
.domain([this.beginTime, this.endTime])
.range([0, this.width]);
// y轴按照像素值为刻度,所有数据需按照比例转换计算
this.y = d3
.scaleLinear()
.domain([0, this.height])
.range([this.height, 0]);
第三步,定义坐标轴 axis 和 axis 。坐标轴需与比例尺 scale 结合使用,并将比例尺作为参数传入 axis(scale) 函数中。
其中,ticks 参数表示刻度的数量,直接传入数值即可。需要注意的是,ticks 默认会选取 2,5,10 这三个数值中的一个;若传入其他数值,系统会根据实际尺寸寻找最接近的值(这涉及倍数处理,详细信息可查阅官方API文档)。
若需自定义刻度,可利用 tickValues([NO1,NO2,NO3...]) 方法实现; tickSize 用于设置刻度尺寸,将其设置为容器SVG的宽高,即可实现全图范围的标尺效果。
this.xAxis = d3
.axisTop(this.x)
// .ticks(d3.timeHour.every(4))
.tickValues(d3.timeHour.range(this.beginTime, this.endTime, 4))
.tickSize(this.height)
.tickFormat(function (d, i) {
// return d.getHours();
return;
});
this.yAxis = d3
.axisLeft()
.scale(this.y)
.tickValues(d3.range(0, this.height, this.height / 40))
.tickSize(-this.width)
.tickFormat(function (d, i) {
return;
});
第四步,定义折线模板。
// 折线模板
this.line = d3
.line()
.x(function (d) {
return that.x(d.datetime);
})
.y(function (d) {
return that.y(d.svgValue);
});
至此,画布的基本框架已搭建完成,接下来的工作主要是进行数据渲染。
该图表中,顶部的时间轴和左侧的Y轴均为自定义添加。首先在容器内划分出两个区域用于绘制坐标轴,然后根据容器的宽高比例具体实现绘制逻辑。
源代码地址:https://github.com/zhangxiongcn/multiple-Y-axis-line-chart
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
JS脚本在App中运行报错怎么解决
2026-11-04 23:11:03
JS怎么使用padStart方法给数字补零
2026-11-04 11:12:03
JS是什么意思?JavaScript全称及基本定义
2026-11-04 08:05:29
JS 使用 toFixed(1) 保留一位小数的基本用法与注意事项
2026-11-03 18:34:57
JS字符串转整数:parseInt与Number的区别及用法
2026-11-03 17:26:54
