d3.js实现自定义多y轴折线图的示例代码


Posted in Javascript onMay 30, 2018

前言

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

基础

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

效果

在线预览

d3.js实现自定义多y轴折线图的示例代码

具体实现

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

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

Javascript 相关文章推荐
js获取url参数的使用扩展实例
Dec 29 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
javascript实现自动填写表单实例简析
Dec 02 Javascript
实例讲解jquery中mouseleave和mouseout的区别
Feb 17 Javascript
原生js实现可拖拽效果
Feb 28 Javascript
Node.js 8 中的 util.promisify的详解
Jun 12 Javascript
vue页面切换过渡transition效果
Oct 08 Javascript
js实现每日签到功能
Nov 29 Javascript
微信小程序提交form操作示例
Dec 30 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 Javascript
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
Oct 25 Javascript
详解javascript 正则表达式之分组与前瞻匹配
May 30 #Javascript
浅谈如何使用webpack构建多页面应用
May 30 #Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 #Javascript
Angular4 反向代理Details实践
May 30 #Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 #Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 #Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 #Javascript
You might like
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
php常用Stream函数集介绍
2013/06/24 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Sublime开发python程序的示例代码
2018/01/24 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
django 发送手机验证码的示例代码
2018/04/25 Python
python读写csv文件实例代码
2019/07/05 Python
Python坐标线性插值应用实现
2019/11/13 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
财务会计专业推荐信
2013/11/30 职场文书
带薪年假请假条
2014/02/04 职场文书
就业表自我评价分享
2014/02/06 职场文书
优秀纪检干部材料
2014/08/27 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
我收到了德劲DE1107
2022/04/05 无线电