D3实现折线绘制动画的三种方法

想要用d3实现常见的折线绘制动画,找了找没有现成的库可以用。于是,自己结合svg的一些资料和d3的transition想了三种实现方法。总体是两类思路一类是是遮盖折线如用rect遮盖,通过clip-path修改可视区域遮盖,另外一类是通过修改折线的样式实现,如用stroke-dasharray和stroke-dashoffset。完整的demo代码在本文最后的gitHub链接中给出。
摘要由CSDN通过智能技术生成


引言

想要用d3实现常见的折线绘制动画,找了找没有现成的库可以用。于是,自己结合svg的一些资料和d3的transition想了三种实现方法。总体是两类思路一类是是遮盖折线如用rect遮盖,通过clip-path修改可视区域遮盖,另外一类是通过修改折线的样式实现,如用stroke-dasharray和stroke-dashoffset。完整的demo代码在本文最后的gitHub链接中给出。
效果图如下:
在这里插入图片描述

法一、用rect遮蔽

最朴素的思路是利用svg 后一个元素显示位于前一个元素之上的性质,用一个和背景色相同的矩形先遮盖住绘制好的折线,用transition 慢慢移动矩形到坐标轴外。实现视觉上的折线绘制动画
绘制过程:

  1. 先完全遮住(黑色矩形代表程序中的rect元素)
    在这里插入图片描述
  2. 移动遮盖矩形
    在这里插入图片描述

实现代码:

let num = 20
  let dataset = []
  let w = 500
  let h = 200
  let padding = 30
  //随机生成初始值
  for (let i = 0; i < num; i++) {
   
    let tevalue = Math.random() * 1000
    let temp = {
   
      id: i,
      value: tevalue
    }
    dataset.push(temp)
  }
  var key = function (d) {
   
    return d.id;
  };

  //x轴就是每个点等宽
  let xScale = d3.scaleBand()
    .domain(d3.range(num))
    .range([padding, w - padding])
    .paddingInner(0.05)

  //y将实际值转化到整个画布上
  let yScale = d3.scaleLinear()
    .domain([0, d3.max(dataset, d => d.value)])
    .rangeRound([h - padding, padding])

  let svg = d3.select('body')
    .append('svg')
    .attr('width', w)
    .attr('height', h);

  let polyLine = svg.append("path")
  //在path后面创建遮蔽用的与背景同色的白色矩形
  let rect = svg.append('rect')
    .attr("class", "shield_rect")
    .attr("x", padding)
    .attr("y", 0)
    .attr("width", w - padding * 2)
    .attr("height", h - padding)
    .style("fill", "white")

  let line = d3.line()
    .x((d, i) => {
    return (xScale(i) + xScale.bandwidth() / 2) })
    .y(d => yScale(d.value) - 1
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值