D3.js实现折线图的方法详解


Posted in Javascript onSeptember 21, 2016

前言

D3.js是一个帮助开发者操纵基于数据的文档的JavaScript类库,在《D3.js实现柱状图的方法详解》中已经给大家介绍过如何用D3.js来实现一个简单的柱状图了,今天我们来学习用D3.js来实现折线图,感兴趣的朋友们下面来一起看看吧。

折线图由坐标轴、线条和点组成。和实现柱状图一样,我们还是先把大概的画图框架搭起来,代码如下(别忘了添加D3.js):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>折线图</title>
    <style>
      .container {
        margin: 30px auto;
        width: 600px;
        height: 300px;
        border: 1px solid #000;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <svg width="100%" height="100%"></svg>
    </div>
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
    <script>
      window.onload = function() {
        var width = 600, height = 300;
        // SVG画布边缘与图表内容的距离
        var padding = { top: 50, right: 50, bottom: 50, left: 50 };
        // 创建一个分组用来组合要画的图表元素
        var main = d3.select('.container svg').append('g')
          // 给这个分组加上main类
          .classed('main')
          // 设置该分组的transform属性
          .attr('transform', "translate(" + padding.top + ',' + padding.left + ')');
      };
    </script>
  </body>
</html>

坐标轴的实现

要创建坐标轴,需要先创建比例尺。在《D3.js实现柱状图的方法详解》中提到过序数比例尺和线性比例尺,因为折线的点与点之间是存在连续的关系的,所以折线图的x轴和y轴我们都采用线性比例尺。

// 模拟数据
var dataset = [
  {x: 0, y: 11}, {x: 1, y: 35},
  {x: 2, y: 23}, {x: 3, y: 78},
  {x: 4, y: 55}, {x: 5, y: 18},
  {x: 6, y: 98}, {x: 7, y: 100},
  {x: 8, y: 22}, {x: 9, y: 65}
];
// 创建x轴的比例尺(线性比例尺)
var xScale = d3.scale.linear()
    .domain(d3.extent(dataset, function(d) {
      return d.x;
    }))
    .range([0, width - padding.left - padding.right]);
// 创建y轴的比例尺(线性比例尺)
var yScale = d3.scale.linear()
    .domain([0, d3.max(dataset,function(d) {
      return d.y;
    })])
    .range([height - padding.top - padding.bottom, 0]);
// 创建x轴
var xAxis = d3.svg.axis()
    .scale(xScale)
    .orient('bottom');
// 创建y轴
var yAxis = d3.svg.axis()
    .scale(yScale)
    .orient('left');
// 添加SVG元素并与x轴进行“绑定”
main.append('g')
    .attr('class', 'axis')
    .attr('transform', 'translate(0,' + (height - padding.top - padding.bottom) + ')')
    .call(xAxis);
// 添加SVG元素并与y轴进行“绑定”
main.append('g')
    .attr('class', 'axis')
    .call(yAxis);

这次我们模拟了一些点的数据来进行折线的绘制。d3.scale.linear()创建了线性比例尺,linear.domain()定义定义域,linear.range()定义值域。这里需要注意一下,因为SVG画布的y轴与传统认知上的y轴的方向是反着来的,所以在定义y轴的定义域和值域对应关系时,也需要反着来。d3.extent可以得到参数数组中的最大值和最小值,并以数组的形式返回。然后用d3.svg.axis()创建了两个坐标轴,把比例尺应用到它们上面,并且用axis.orient()设置了坐标轴的刻度尺的方向。最后,添加SVG元素,用call()把定义好的坐标轴与SVG元素联系起来。通过设置它们的transform属性来移动元素,使它们看起来像是一个坐标系。

D3.js实现折线图的方法详解

折线的实现

在D3.js中,需要先创建一个线的函数,然后由该函数得出的值赋给代表折线的path元素的d属性,才能绘制出折线。需要明确,line是一个函数,不是一个对象。

具体的代码如下:

// 添加折线
var line = d3.svg.line()
    .x(function(d) {
      return xScale(d.x)
    })
    .y(function(d) {
      return yScale(d.y);
    })
    // 选择线条的类型
    .interpolate('linear');
// 添加path元素,并通过line()计算出值来赋值
main.append('path')
    .attr('class', 'line')
    .attr('d', line(dataset));

这样做了以后,我们得到了如下图所示的一条线。

D3.js实现折线图的方法详解

点的实现

点其实就是一个个的圆,所以在这里我们用SVG里的circle元素来画点。

// 添加点
main.selectAll('circle')
    .data(dataset)
    .enter()
    .append('circle')
    .attr('cx', function(d) {
      return xScale(d.x);
    })
    .attr('cy', function(d) {
      return yScale(d.y);
    })
    .attr('r', 5)
    .attr('fill', function(d, i) {
      return getColor(i);
    });

在main元素中选择到所有的圆先“占位”(因为此时选择到的是一个空的集合,只是这个集合代表main中所有的圆),然后绑定dataset到此集合上,通过enter()append()搭配使用添加新的circle元素直到集合元素个数与dataset子元素个数相同为止。用比例尺计算出各圆的坐标并对其相关属性进行赋值,就完成了点的添加。

D3.js实现折线图的方法详解

总结

以上就是利用D3.js实现折线图的全部内容,希望这篇文章对大家的学习和工作能有所帮助。如果有疑问大家可以留言交流,小编还会陆续更新关于D3.js的文章,请大家继续关注三水点靠木。

Javascript 相关文章推荐
javascript实现密码强度显示
Mar 18 Javascript
js中unicode转码方法详解
Oct 09 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
May 03 Javascript
基于jquery实现弹幕效果
Sep 29 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
Oct 27 Javascript
详谈$.data()的用法和作用
Feb 13 Javascript
元素全屏的设置与监听实例
Nov 28 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
如何理解Vue的v-model指令的使用方法
Jul 19 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
ES6之Proxy的get方法详解
Oct 11 Javascript
Vue路由 重定向和别名的区别说明
Sep 09 Javascript
利用BootStrap弹出二级对话框的简单实现方法
Sep 21 #Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 #Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
Sep 21 #Javascript
D3.js实现柱状图的方法详解
Sep 21 #Javascript
AngularJS ng-style中使用filter
Sep 21 #Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
Sep 21 #Javascript
JS实现简单的tab切换选项卡效果
Sep 21 #Javascript
You might like
PHP概述.
2006/10/09 PHP
php 时间计算问题小结
2009/01/04 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
window.parent与window.openner区别介绍
2012/04/12 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
Python编写一个闹钟功能
2017/07/11 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
ECHT官方网站:男女健身服
2020/02/14 全球购物
八年级数学教学反思
2014/01/31 职场文书
陈欧的广告词
2014/03/18 职场文书
停车位租赁协议书
2014/09/24 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
客房部经理岗位职责
2015/02/02 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
长征观后感
2015/06/09 职场文书
欢送领导祝酒词
2015/08/12 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
数据库之SQL技巧整理案例
2021/07/07 SQL Server
全新239军机修复记
2022/04/05 无线电
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript