博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[D3] Animate Chart Axis Transitions in D3 v4
阅读量:5775 次
发布时间:2019-06-18

本文共 2648 字,大约阅读时间需要 8 分钟。

When the data being rendered by a chart changes, sometimes it necessitates a change to the scales and axes of the chart as well. This lesson demonstrates how to animate and synchronize axis transitions on a column chart.

 

var svg = d3.select('.chart')    .append('svg')    .attr('width', width + margin.left + margin.right)    .attr('height', height + margin.top + margin.bottom)    .call(responsivefy)    .append('g')    .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')');/** * Y axis */const yScale = d3.scaleLinear()    .domain([        0, 100    ])    .range([height, 0]);const yAxis = svg    .append('g')    .call(d3.axisLeft(yScale));/** * x axis */const xScale = d3.scaleBand()    .domain(data.map(d => d.name))    .range([0, width])    .padding(0.2);const xAxis = d3.axisBottom(xScale).tickSize(10).tickPadding(5);svg.append('g')    .attr('transform', `translate(0, ${height})`)    .call(xAxis)    .selectAll('text')    .attr('text-anchor', 'end')    .attr('transform', 'rotate(-45)');// enter: which in the data, but not yet on the page// upate: which in the data, and also in the page// exit: which not in the data, but exist on the page// endfunction render(subject = 'math') {    // Define a resuable transation variable    var t = d3.transition().duration(1000);    var update = svg.selectAll('rect')        .data(data.filter(d => d[subject]), d => d.name); //d => d.name is a uniq idientifier    // First: we want to remove the existing object which doesn't have any value    // Get rid of null value object    // Also animation y and height attr to produce    // fade out effect     update        .exit()        .transition(t)        .attr('y', height)        .attr('height', 0)        .remove();    // Update the y axis with animation    yScale.domain(        [0, d3.max(data, d => d[subject])]    );    yAxis        .transition(t)        .delay(1000)        .call(d3.axisLeft(yScale));    // Second, we want to animate the existing elements height        update        .transition(t)        .delay(1000)        .attr('y', d => yScale(d[subject]))        .attr('height', d => height - yScale(d[subject]));    // Last, for the new data which is not in the page before    // We want to animate        update        .enter()        .append('rect')        .attr('y', height)        .attr('height', 0)        .attr('x', d => xScale(d.name))        .attr('width', d => xScale.bandwidth())        .transition(t)        .delay(update.exit().size() ? 2000 : 0) // If page refresh, we don't want to wait 2000ms        .attr('y', d => yScale(d[subject]))        .attr('height', d => height - yScale(d[subject]));}render();

 

 

 

转载地址:http://fkeux.baihongyu.com/

你可能感兴趣的文章
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
java中关于重载与重写的区别
查看>>
最受欢迎的14款渗透测试工具
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
黑马day11 不可反复度&解决方式
查看>>
分布式服务化系统一致性的“最佳实干”--转
查看>>
一次Mutex死锁的原因探究
查看>>
flask的文件上传和下载
查看>>
如何查看java class文件的jdk版本
查看>>