基于d3.js实现自定义多Y轴折线图的完整指南

作者:橙子时间:2026-10-22 14:58:26浏览:364

本文介绍如何使用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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章