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的一些总结
Nov 03 Javascript
jQuery拖动图片删除示例
May 10 Javascript
js中将String转换为number以便比较
Jul 08 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Sep 04 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
jQuery实现的简单提示信息插件
Dec 08 Javascript
基于jQuery实现音乐播放试听列表
Apr 14 Javascript
JS异步加载的三种实现方式
Mar 16 Javascript
javascript实现下雨效果
Mar 27 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
Nov 30 Javascript
jquery实现动态改变css样式的方法分析
May 27 jQuery
详解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中常用数组处理方法实例分析
2008/08/30 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php二维码生成
2015/10/19 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
js创建对象的方式总结
2015/01/10 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python实现的简单万年历例子分享
2014/04/25 Python
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
Python常见的pandas用法demo示例
2019/03/16 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python属于软件吗
2020/06/18 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
后勤自我鉴定
2013/10/13 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
Spring Boot 实现 WebSocket
2022/04/30 Java/Android