最近接到一个需求,在满足规则下,实现类似这种展示效果,其实就是用图形反映数据(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);
}
}

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

  1. d3.js 之关联数据:data操作符

    数据可视化 在可视化工作中,一个基本出发点是将不同的数值映射到不同的可视化 元素的属性上,使其表现出各自不同的视觉特征. 比如:以数组中的每一个值为直径分别创建一个圆,我们得到三个圆: 在d3中,可视 ...

  2. 初探原生js根据json数据动态创建table

    初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...

  3. Js多国时间动态更新

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

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

    原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...

  5. Android零基础入门第67节:RecyclerView数据动态更新

    列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ...

  6. MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新

    MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新 关键代码: //发送数据通知 //from txwtech@163.com LRESULT CCommSampleDlg::O ...

  7. js将json数据动态生成表格

    今天开发中遇到需要展示动态数据的问题, 具体要求是后端传来的json字符串,要在前端页面以table表格的形式展示, 其实没啥难的,就是拼接table标签,纯属体力活,于是自己写了个呆萌,保存起来,以 ...

  8. highChart数据动态更新

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

  9. ngx-echarts 图表数据动态更新

    使用echarts绘制图表时,初次赋值数据正常展示,重新获取数据之后,图表没有跟着动态刷新.解决的办法是: html文件 <div echarts [options]="chartOp ...

随机推荐

  1. linux 软件包的组成部分

    软件包的组成部分 1. 二进制文件 比如:/bin, /sbin & /usr/bin, /usr/sbin & /usr/local/bin, /usr/local/sbin 2.库 ...

  2. SQL查询--关于查询的练习题

    下面的练习题出自LeetCode:https://leetcode-cn.com/problemset/database/,有兴趣的可以去上面刷刷题 练习题1:超过经理收入的员工  分析: 使用sql ...

  3. 一篇文章弄懂flex布局

     壹 ❀ 引 谈到flex布局,我不知道有多少人跟我一样,在本能的想到justify-content:center与align-items:center两条属性之后,除此之外的其它属性居然显得格外陌生 ...

  4. SVN基本使用

    1.把服务器的所有内容下载到本地 svn checkout 服务器地址 --username=使用者 --password=密码 2.添加文件 touch main.m(文件名) : 创建main.m ...

  5. IT兄弟连 Java语法教程 数据类型3

    字符型 在Java中,用于存储字符串的数据类型是char.然而,C/C++程序员要当心:Java中的char与C或C++中的char是不同的.在C/C++中,char的宽度是8位.而在Java中不是这 ...

  6. SpringBoot系列之配置文件占位符使用

    SpringBoot系列之配置文件占位符使用 Springboot占位符支持的有随机数和配置的值等等,本博客主要介绍的是随机数和获取属性配置值的简单用法 随机数获取 支持的写法有: ${random. ...

  7. 直接命令行中执行PHP代码(PHP CLI模式)

    一般执行PHP代码,需要把PHP代码写成一个文件,但是有时候查一些PHP配置没有这个必要,能不能直接执行PHP代码呢? 答案是可以的. 在命令行下,采用CLI方式执行PHP代码,这里列出几个常用的命令 ...

  8. Linux war包部署jenkins

    一.介绍Jenkins 1.Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Je ...

  9. keras RAdam优化器使用教程, keras加载模型包含自定义优化器报错 如何解决?

    本文首发于个人博客https://kezunlin.me/post/c691f02b/,欢迎阅读最新内容! python keras RAdam tutorial and load custom op ...

  10. ElasticStack的入门学习

    Beats,Logstash负责数据收集与处理.相当于ETL(Extract Transform Load).Elasticsearch负责数据存储.查询.分析.Kibana负责数据探索与可视化分析. ...