d3.js v4曲线图的拖拽功能实现Zoom
zoom缩放案例
源码:https://github.com/HK-Kevin/d...;
demo:https://hk-kevin.github.io/d3...;
原理:通过zoom事件来重新绘制x轴scale,同时获得此时scale,在zoom事件的时候调用函数,将每个数据点的xScale重新绘制一遍。
let data = [[{x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: ,y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }]]
//定义图表数据
let svg = d3.select("svg"),
margin = {top :,right:,bottom:,left:}, //设值绘图区的布局
areaWidth = svg.attr("width") - margin.left-margin.right,//获得绘图区的宽高
areaHeight = svg.attr("height") - margin.top - margin.bottom,
g = svg.append("g")//绘图区容器,所有的图形都放在这里面
.attr("transform",`translate(${margin.left},${margin.top})`)
.attr("width",areaWidth)
.attr("height",areaHeight)
let xScale =d3.scaleLinear()//添加x的尺度,线性的尺度
.domain([,])
.range([,areaWidth]);
let yScale = d3.scaleLinear()//添加x的尺度,线性的尺度
.domain([,])
.range([,areaHeight]) ;
let xAxis = d3.axisBottom(xScale) ;//添加底部坐标轴
let yAxis = d3.axisLeft(yScale) ;//添加左部坐标轴
let line = d3.line() //线生成器,就是把data的数据通过x,y的尺度转化为此坐标轴对应的数据
.curve(d3.curveStepAfter)
.x(function(d){
return xScale(d.x)
})
.y(function (d) {
return yScale(d.y)
});
let t =d3.transition()//定义动画
.duration() //持续时间
.ease(d3.easeLinear)//动画type
let xGrooup = g.append("g") //生成x轴
.attr("transform",`translate(,${areaHeight})`)
.call(xAxis)
let yGroup = g.append("g")//生成y轴
.attr("transform",`translate(,)`)
.call(yAxis)
g.append("clipPath") //添加一个剪切区,超出这个区的图形都不显示
.attr("id", "clip")
.append("rect")
.attr("width", areaWidth)
.attr("height", areaHeight);
let updateLine = g.append("g") //enter 、update、exit
.attr("class","chart")
.selectAll("line")
.data(data)
let enterLine = updateLine.enter();
let exitLine = updateLine.exit();
let path = enterLine.append("path")
.attr("clip-path", "url(#clip)")
.attr("class","line")
.attr("d",line)
.attr("fill","none")
.attr("stroke",)
.transition(t)
.attr("stroke-width",)
.attr("stroke","green")
exitLine.remove();
let zoom = d3.zoom() //设置zoom参数
.scaleExtent([, ]) //放大倍数
.translateExtent([[,], [areaWidth, areaHeight]])//移动的范围
.extent([[, ], [width, height]])
//视窗 (左上方,右下方),默认最近父级元素的[0,0],[width,height]
.on("zoom", zoomed); //zoom事件,调用zoomed函数
let zoomRect = svg.append("rect") //设置缩放的区域,一般覆盖整个绘图区
.attr("width",areaWidth)
.attr("height",areaHeight)
.attr("fill","none")
.attr("pointer-events","all")
.call(zoom);
function zoomed() {
let t = d3.event.transform.rescaleX(xScale) //获得缩放后的scale
xGrooup.call(xAxis.scale(t)) //重新设置x坐标轴的scale
g.select("path.line").attr("d", line.x(function(d){ //获取曲线,用新的x尺度来计算line
return t(d.x)}))
}
d3.js v4曲线图的拖拽功能实现Zoom的更多相关文章
- 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽
前言 关于讲解 JS 的拖拽功能的文章数不胜数,我确实没有必要大费周章再写一篇重复的文章来吸引眼球.本文的重点是讲解如何在某些特定的元素上禁止拖拽.这是我在编写插件时遇到的问题,其实很多插件的拖拽功能 ...
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
利用JavaScript(JS)实现一个九宫格拖拽功能 Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...
- 关于 JS 拖拽功能的冲突问题及解决方法
前言 我在之前写过关于 JS 拖拽的文章,实现方式和网上能搜到的方法大致相同,别无二致,但是在一次偶然的测试中发现,这种绑定事件的方式可能会和其它的拖拽事件产生冲突,由此产生了对于事件绑定的思考.本文 ...
- Js元素拖拽功能实现
Js元素拖拽功能实现 需要解决的问题 最近项目遇到了一个问题,就是用户某个操作需要弹出一个自定义的内容输入框,但是有个缺点,当浏览太大的时候没办法点击确认和取消按钮,应为这个弹出框是采用绝对定位的,取 ...
- vuejs2.0使用Sortable.js实现的拖拽功能
简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...
- vue2.0使用Sortable.js实现的拖拽功能
简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jQuery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...
- js进阶 12-17 jquery实现鼠标左键按下拖拽功能
js进阶 12-17 jquery实现鼠标左键按下拖拽功能 一.总结 一句话总结:监听的对象必须是文档,鼠标按下运行mousemove事件,鼠标松开取消mousemove事件的绑定,div的偏移的话是 ...
- vuejs2.0使用Sortable.js实现的拖拽功能( 转)
文章目录 简介 实现效果 html主要代码 css代码 js代码 简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是 ...
- 原生js拖拽功能制作滑动条实例教程
拖拽属于前端常见的功能,很多效果都会用到js的拖拽功能.滑动条的核心功能也就是使用js拖拽滑块来修改位置.一个完整的滑动条包括 滑动条.滑动痕迹.滑块.文本 等元素,先把html代码写出来,如下所示: ...
随机推荐
- 简单BBS项目开始(二)
登陆和生成图片验证码 1.生成图片 pillow 1.生成图片的模块pillow,在python中安装pillow,在Django中使用时用PIL2. 在页面上<img id="val ...
- Codeforces Round #567 (Div. 2) B. Split a Number
Split a Number time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- Linux - 文件的三种时间之atime、ctime、mtime的区别和简单用法
在Linux中,文件或者目录中有三个时间属性 atime ctime mtime 简名 全名 中文 作用 atime Access Time 访问时间 最后一次访问文件(读取或执行)的时间 ctime ...
- PHP7内核(四):生命周期之开始前的躁动
上一章我们对PHP的源码目录结构有了初步了解,本章我们继续从生命周期的维度对PHP进行剖析. 一.概览 生命周期是什么呢?你可以把它看作执行过程,PHP的生命周期也就是它从开始执行到结束执行的过程. ...
- RabbitMQ AMQP 事务机制
1,在之前的文章中介绍了RabbitMQ的五种队列形式 其中,在工作队列中,为了保证消费者的公平性,采用了channel.basicQos(1),保证了每次只发一条消息给消费者消费,并且使用手动签收的 ...
- sentry使用
开篇-Sentry是什么 Sentry是开源错误跟踪,帮助开发人员实时监控和修复崩溃.不断重复.提高效率.改善用户体验. 这篇文章的作用 记录这篇文章是想分享一下,因为本人在配置时因为邮件服务花费了很 ...
- 【每周小项目】使用 puppeteer 插件爬取动态网站
目录 0. 前言 问题 解决 1. 下载与引包 2. 使用步骤 3. 爬过的几个坑 page.evaluate 的传参问题 元素操作问题 0. 前言 这两天对爬虫开始感兴趣,最开始是源于天涯的一个房价 ...
- AbstractQueuedSynchronizer概述
AbstractQueuedSynchronizer 是一个用于在竞争资源(如多线程)时使用的同步器,它内部使用了一个int类型的字段status表示需要同步的资源状态, 并基于一个先进先出(FIFO ...
- HDU1398:Square Coins(DP水题)
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 深度解析Java中的5个“黑魔法”
现在的编程语言越来越复杂,尽管有大量的文档和书籍,这些学习资料仍然只能描述编程语言的冰山一角.而这些编程语言中的很多功能,可能被永远隐藏在黑暗角落.本文将为你解释其中5个Java中隐藏的秘密,可以称其 ...