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 相关文章推荐
通过JAVASCRIPT读取ASP设定的COOKIE
Nov 24 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
早该知道的7个JavaScript技巧
Jun 21 Javascript
jQuery实现根据滚动条位置加载相应内容功能
Jul 18 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 Javascript
JS中静态页面实现微信分享功能
Feb 06 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
vue组件中实现嵌套子组件案例
Aug 31 Javascript
JSONObject与JSONArray使用方法解析
Sep 28 Javascript
Canvas三种动态画圆实现方法说明(小结)
Apr 16 Javascript
vue的项目如何打包上线
Apr 13 Vue.js
详解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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php excel类 phpExcel使用方法介绍
2010/08/21 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
Django时区详解
2019/07/24 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
基于opencv实现简单画板功能
2020/08/02 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
外贸采购员岗位职责
2014/03/08 职场文书
合作经营协议书
2014/04/17 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
Python基础之元编程知识总结
2021/05/23 Python
深入浅析Django MTV模式
2021/09/04 Python