d3.js实现自定义多y轴折线图

前言

需求是实现一个生命体征的体温单,x轴是时间线,y轴有多个体征项。效果不是特别复杂,但是行业特殊性,所以也没有现成可用的,所以用 d3.js 实现了一个多y轴的折线图。

基础

这张图只用了d3.js的一些最基本用法,数据量也比较小,所以也用不到多么牛逼的用法,只涉及到了比例尺scale,轴axis,画线和点,最后我添加了一个缩放效果。

效果

在线预览

936585-20180529162150001-956060180.png

具体实现

1.初始化一个svg作为容器,之后所有的点线面都是在这个容器里边画了

svg.select('#id')
    .append('svg')
    .attr('width', width)
    .attr('height', height)

2.定义比例尺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]);

3.定义轴 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;
  });

4.定义折线模板

// 折线模板
this.line = d3
  .line()
  .x(function (d) {
    return that.x(d.datetime);
  })
  .y(function (d) {
    return that.y(d.svgValue);
  });
  

5.以上就完成了画布的基本框架,剩下的事情就是数据渲染。

该表中,顶部的时间轴和左侧y轴是自定义加上的,首先在容器中分配出来两块区域用来画轴;再根据容器的宽高按比例具体实现。

源代码地址:

https://github.com/zhangxiongcn/multiple-Y-axis-line-chart

转载于:https://www.cnblogs.com/zhangxiongcn/p/9105674.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值