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 相关文章推荐
xml 封装与解析(javascript和C#中)
Jul 26 Javascript
js写一个弹出层并锁屏效果实现代码
Dec 07 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
js 距离某一时间点时间是多少实现代码
Oct 14 Javascript
Kindeditor在线文本编辑器如何过滤HTML
Apr 14 Javascript
jquery过滤特殊字符',防sql注入的实现方法
Aug 17 Javascript
Angular2使用Augury来调试Angular2程序
May 21 Javascript
jQuery+ajax实现修改密码验证功能实例详解
Jul 06 jQuery
Angular指令之restict匹配模式的详解
Jul 27 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
Feb 11 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
php字符集转换
2017/01/23 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
详解Canvas事件绑定
2018/06/27 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
搞笑获奖感言
2014/01/30 职场文书
毕业实习评语
2014/02/10 职场文书
学校教研活动总结
2014/07/02 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
Redis分布式锁的7种实现
2022/04/01 Redis