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 学习笔记
Mar 05 Javascript
JQuery.Ajax之错误调试帮助信息介绍
Jul 04 Javascript
jquery简单的拖动效果实现原理及示例
Jul 26 Javascript
js实现仿Discuz文本框弹出层效果
Aug 13 Javascript
详解Vue生命周期的示例
Mar 10 Javascript
vue--vuex详解
Apr 15 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
什么时候不能在 Node.js 中使用 Lock Files
Jun 24 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 Javascript
JS合并两个数组的3种方法详解
Oct 24 Javascript
Vue接口封装的完整步骤记录
May 14 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
默默小谈PHP&MYSQL分页原理及实现
2007/01/02 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
用户注册常用javascript代码
2009/08/29 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
编写Python CGI脚本的教程
2015/06/29 Python
Python实现截屏的函数
2015/07/26 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
房产代理公证处委托书
2014/04/04 职场文书
支部组织生活会方案
2014/06/10 职场文书
班级文化建设标语
2014/06/23 职场文书
励志演讲稿800字
2014/08/21 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书