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解决iframe高度自适应代码
Dec 20 Javascript
鼠标移到图片上变大显示而不是放大镜效果
Jun 15 Javascript
使用console进行性能测试
Apr 27 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
Require.js的基本用法详解
Jul 03 Javascript
在vue中,v-for的索引index在html中的使用方法
Mar 06 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
详解mpvue scroll-view自动回弹bug解决方案
Oct 01 Javascript
vuex存值与取值的实例
Nov 06 Javascript
js实现鼠标点击页面弹出自定义文字效果
Dec 24 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 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
zf框架的Filter过滤器使用示例
2014/03/13 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
PHP多维数组排序array详解
2017/11/21 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
jcrop基本参数一览
2013/07/16 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python实现批量监控网站
2016/09/09 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
对于Python深浅拷贝的理解
2019/07/29 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
五年级英语教学反思
2014/01/31 职场文书
房地产活动策划方案
2014/05/14 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
工伤事故证明
2014/10/20 职场文书
政风行风整改方案
2014/10/25 职场文书