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 开发者应该注意的9个错误
May 03 Javascript
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
jquery 获取dom固定元素 添加样式的简单实例
Feb 04 Javascript
javascript常用的正则表达式实例
May 15 Javascript
js+jquery实现图片裁剪功能
Jan 02 Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 Javascript
react 组件传值的三种方法
Jun 03 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
Sep 02 Javascript
Vuex实现简单购物车
Jan 10 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中处理模拟rewrite 效果
2006/12/09 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php程序内部post数据的方法
2015/03/31 PHP
Ext 表单布局实例代码
2009/04/30 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
python实现目录树生成示例
2014/03/28 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
django中模板的html自动转意方法
2018/05/27 Python
Python绘图之柱形图绘制详解
2020/07/28 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
后勤部长岗位职责
2013/12/14 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
党校学习自我鉴定
2014/02/24 职场文书
实习推荐信
2014/05/10 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
学术研讨会主持词
2015/07/04 职场文书
优秀大学生申请书
2019/06/24 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python
MySQL系列之六 用户与授权
2021/07/02 MySQL