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 相关文章推荐
jQuery对象与DOM对象之间的转换方法
Apr 15 Javascript
原生JavaScript实现连连看游戏(附源码)
Nov 05 Javascript
JavaScript输出当前时间Unix时间戳的方法
Apr 06 Javascript
js中实现字符串和数组的相互转化详解
Jan 24 Javascript
AngularJS教程之环境设置
Aug 16 Javascript
学习vue.js条件渲染
Dec 03 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
Jan 04 Javascript
javascript 正则表达式去空行方法
Jan 24 Javascript
canvas滤镜效果实现代码
Feb 06 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
Feb 27 Javascript
js提取中文拼音首字母的封装工具类
Mar 12 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 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将数据导入到Foxmail的实现代码
2010/09/05 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
Firefox window.close()的使用注意事项
2009/04/11 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
python中Apriori算法实现讲解
2017/12/10 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
pygame实现弹球游戏
2020/04/14 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
怎么写自荐书范文
2014/02/12 职场文书
法人授权委托书格式
2014/04/08 职场文书
技术入股合作协议书
2014/10/07 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
大学生自荐书范文
2015/03/05 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers