前端/h5 D3.js实现根据数据动态更新图形/类似进度实时变化效果

最近接到一个需求,在满足规则下,实现类似这种展示效果,其实就是用图形反映数据(NK,一种干扰值)

运行后,它其实是不断在动的,每格都可能显示灰色或者彩色

这里一共是10个格子,每格代表一个范围边界,说明如下

规则:颜色条設定,共十格 N = 1 - 10,边界值 max value = 2^(N/2) 并取小数点第一位进行四舍五入,得到一组边界值:1/2/3/4/6/8/11/16/23/32,最后一格沒有上限=24~无限大
即是說,数值等于或大于24,到无限大,属于第十級(格)。另外,达到的格显示彩色,未达到的显示灰色

这里要解决2个问题

1.绘制图形

2.动态更新

技术栈:React+d3 v4

  <svg className="barChart1" ></svg>

1.绘制图形

 print = () => {

    const colors = [
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
      ‘#eeeeee‘,
    ]

    // 定义svg图形宽高,以及柱状图间距
    const svgWidth = 7 * colors.length
    const svgHeight = 20
    const barPadding = 2

    // 通过图形计算每个柱状宽度
    const barWidth = (svgWidth / colors.length)

    const svg = d3.select(‘.barChart1‘)
      .attr(‘width‘, svgWidth)
      .attr(‘height‘, svgHeight)

    const barChart = svg.selectAll(‘rect‘)
      .data(colors) // 绑定数组
      .enter() // 指定选择集的enter部分
      .append(‘rect‘) // 添加足够数量的矩形

      .attr(‘y‘, d => 0) // d为数据集每一项的值, 取y坐标
      .attr(‘height‘, 20) // 设定高度
      .attr(‘width‘, barWidth - barPadding) // 设定宽度
      .attr(‘transform‘, (d, i) => {
        const translate = [barWidth * i, 0];
        return `translate(${translate})`
      }) // 实际是计算每一项值的x坐标
      .style(‘fill‘, (d, i) => d)
  }

2.动态更新

 update = nkNum => {

    const colors = [
      ‘#40cc80‘,
      ‘#40cc80‘,
      ‘#40cc80‘,
      ‘#40cc80‘,
      ‘#FFFF00‘,
      ‘#FFFF00‘,
      ‘#FFFF00‘,
      ‘#f64b5d‘,
      ‘#f64b5d‘,
      ‘#f64b5d‘,
    ]

    console.log(nkNum, "nkNum")

    // NK顏色橫條設定,共十格 N = 1-10,max value = 2^(N/2) round to first digit,1/2/3/4/6/8/11/16/23/32,最後一格沒有上限=24~無限
    // 即是說,數值等於或大於24,到無限大,屬第十級
    // 没达到的,用#eeeeee表示,达到的用彩色表示

    colors.map((t, i) => {
      if (nkNum < Math.round(Math.pow(2, (i + 1) / 2))) {
        colors[i] = ‘#eeeeee‘
      }
    })
    const svg = d3.select(‘.barChart1‘)

    const barChart = svg
      .selectAll(‘rect‘)
      .data(colors)
      .style(‘fill‘, (d, i) => d)
  }

值得注意的是,这里我巧妙的利用了循环的索引来计算那一组数 1/2/3/4/6/8/11/16/23/32

Math.round(Math.pow(2, (i + 1) / 2)

3.调用

componentDidMount() {
    this.print();
 }
  componentDidUpdate(prevProps, prevState) {
    const {
      home: { nkNum },
    } = this.props;

    const {
      home: { nkNum: nkNumOld },
    } = prevProps;

    if (nkNum !== nkNumOld) {
      this.update(nkNum);
    }
  }

原文地址:https://www.cnblogs.com/ww01/p/12054327.html

时间: 2024-10-12 01:03:51

前端/h5 D3.js实现根据数据动态更新图形/类似进度实时变化效果的相关文章

Js多国时间动态更新

Js多国时间动态更新 点击下载

Android零基础入门第44节:ListView数据动态更新

经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是静态的,但在实际开发中,这些数据往往都是动态变化的,比如数据内容发生改变.增加几行.或者删除几行,这就涉及到ListView数据的更新问题. 接下来通过一个简单的示例程序来学习ListView的数据更新. 继续使用WidgetSample工程,在app/main/res/layout/目录下创建updatedata_layout.xml文件,在其中填充如下代码片段:

highChart数据动态更新

highChart官网上通过ajax加载数据的例子 上面是第一次生成图表的时候使用 我想动态更新,在已经生成的图表上动态更新 chartBS.series[0].setData(sugarListDataBefore); chartBS.series[0].name=beforeTimeName; chartBS.series[1].setData(sugarListDataAfter); chartBS.series[1].name=afterTimeName; chartBS.redraw(

leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)

前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet 的插件库,非常有用 内容概览 leaflet 实现地形剖面分析源代码 demo 下载 本篇 demo 利用 leaflet api 实现地形剖面分析,效果图如下: 完整demo源码见小专栏文章尾部:GIS之家leaflet小专栏 文章尾部提供源代码下载,对本专栏感兴趣的话,可以关注一波 原文地址:h

Android Fragment 数据动态更新的问题

在一个 Android 应用中,我使用  FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希望能够通过调用mAdapter.notifyDataSetChanged() 来触发 Fragment 页面使用新的数据调整或重新生成其内容,可是当我调用 notifyDataSetChanged() 后,发现什么都没发生. 搜索之后发现不止我一个人碰到这个问题,大家给出的解决办法五花八门,有些确

ListView数据动态更新

经常会用到数据与前台控件绑定相关的问题,一直知道要用委托(代理)但每次都忘,而且每次都百度了一遍又一遍,就是不长记性,这次一定好好记下来下次就不会忘了. 后台数据与前台绑定主要分为两步: 第一步把要绑定的数据定义为一个数据集合或对象绑定到List中,方便调用: public class TestCase:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string

JS实例之列表选中,实现类似好友列表选中效果

1 <head> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 3 <title>无标题文档</title> 4 <style type="text/css"> 5 *{margin:0px auto; padding:0px;} 6 #wai{width:100px; height:110

《D3.js数据可视化实战手册》即将上市!

内容提要 如今这个互联网时代,人们每天都生产海量的数据,如果直接面对这些数据,可能让人无从下手.将数据可视化,用形象立体的形式将其展现,有利于分析其中的关联,攫取可能存在的商业机会.本书意图通过大量的示例和代码,向读者讲述如何利用D3.js来实现数据可视化.只要您了解Javascript,就能完全掌握本书的内容. 本书一共13章,从如何搭建D3.js的开发环境开始,逐步介绍D3中的各种操作,包括选集.数据的初步处理.数据映射.坐标轴组件.动画过渡效果.SVG相关介绍.绘制图表.安排布局.可视化交

D3.js 整体展示篇

近期一段时间研究社会成员网络关系图的一些可视化展示,对大数据可视化这片荒漠一筹莫展的自己,幸好发现了D3这片充满活力的绿洲.我决定在这块宝地贪婪地大餐一番. 本文介绍主要来自官网翻译及用户使用后感想资料收集 D3.js是一个对数据(主要针对大数据)进行操纵使之实现可视化的JavaScript库. D3可以借助HTML.SVG和CSS等技术将数据展示出来. 通俗点,就是网页制图,生成互动图. 介绍D3的中文书籍如今 仅仅有 <数据可视化实战-使用D3设计交互式图表>,有兴趣大家能够看看 长处: