d3.js制作条形时间范围选择器

此文章为原创文章,原文地址:https://www.cnblogs.com/eagle1098/p/12146688.html

效果如上图所示。

本项目使用主要d3.js v4制作,可以用来选择两年的时间范围,两端按钮切换年,在时间轴上标注可以选择的时间范围和关键时间点。时间数据可以在前端配置,也可以从后端请求。

此程序相对比较简单,主要涉及d3的比例尺和拖动处理。

1)d3的比例尺其实就是把一个范围的数据映射到另一个范围的数据上

此处,我们使用线性比例尺:d3.scaleLinear()

它可以把一段连续的值域映射到另一段连续的值域,比如

1 var scale = d3.scaleLinear()
2    .domain([0, 730])
3    // startPos是时间横条的开始x坐标,endPos是结束x坐标
4    .range([startPos, endPos]);

如果我们想知道两年中的具体某天在时间横条上对应点的x坐标,就可以把天数作为参数传给scale(),返回值就是对应的x坐标。

当然,d3.js中还有很多其他比例尺,详细信息可以查询API文档:https://github.com/d3/d3-scale#scaleLinear

此文章为原创文章,原文地址:https://www.cnblogs.com/eagle1098/p/12146688.html

2)我们这里的拖动主要分两部分,首先是单独拖动滑块,然后是两个滑块一起拖动。

单独拖动滑块的逻辑:

a.如果两个滑块被同时拖动过,则移除两个滑块间的黄线。

b.使用class名称来判断拖动的是哪个滑块。

c.计算鼠标x坐标,然后用比例尺反向求出对应的天数位置。

// xPos为x轴坐标
var index = scale().invert(xPos);

d.移动对应滑块到鼠标位置。

var dragFun = function () {
      // 移除拖拽连线元素
      if (stickDragLine) {
        stickDragLine.remove();
        stickDragLine = null;
      }
      // 获得被点击元素class
      var className = d3.select(this).attr(‘class‘);
      // 计算鼠标x坐标,要减去滑块宽度的二分之一
      var pos = d3.event.x - slipBlockWidth / 2;
      // 计算鼠标index,
      var index = getIndex(pos);
      var blockIndex;

      // 当前块位置,可以配置默认位置,也可从后端请求
      if (className === ‘slip-left‘) {
        blockIndex = splitBlockIndex.left;
      }
      if (className === ‘slip-right‘) {
        blockIndex = splitBlockIndex.right;
      }
      // 滑块只能在0到maxIndex之间滑动,即上层横条内
      if (blockIndex >= 0 && blockIndex <= maxIndex) {
        if (className === ‘slip-left‘) {
            // 移动左滑块和相关背景和文字到鼠标位置
            changeLeftBlock(index);
        }
        if (className === ‘slip-right‘) {
            // 移动左滑块和相关背景和文字到鼠标位置
            changeRightBlock(index);
        }
}
// 滑块拖动
var slipBlockDrag = d3.drag()
      .on(‘drag‘, dragFun);
// 滑块元素调用拖拽方法
slipBlockLeft.call(slipBlockDrag);
slipBlockRight.call(slipBlockDrag);

两个滑块一起拖动则在它们中间增加1个黄色连线。最后使用时间条元素调用拖拽方法。

  // 主横条上处理两个滑块一起拖动事件
    var stickDrag = d3.drag()
      .on(‘drag‘, function () {
        // 计算移动前两个滑块位置
        var leftEventX = scale(splitBlockIndex.left),
          rightEventX = scale(splitBlockIndex.right);
        if (d3.event.x > rightEventX || d3.event.x < leftEventX) {
          return;
        }
        // 添加拖动线条
        if (!stickDragLine) {
          stickDragLine = _stickG.append(‘line‘)
            .attr(‘x1‘, leftEventX + 2)
            .attr(‘y1‘, stickTop + stickHeight / 2)
            .attr(‘x2‘, rightEventX + 2)
            .attr(‘y2‘, stickTop + stickHeight / 2)
            .attr(‘stroke-width‘, 1)
            .attr(‘stroke‘, ‘yellow‘);
        }
        // 移动后的x
        var leftAfterX = leftEventX + d3.event.dx,
          rightAfterX = rightEventX + d3.event.dx,
          // 移动后的index
          leftIndex = Math.floor(scale().invert(leftAfterX)),
          rightIndex = Math.floor(scale().invert(rightAfterX));
        if ((leftIndex >= 0 && rightIndex < maxIndex) &&
          (rightIndex >= 0 && leftIndex < maxIndex)) {
          // 保存移动后的index
          splitBlockIndex.left = leftIndex;
          splitBlockIndex.right = rightIndex;
          // 移动各元素
          changeLeftBlock(leftAfterX, splitBlockIndex.left);
          changeRightBlock(rightAfterX, splitBlockIndex.right);
          stickDragLine
            .attr(‘x1‘, leftAfterX + 2)
            .attr(‘x2‘, rightAfterX + 2);
        }
      });
    _stickG.call(stickDrag);

文中代码用来说明逻辑结构,具体功能函数实现起来很容易,所以没有给出。

此文章为原创文章,原文地址:https://www.cnblogs.com/eagle1098/p/12146688.html

原文地址:https://www.cnblogs.com/eagle1098/p/12146688.html

时间: 2024-10-17 06:05:13

d3.js制作条形时间范围选择器的相关文章

【 D3.js 入门系列 --- 9.6 】 打包图的制作

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 打包图( Pack ),用于包含与被包含的关系,也表示各个对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者. 先看本节所使用的数据:  city2.json 这是各城市所属关系的数据.我们现在要用 D3 的 layout 来转换数据,使其容易进行可视化处理. var pack = d3.layout.pack() .size([ width, heigh

【 D3.js 入门系列 --- 9.5 】 树状图的制作

这一节学习树状图的制作.树状图的制作和集群图完全相同,经过这两种 layout 转换后的数据也很相似. 本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 树状图( Tree )通常用于表示层级.上下级.包含与被包含关系.树状图的制作和 9.4节集群图的制作 的代码几乎完全一样.不错,你没看错,几乎完全一样.那么为什么要把这两种图分开,它们有什么不同呢?先来看看对于同一组数据,它们的结果有什么不同.数据为: {

【 D3.js 入门系列 --- 9.3 】 弦图的制作

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 弦图( Chord ),主要用于表示两个节点之间的联系.如下图: 两点之间的连线表示,谁和谁具有联系: 线的粗细表示权重: 上面的介绍源于: http://circos.ca/guide/tables/  ,我就不详细介绍了,还是很好理解的. 那么在 D3 中怎么用 layout 转换出弦图所需要的数据,并作图呢?请耐心往下看. 1. 首先给出数据 var ci

D3.js使用过程中的常见问题(D3版本D3V4)

目录 一.学习D3我必须要学习好SVG矢量图码? 二.如何理解D3给Dom节点绑定数据时的Update.Enter和Exit模式 三.D3绑定数据时用datum与data有什么不一样? 四.SVG图中用attr来设置属性和用style来设置样式时,用style来设置样式的权重会更高 五.D3使用链式写法时,写完transition动画后不能链着继续写append添加元素操作 六.如何给path设置缓动? 七.D3普通的缓动动画 八.给节点添加title,鼠标mouseover显示普通提示文本效果

D3.js系列 --- 初识

D3.js(Data-Driven Documents)即被数据驱动的文档,它是一个用于根据数据来操作文档的JavaScript库.相比于echart, antv等其他图表库,它算是一个比较底层的数据可视化工具.它不提供任何一种现成的图表,只做最基础的东西,所有的图表都需要我们在它的库里挑选合适的方法进行构建.在一切即数据的今天,我们更需要做到让数据活起来,展现数据之美. 简介 犹抱琵琶半遮面,千呼万唤中终于要接触数据可视化了.数据可视化越来越流行,让复杂的数据和文字变得十分容易理解.作为其中的

【 D3.js 入门系列 — 11 】 入门总结

D3 新专题首页 一转眼,这个入门系列已经积累了二十二篇文章之多,我想作为 D3.js 这款数据可视化工具的入门来说已经足够了.相信仅仅要看完本系列.以后全然能够在辅以查询的情况下完毕大部分可视化工作. D3.js 最早的 v1.0 版本号是由 Michael Bostock 于2011年2月18日公布,其后经过多人的不断完好,眼下最新的版本号为 v3.4.11.从公布至今三年多的时间里,D3.js 在国外不断有人尝试并制作教程.成为了流行的数据可视化工具.可是眼下在国内能查询到中文资料还比較少

[6] D3.js中如何让图表动起来

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. [5.1]节中制作了一个比较完善的图表,但它是静态的,想做出它的动态效果吗?在D3中只需要短短的几行代码即可. 这一节将涉及4个函数的使用. 1.transition() 启动转变效果只需要添加这个即可.把它加到两种状态之间,例如: .attr("fill","red") .transition() .attr("fill

【 D3.js 入门系列 --- 10 】 地图的绘制

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 地图的制作在 D3 中可以说是最重要的一环.因为在进行数据可视化时,很多情况都会和地图联系在一起,如中国各省的人口多少,GDP多少等,都可以和地图联系在一起. D3 中制作地图所需要的文件问 JSON 文件.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.关于 JSON 的语法格式,可以在: http://www.w3s

【 D3.js 高级系列 — 9.0 】 交互式提示框

一般来说,图表中不宜存在过多文字.但是,有时需要一些文字来描述某些图形元素.那么,可以实现一种交互:当用户鼠标滑到某图形元素时,出现一个提示框,里面写有描述文字.这是一种简单.普遍的交互式,几乎适用于所有图表.通过可给提示框定制外观,能给用户带来很好的体验. 1. 提示框的制作思路 提示框,就是"文字"加"边框".显示文字,一般来说用 SVG 的<text>,但是,有两个问题: 如果字符串过长,<text>元素不能自动换行,虽然可以通过<