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中处理带有命名空间的XML数据
Jun 13 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
深入解读JavaScript中的Hoisting机制
Aug 12 Javascript
jQuery之动画效果大全
Nov 09 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 jQuery
webpack下实现动态引入文件方法
Feb 22 Javascript
vue watch深度监听对象实现数据联动效果
Aug 16 Javascript
原生JS实现简单的无缝自动轮播效果
Sep 26 Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 Javascript
js实现拖拽元素选择和删除
Aug 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php 过滤器实现代码
2010/08/09 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
学python需要去培训机构吗
2020/07/01 Python
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
美国在线购物频道:Shop LC
2019/04/21 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
实习期自我鉴定
2013/10/11 职场文书
专科毕业生学习生活的自我评价
2013/10/26 职场文书
计算机系毕业生推荐信
2013/11/06 职场文书
情侣吵架检讨书
2014/02/05 职场文书
公益广告语集锦
2014/03/13 职场文书
cf收人广告词
2014/03/14 职场文书
剪彩仪式主持词
2014/03/19 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
先进党支部事迹材料
2014/12/24 职场文书
离职证明范本
2015/06/12 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL